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

关于 redis 的设计方案的选择

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

    要做的功能:用户禁言。由于 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
    Mrun
        1
    Mrun  
       2015-08-24 17:00:25 +08:00   ❤️ 1
    redis 有一个是 ZREMRANGEBYSCORE ,可以删除一个范围内的所有成员
    iyangyuan
        2
    iyangyuan  
       2015-08-24 17:59:22 +08:00 via iPhone   ❤️ 1
    第一种好,禁言的用户毕竟是少数,而且第一种方法相当于自动垃圾回收,长远来看不会造成内存泄露。如果用第二种,不仅需要计算、比较,而且需要手动释放解禁用户,也没看出哪里节省内存,所以我觉得第一种好
    dododada
        3
    dododada  
       2015-08-25 09:11:05 +08:00   ❤️ 1
    zset 的性能比不上第一种,应用中有这种情况
    textworld
        4
    textworld  
       2015-08-25 09:16:46 +08:00   ❤️ 1
    第一种,首先,整个逻辑实现就很简单,其次速度快, redis 的过期是读取的时候判断的,被动过期效率高。你是不是有强迫症,觉得键太多不舒服?
    hisway
        5
    hisway  
    OP
       2015-08-25 09:40:51 +08:00
    @iyangyuan
    @dododada
    @textworld 已用第一种实现,确实实现起来很简单,内存自动释放,判断效率高,果然有强迫症的到哪都能体现出来,哈哈。。感谢~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1529 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 17:15 · PVG 01:15 · LAX 09:15 · JFK 12:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.