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

redis 如何实现 [每次访问 key 后自动延长 key 的过期时间]

  •  
  •   Aliberter · 2021-09-18 09:16:16 +08:00 · 2744 次点击
    这是一个创建于 923 天前的主题,其中的信息可能已经有所发展或是发生改变。

    大佬们 redis 自身有这个实现吗?还是说要自己实现?我用 springboot-redis 的 redisTemplate 的。谢谢!

    6 条回复    2021-09-18 10:27:17 +08:00
    Saxton
        1
    Saxton  
       2021-09-18 09:19:22 +08:00
    给这个 key 重新 set 一下时间不就重置了
    Aliberter
        2
    Aliberter  
    OP
       2021-09-18 09:21:49 +08:00
    @Saxton 嗯..对..只是怕自己不了解,万一自身就有这种实现,问一下
    Cloud9527
        3
    Cloud9527  
       2021-09-18 09:26:07 +08:00
    这种问题直接看官方文档最快,不过 1 楼的方法是对的
    rationa1cuzz
        4
    rationa1cuzz  
       2021-09-18 09:38:29 +08:00
    加时间貌似每次要先读 ttl 时间,再重新 set,多了一步操作,如果延长过期时间没有限制,1 楼感觉就挺好的。
    PiersSoCool
        5
    PiersSoCool  
       2021-09-18 10:15:10 +08:00
    写个 Lua 脚本最好,原子操作
    Pipecraft
        6
    Pipecraft  
       2021-09-18 10:27:17 +08:00   ❤️ 4
    redis 6.2.0 版本新加的 GETEX 就是这个功能,[每次访问 key 后自动延长 key 的过期时间]。
    具体看官方文档。redis.io/commands/getex

    如果是老版本,不需要用 SET 命令重置时间,用 EXPIRE, EXPIREAT, PEXPIRE 或 PEXPIREAT 会更好些。

    如果你的过期时间比较长,访问同一个 key 的频率很高(作为缓存,这个可能性很高),那么每次 GET 一次然后又 EXPIRE 一次,这样调用两次命令有点浪费。可以考虑异步更新过期时间。比如把要更新的 key 先存到内存里,定时更新一次。这样多次 GET,一定时间内只更新一次就可以了。当然这个方法会增加复杂性。性能和复杂性权衡一下,选择用简单的 GET + EXPIRE 方式还是异步方式。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3584 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 04:37 · PVG 12:37 · LAX 21:37 · JFK 00:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.