码迷,mamicode.com
首页 > 其他好文 > 详细

使用Redis存储聊天数据的一种方案

时间:2020-07-07 15:45:35      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:dem   python   rom   class   list   用户id   一个用户   exist   xxxx   

 

方案设计

使用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存储聊天数据的一种方案

标签:dem   python   rom   class   list   用户id   一个用户   exist   xxxx   

原文地址:https://www.cnblogs.com/-wenli/p/13260643.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!