关于聊天系统的用户聊天记录的存储问题

提问:

聊天记录能不能存到redis里,由于聊天记录是有时效的,所以我想采用redis的过期功能,到某一时间点自动删除

 

回答:

理论上是可以的, 但是极其不推荐!!!
比如我想到可以使用 redis 中的 keys 特性:
假设 User_a 和 User_b 发送了 2 条消息, 那么可以储存为:

import redis
conn = redis.Redis(host='localhost', port=6379)
# 按照 User_a:User_b:+ 时间戳来设置 key, value 为聊天记录内容
conn.set('User_a:User_b:2018060123050809001', 'msg1')
# 设置过期时间为 3 second
conn.set('User_a:User_b:2018060123050809002', 'msg2', ex=3)

# 通过 Redis.keys 来获取所有`User_a`发送给`User_b`的信息的keys
msg_keys = conn.keys('User_a:User_b:*')

# 通过获得的keys来获取所有信息内容
msgs = conn.mget(msg_keys) if msg_keys else []

但是我们看到由于 redis 是按照键值对来存储数据的, 它查询数据不是很方便, 也不支持一些比较复杂的条件查询, 甚至对于上面这个解决方案, 还可能存在性能问题, 参考:redis生产环境中慎用keys模糊匹配方法keys方法可以换成scan_iter方法.

综上, 用 redis 来存储聊天记录不是一个很明智的选择. redis 不是天生用来做这个事情的.

我推荐使用 mongodb 来实现, 参考: Expire Data from Collections by Setting TTL. 当然关系数据库也可以实现这个业务需求, 需要加一个 create_time 字段, 然后每次查询的时候只查出没过期的聊天记录, 即是满足create_time + expires > datetime.now()的聊天记录.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

越来越胖的GuanRunwei

祝老板们身体健康,财源广进!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值