要做的功能:用户禁言。由于 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 获取 时间戳 来判断当前时间是否可发言,
暂时想到这两种,能否从效率,内存开销上分析下哪种比较合适,或者还有什么好的方法?
1
Mrun 2015-08-24 17:00:25 +08:00 1
redis 有一个是 ZREMRANGEBYSCORE ,可以删除一个范围内的所有成员
|
2
iyangyuan 2015-08-24 17:59:22 +08:00 via iPhone 1
第一种好,禁言的用户毕竟是少数,而且第一种方法相当于自动垃圾回收,长远来看不会造成内存泄露。如果用第二种,不仅需要计算、比较,而且需要手动释放解禁用户,也没看出哪里节省内存,所以我觉得第一种好
|
3
dododada 2015-08-25 09:11:05 +08:00 1
zset 的性能比不上第一种,应用中有这种情况
|
4
textworld 2015-08-25 09:16:46 +08:00 1
第一种,首先,整个逻辑实现就很简单,其次速度快, redis 的过期是读取的时候判断的,被动过期效率高。你是不是有强迫症,觉得键太多不舒服?
|