当前位置: 首页 > 面试题库 >

如何根据密钥的存在情况在Redis中设置哈希密钥过期

岑畅
2023-03-14
问题内容

我想设置一些哈希键的到期时间,如果是第一次设置该键,我希望设置一个到期时间,否则,我更喜欢保留第一次设置的到期时间。

由于存在大量的哈希键,因此我更喜欢在管道中进行此操作,但是下面的功能无法正常工作。

该行pipe.exists(hkey)返回管道的obj,该对象始终为True,因此无论是否存在哈希键,if子句始终只包含一部分。

我的问题是:是否有一种方法可以根据管道中哈希密钥的存在来设置哈希密钥的到期时间?

def test1(hkey, v):
    with r.pipeline() as pipe:
        # tmp = pipe.exists(hkey)
        # pipe.exists(hkey) is a pipe obj, which is always True, 
        # this line not work as expected and the two lines below it will never be excuted.
        if not pipe.exists(hkey):
            pipe.hset(hkey, v, v)
            pipe.expire(hkey, 3600)
        else:
            # no matter whether the hash key is exist or not, the if else statment always goes to this line.
            pipe.hset(hkey, v, v)
        pipe.execute()

问题答案:

您无法使用管道实现这一目标,因为直到执行完整个管道后,您才知道密钥是否存在。相反,您可以使用Lua脚本来完成这项工作:

local key = KEYS[1]
local field = ARGV[1]
local value = ARGV[2]
local ttl = ARGV[3]

local exist = redis.call('exists', key)

redis.call('hset', key, field, value)

if exist == 0 then
    redis.call('expire', key, ttl)
end

选中此项以查看如何使用redis-
py运行Lua脚本。然后使用管道运行脚本以减少RTT

更新

如果您坚持使用WATCH来完成这项工作,则可以尝试以下代码:

with r.pipeline() as pipe:
    while 1:
        try:
            pipe.watch(hkey)

            exist = pipe.exists(hkey)

            pipe.multi()

            if not exist:
                pipe.hset(hkey, v, v)
                pipe.expire(hkey, 3600)
            else:
                pipe.hset(hkey, v, v)

            pipe.execute()
            break;
        except WatchError:
            continue


 类似资料:
  • 问题内容: 我有一个哈希表,其键的模式为USER_TEL,例如: 现在,我想获取密钥中具有相同TEL的所有用户的地址。 我想出的是: 我得到而不是价值观。 问题答案: 您应该使用HSCAN命令。 例如: 更新资料 Python实现:

  • 如何在Azure密钥库中设置秘密,而不使用PowerShell。我们正在使用Azure Key Vault来安全地存储连接字符串和一些其他应用程序秘密。我们可以使用PowerShell脚本添加秘密,但我想知道是否有其他方法可以在Azure KeyVault中添加密钥,最好是使用API。我们实际上需要提供一个管理工具,应用程序管理员可以使用该工具在密钥库中添加/修改机密。

  • 我已经完成了一个android应用程序的开发,该应用程序使用facebook sdk与facebook集成。目前,我对这个应用程序没有任何问题需要解决,因为它功能齐全,运行良好——但尽管如此,我相信即使应用程序正在运行,我仍然不完全理解Android密钥散列是什么 1)据我所知,facebook sdk为开发者提供了一个独特的应用程序id,以了解他们与谁“交谈”,这样他们也可以控制谁是谁之类的人,

  • 问题内容: 我需要将2个密钥存储到KeyStore中,这是相关代码: 尽管我得到了执行,但“私钥必须带有证书链” 那到底是什么?以及我将如何生成它? 问题答案: 您还需要提供私钥条目的证书(公钥)。对于由CA签名的证书,链是CA的证书和最终证书。对于自签名证书,您只有自签名证书。 示例: 要生成证书,请点击以下链接: 示例:

  • keytool-exportcert-alias diego-keystore“c:\users\diego\desktop\celuchat.keystore”“c:\openssl\bin\openssl.exe”sha1-binary“c:\openssl\bin\openssl.exe”base64 celuchat.keystore是我在导出签名的应用程序时使用的密钥库,当keytool

  • 问题内容: 我想删除与“用户*”匹配的键。 我如何在Redis命令行中做到这一点? 问题答案: 此功能目前无法一口气完成(请参阅文档中的注释)。不幸的是,您只能使用,遍历结果,然后使用来删除每个结果。 怎么样使用bash来帮助? 要逐步执行: -获取所有键并使用awk删除不需要的多余文本。 -为每一个创建一个echo语句以将其删除。 -使用DEL语句,然后将它们传递回cli。 不建议这样做是最好的