聊天室项目—mysql建表

用户信息(user_data)

在这里插入图片描述

id:用户id
name:用户名
password:密码
state:在线状态 在线1,离线0.
socket:socket文件描述符
question:密保问题
aswer:密保答案

好友表(friend)

在这里插入图片描述

user:用户id
friend:好友id
state:关系状态 1:正常 0:拉黑
link:好友 1:是 0:否

群(my_groups)

在这里插入图片描述

group_id:群号
group_name:群名
group_member_num:群人数

群成员(group_member)

消息聊天系统MySQL设计_消息系统数据库设计 1、新platform_info,此存储调⽤消息平台⽅应⽤信息 CREATE TABLE IF NOT EXISTS `platform_info` ( `id` int(11) NOT NULL AUTO_INCREMENT, `platform_code` varchar(50) NOT NULL COMMENT '平台编码', `platform_name` varchar(50) NOT NULL COMMENT '平台名称', `busi_code` varchar(50) DEFAULT NULL COMMENT '业务编码', `busi_name` varchar(50) DEFAULT NULL COMMENT '业务名称', PRIMARY KEY (`id`), UNIQUE KEY `platform_code` (`platform_code`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COMMENT='平台信息'; 2、新app_user_client,⽤于存储下载了app⽤户的⼿机设备信息及绑定的第三⽅个推信息 CREATE TABLE IF NOT EXISTS `app_user_client` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `platform_code` varchar(50) NOT NULL COMMENT '平台ID', `user_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '⽤户ID', `client_id` varchar(50) NOT NULL COMMENT '客户端ID', `alias_id` varchar(50) NOT NULL COMMENT '别名ID', `device_type` enum('IOS','Android') DEFAULT NULL COMMENT '设备类型', `created_time` datetime NOT NULL COMMENT '创时间', `updated_time` datetime NOT NULL COMMENT '修改时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='⽤户app客户端信息'; 3、新sms_message,⽤于存储发送给⽤户的短信数据 CREATE TABLE IF NOT EXISTS `sms_message` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `platform_code` varchar(50) NOT NULL COMMENT '应⽤编码', `content_type` enum('Code','Text') NOT NULL DEFAULT 'Text' COMMENT '内容类型', `send_mobile` varchar(11) NOT NULL COMMENT '⼿机号', `message_content` varchar(200) NOT NULL COMMENT '发送内容', `client_ip` varchar(20) DEFAULT NULL COMMENT '客户端IP', `created_time` datetime DEFAULT NULL COMMENT '发送时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='发送短信⽇志'; 4、新sys_message,⽤于存储设置发送给⽤户的消息 CREATE TABLE IF NOT EXISTS `sys_message` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `platform_code` varchar(50) NOT NULL COMMENT '平台编码', `message_id` varchar(50) NOT NULL COMMENT '消息ID', `message_title` varchar(50) NOT NULL COMMENT '消息标题', `message_content` varchar(50) NOT NULL COMMENT '消息内容', `message_category` varchar(50) NOT NULL COMMENT '消息分类', `message_
消息聊天系统MySQL设计_聊天系统-数据库设计 //常⽤的redis命令 CONFIG SET requirepass "mypass" //Hashmap hset [key] [field] value] hget [key] [field] hgetall [key] //List LPUSH [key] [value] RPUSH [key] [value] LPOP [key] RPOP [key] //删除头2个值为value的元素 LREM [key] [count > 0] [value] //删除尾2个值为value的元素 LREM [key] [count < 0] [value] //删除所有值为value的元素 LREM [key] [count = 0] [value] LREM mylist 2 "hello" LREM mylist -2 "hello" //查询0~最后1个元素(不删除) LRANGE mylist 0 -1 BRPOP [key] [timeout] BLPOP [key] [timeout] //例:获取message_1最左的元素,如果没有,等待5秒,超时返回nil BLPOP message_1 5 采⽤Redis进⾏数据存储,主要包括频控、限流、⽤户、在线⽤户、聊天消息(redis list实现消息队列)、好友(TODO) 频控 CheckFrequency(userId uint64) bool 返回true检查通过,false触发频控 visited_{user_id} >3触发 //频控key前缀 const freqPre string = "visited_" /* Desc: 检查频控key Input: userId Output: False 触发频控/异常 True 正常请求 */ func CheckFrequency(userId uint64) bool { key := freqPre + strconv.FormatUint(userId, 10) resExists, err := Client.Exists(key).Result() if err != nil { return false } if resExists == 0 { //该key不存在 Client.Set(key, 0, 100 * time.Second) return true } res, err := Client.Get(key).Result() if err != nil { return false } resCnt, err := strconv.Atoi(res) if err != nil { return false } if resCnt > 2 {//10秒同⼀userid不能访问超过2次 fmt.Println("触发频控") //... return false } Client.Incr(key) return true } 频控测试 redis.CreateClient() var res bool = true for res { time.Sleep(time.Second * 1) res = redis.CheckFrequency(54508) fmt.Println(res) } 限流 /* 令牌桶算法API */ const LevelFast int = 1 const LevelMedium int = 2 const LevelSlow int = 3 var tokenBucket *ratelimit.Bucket func InitToken(speedLevel int) { var bucketFillDuring time.Duration if speedLevel == LevelFast { bucketFillDuring = 20 * time.Millisecond } else if speedLevel == LevelMedium { bucketFillDuring = 100 * time.Millisecond } else if speedLevel == LevelSlow { bucketFillDuring = 1000 * time.Millisecond } else { //⽇志 fmt.Println("speedLevel只能为Fast, Medium, Slow三个值!") return } var bucketMax int64 = 1//令牌桶最⼤容量,初始也会有这么多个令牌,此处为1是测试所⽤,⽅便看到限流效果,后期需增加⼤⼩ toke
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值