使用Redis存储聊天数据的一种方案
Posted -零
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Redis存储聊天数据的一种方案相关的知识,希望对你有一定的参考价值。
方案设计
使用redis列表存储两个用户之间的聊天数据,存储内容使用json字符串封装,字段包括:fromid、toid、msg、time四个字段。
使用redis hash存储一个用户未读的消息条数。
存在问题:原子性问题。
Python Demo实现
import json import time import redis pool = redis.ConnectionPool(host=‘xxxx‘,port=6379, decode_responses=True) conn = redis.Redis(connection_pool=pool) """ function:fromid用户给toid用户发送msg消息 Parameters: fromid:int类型,发送消息的用户id toid:int类型,接收消息的用户id msg:str类型,消息内容 return:bool类型,消息是否发送成功 """ def msgsend(fromid,toid,msg): try: timesocre = time.time() dict = {"fromid":fromid,"toid":toid,"msg" :msg,"time":timesocre} key = keyname(fromid, toid) aliveflag = checkuseralive(toid) if not aliveflag: setwaithoutnum(toid, key) conn.lpush(key, json.dumps(dict)) return True except: return False """ function:toid用户读取fromid用户发送过来消息 Parameters: fromid:int类型,发送消息的用户id toid:int类型,接收消息的用户id return:list,int(消息列表与toid用户未读取fromid用户发送过来的消息条数) """ def msgread(fromid,toid): key = keyname(fromid, toid) msglen = conn.llen(key) msglist = conn.lrange(key,0,msglen) withoutmsgnum = returnwithoutnum(toid,key) return msglist,withoutmsgnum """ function:检查userid用户是否在线 Parameters: userid:int类型,消息的用户id return:bool类型,在线为True,不在线为False """ def checkuseralive(userid): # 检查用户在线,预留 return True """ function:设置userid用户与另一个用户未读取消息的条数 Parameters: userid:int类型,消息的用户id key:str类型 return:bool类型,在线为True,不在线为False """ def setwaithoutnum(userid,key): if conn.hexists(str(userid), key): msgnum = conn.hget(str(userid), key) conn.hset(str(userid), key, int(msgnum)+1) else: conn.hset(str(userid), key, 1) """ function:返回userid用户与另一个用户的未读消息条数 Parameters: userid:int类型,消息的用户id key:str类型, return: """ def returnwithoutnum(userid,key): if conn.hexists(str(userid), key): msgnum = conn.hget(str(userid), key) conn.hset(str(userid), key,0) return int(msgnum) return 0 """ function:根据两个id唯一生成一个key Parameters: fromid: int toid:int return: str """ def keyname(fromid,toid): key = (str(fromid)+"-"+str(toid) if (fromid > toid) else str(toid)+"-"+str(fromid)) return key user1 = 23 user2 = 43 user3 = 212 user4 = 65 #用户1给用户2发送"你好" # msgsend(user1,user2,"打你") #用户2读取用户1发送的消息 #第一个返回值返回全部聊天记录,第二个参数返回未读消息数量 msglist,withoutmsgnum = msgread(user1,user2) print(msglist,withoutmsgnum) # msgsend(user2,user1,"。。。") # msglist,withoutmsgnum = msgread(user2,user1) # print(msglist,withoutmsgnum) #读取最新一条内容示例 print(json.loads(msglist[0])) print(json.loads(msglist[1])) print(json.loads(msglist[2])) # print(json.loads(msglist[3])) # print(json.loads(msglist[5])) # print(json.loads(msglist[6])) # print(json.loads(msglist[7]))
以上是关于使用Redis存储聊天数据的一种方案的主要内容,如果未能解决你的问题,请参考以下文章