首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  Redis

关于 redis 的设计方案的选择

  •  
  •   hisway · 2015-08-24 15:39:00 +08:00 · 2246 次点击
    这是一个创建于 1518 天前的主题,其中的信息可能已经有所发展或是发生改变。

    要做的功能:用户禁言。由于 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 获取 时间戳 来判断当前时间是否可发言,

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

    5 回复  |  直到 2015-08-25 09:40:51 +08:00
        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 的过期是读取的时候判断的,被动过期效率高。你是不是有强迫症,觉得键太多不舒服?
        5
    hisway   2015-08-25 09:40:51 +08:00
    @iyangyuan
    @dododada
    @textworld 已用第一种实现,确实实现起来很简单,内存自动释放,判断效率高,果然有强迫症的到哪都能体现出来,哈哈。。感谢~
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1204 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 19ms · UTC 23:43 · PVG 07:43 · LAX 16:43 · JFK 19:43
    ♥ Do have faith in what you're doing.