提问:
聊天记录能不能存到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()
的聊天记录.