文章目录
1. 方案设计
使用 redis列表 存储两个用户之间的聊天数据
- 存储 内容使用
json
字符串封装,字段包括:fromId、toId、msg、time
使用 redis hash 存储一个用户未读的消息条数
- 存在问题:原子性问题 ??
2. 需求分析
2.1 连接数据库
Connect();
2.2 断开数据库
disConnect();
2.3 向 redis 输入命令
// _context:连接到数据库的对象
// redisCommand:hiredis 库函数,用于向数据库输入命令
setCommand(const string & data){
...
redisCommand(_context, data.c_str());
...
}
2.4 用户信息:存储格式
- 实现:reids 哈希表
2.5 注册:添加用户信息
addUserInfo(){
// 如果不存在,则创建
if( !HEXISTS(userInfo,wujie) )
hset(userInfo,wujie,123)
else
error
}
2.6 登陆:获取用户信息
searchUserInfo{
hget(userInfo,wujie);
}
2.7 注销:删除用户信息
delUserInfo()
hdel(userInfo,wujie)
}
2.8 聊天记录:存储格式
- 实现方式:链表
- 链表名:双方名字(eg: “wujie-chenshuai”),方便缩小遍历范围(只要找到表名就可以一次遍历出与该人的聊天记录)
- 内容:json 字符串(方便解析,无需再手写封装、解析字符串函数)
{
"time":"2018.01.25",
"fromId":"wujie",
"toId":"chenshuai",
"msg":"zaima?"
}
2.9 聊天记录:保存
addChatRecord(int num){
setCommand("multi"); // 开启事务
// 向事务中添加要执行的命令
for(int i = 0;i < num,i++)
{
ret = RPUSH("wujie-chenshuai","{"time":"2018.01.25","fromId":"wujie","toId":"chenshuai","msg":"zaima?"}");
assert(ret == QUEUED) // 输入命令可能有错误
}
ret = setCommand("exec"); // 执行事务
assert(ret == "OK") // 可能出现运行异常
}
2.10 聊天记录:获取
getChatRecord(int num){
LRANGE("wujie-chenshuai",0,num);
}
3. python 代码实例 - 参考
import json
import time
import redis
pool = redis.ConnectionPool(host=‘xxxx‘,port=6379, decode_responses=Tr