关于 redis 的设计方案的选择

2015-08-24 15:39:00 +08:00
 hisway

要做的功能:用户禁言。由于 redis 的超时好像是针对 key 的,不能针对 value,所有用以下方法来曲线救国

方法 1 :
setex room_user1 300 user1;
setex room_user2 300 user2;
根据是否存在键 room_user1 来判断用户发言权限,存在则不可发言,
缺点:会存在大量键,一个禁言用户一个键

方法 2 :
zadd room timestamp+300 user1
zadd room timestamp+300 user2
根据 ZSCORE room user1 获取 时间戳 来判断当前时间是否可发言,

暂时想到这两种,能否从效率,内存开销上分析下哪种比较合适,或者还有什么好的方法?

3861 次点击
所在节点    Redis
5 条回复
Mrun
2015-08-24 17:00:25 +08:00
redis 有一个是 ZREMRANGEBYSCORE ,可以删除一个范围内的所有成员
iyangyuan
2015-08-24 17:59:22 +08:00
第一种好,禁言的用户毕竟是少数,而且第一种方法相当于自动垃圾回收,长远来看不会造成内存泄露。如果用第二种,不仅需要计算、比较,而且需要手动释放解禁用户,也没看出哪里节省内存,所以我觉得第一种好
dododada
2015-08-25 09:11:05 +08:00
zset 的性能比不上第一种,应用中有这种情况
textworld
2015-08-25 09:16:46 +08:00
第一种,首先,整个逻辑实现就很简单,其次速度快, redis 的过期是读取的时候判断的,被动过期效率高。你是不是有强迫症,觉得键太多不舒服?
hisway
2015-08-25 09:40:51 +08:00
@iyangyuan
@dododada
@textworld 已用第一种实现,确实实现起来很简单,内存自动释放,判断效率高,果然有强迫症的到哪都能体现出来,哈哈。。感谢~

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/215576

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX