在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/人工智能/ 關(guān)于聊天系統(tǒng)的用戶聊天記錄的存儲問題

關(guān)于聊天系統(tǒng)的用戶聊天記錄的存儲問題

聊天記錄能不能存到redis里,由于聊天記錄是有時效的,所以我想采用redis的過期功能,到某一時間點自動刪除

回答
編輯回答
卟乖

理論上是可以的, 但是極其不推薦!!!
比如我想到可以使用 redis 中的 keys 特性:
假設(shè) User_a 和 User_b 發(fā)送了 2 條消息, 那么可以儲存為:

import redis
conn = redis.Redis(host='localhost', port=6379)
# 按照 User_a:User_b:+ 時間戳來設(shè)置 key, value 為聊天記錄內(nèi)容
conn.set('User_a:User_b:2018060123050809001', 'msg1')
# 設(shè)置過期時間為 3 second
conn.set('User_a:User_b:2018060123050809002', 'msg2', ex=3)

# 通過 Redis.keys 來獲取所有`User_a`發(fā)送給`User_b`的信息的keys
msg_keys = conn.keys('User_a:User_b:*')

# 通過獲得的keys來獲取所有信息內(nèi)容
msgs = conn.mget(msg_keys) if msg_keys else []

但是我們看到由于 redis 是按照鍵值對來存儲數(shù)據(jù)的, 它查詢數(shù)據(jù)不是很方便, 也不支持一些比較復(fù)雜的條件查詢, 甚至對于上面這個解決方案, 還可能存在性能問題, 參考:redis生產(chǎn)環(huán)境中慎用keys模糊匹配方法. keys方法可以換成scan_iter方法.

綜上, 用 redis 來存儲聊天記錄不是一個很明智的選擇. redis 不是天生用來做這個事情的.

我推薦使用 mongodb 來實現(xiàn), 參考: Expire Data from Collections by Setting TTL. 當然關(guān)系數(shù)據(jù)庫也可以實現(xiàn)這個業(yè)務(wù)需求, 需要加一個 create_time 字段, 然后每次查詢的時候只查出沒過期的聊天記錄, 即是滿足create_time + expires > datetime.now()的聊天記錄.

2018年2月12日 22:20