【问题标题】:Is there any ways to evict keys from Redis just after accessing it?有什么方法可以在访问 Redis 后从 Redis 中逐出密钥?
【发布时间】:2018-10-03 14:12:35
【问题描述】:

根据这个答案 [https://stackoverflow.com/a/17099452/8804776][1]

"你可能不知道,但是 Redis 其实是单线程的, 是如何保证每个命令都是原子的。虽然一个命令是 执行,不会运行其他命令。”

Redis 是单线程的。我的要求是在 Redis 中存储一个密钥,并且一旦线程访问它就应该驱逐它。

例如: HSET bucket-1 名称 justin

线程 A 和 B 访问相同的密钥 HGET 存储桶 1 名称
只有一个线程应该在任何给定点获取数据。

我可以做任何特定的设置来实现这一点吗?

【问题讨论】:

    标签: redis spring-data spring-data-redis


    【解决方案1】:

    术语“驱逐”是指具有过期设置 (TTL) 的密钥。虽然没有专门的命令来实现您想要的,但您可以使用事务,例如:

    WATCH bucket-1
    HGET bucket-1 name
    (pseudo: if not nil)
    MULTI
    HDEL bucket-1 name
    EXEC
    

    如果EXEC 失败,则意味着您在线程 B 中(假设 A 先到达那里)。

    或者,可以将上述内容压缩为惯用的 Lua 脚本 - 正如@The_Dude 所建议的那样 - 例如(为可读性添加了换行符):

    EVAL "local v=redis.call('HGET', KEYS[1], ARGV[1])
          redis.call('HDEL', KEYS[1], ARGS[1])
          return v" 
          1 bucket-1 name
    

    回复nil 表示你是 B。

    【讨论】:

      【解决方案2】:

      没有一个命令可以用哈希值来做到这一点。您可以使用 Lua 脚本来处理此问题。

      您也可以改用GETSET,您可以在其中将键重置为表示它已被其他消费者使用的值。

      【讨论】:

      • 如果我使用 SET 而不是 HSET,即使这个答案也会有所帮助
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-02
      • 1970-01-01
      • 2013-01-01
      • 2022-11-08
      • 1970-01-01
      • 2023-03-14
      • 2017-02-12
      相关资源
      最近更新 更多