在redis

时间:2016-01-09 17:57:00

标签: redis

在redis-cli会议中:

127.0.0.1:6379> SET somekey "Greetings"
OK
127.0.0.1:6379> SET somekey "Mortal"
OK
127.0.0.1:6379> EXISTS somekey
(integer) 1

我正在寻找一个搜索键值的函数SOMEFUNC。也许是这样的事情:

127.0.0.1:6379> SOMEFUNC "somekey:Greetings"
(integer) 1
127.0.0.1:6379> SOMEFUNC "somekey:Ave"
(integer) 0

这一切都是由一个程序驱动的,所以我可以在密钥上使用SSCAN并进行比较,但我想知道是否有SOMEFUNC可以直接执行此操作,如上面的陈述所示。

2 个答案:

答案 0 :(得分:2)

如@MrWiggles所述,字符串没有SOMEFUNC。除了他建议的两个替代方案之外,另一个可以让你非常接近的选择是使用Hashes代替。请考虑以下事项:

127.0.0.1:6379> HSET somehash "Greetings" ""
(integer) 1
127.0.0.1:6379> HEXISTS somehash "Greetings"
(integer) 1
127.0.0.1:6379> HEXISTS somehash "Mortal"
(integer) 0
127.0.0.1:6379> HEXISTS someotherhash "Ave"
(integer) 0

集也可以做同样的伎俩:

127.0.0.1:6379> SADD someset "Greetings"
(integer) 1
127.0.0.1:6379> SISMEMBER someset "Greetings"
(integer) 1
127.0.0.1:6379> SISMEMBER someset "Mortal"
(integer) 0
127.0.0.1:6379> SISMEMBER someotherset "Ave"
(integer) 0

那说,请注意Hashes&集合具有内存开销(就像字符串一样)。对于100,000个字符串/哈希/设置键,这是我当地的Redis' INFO MEMRORY的{​​{1}}报告:

  • 字符串:9594616(9.15M)
  • 哈希:11194616(10.68M)
  • 设置:25594616(24.1M)

然而,真正的问题是为什么要将所有内容保存在单独的密钥中。除非在您的使用案例中有令人信服的理由不这样做,否则请考虑使用单个Hash作为所有"键的小型商店" (字段)和值,例如:

used_memory(_human)

就你原来的问题而言,这会让你回到原点 - 这意味着你必须阅读(127.0.0.1:6379> HSET minikv somekey Greetings (integer) 1 127.0.0.1:6379> HSET minikv anotherkey Human (integer) 1 ... )并在你的应用程序中进行比较,或者,我最喜欢的,将它包装在Lua中在一个电话中完成,也许是这样:

HGET minikv somekey

使用这个127.0.0.1:6379> EVAL "return redis.call('HGET', KEYS[1], ARGV[1]) == ARGV[2] and 1 or 0" 1 minikv somekey Greetings (integer) 1 127.0.0.1:6379> EVAL "return redis.call('HGET', KEYS[1], ARGV[1]) == ARGV[2] and 1 or 0" 1 minikv somekey Mortal (integer) 0 127.0.0.1:6379> EVAL "return redis.call('HGET', KEYS[1], ARGV[1]) == ARGV[2] and 1 or 0" 1 minikv anotherkey Mortal (integer) 0 127.0.0.1:6379> EVAL "return redis.call('HGET', KEYS[1], ARGV[1]) == ARGV[2] and 1 or 0" 1 minikv anotherkey Human (integer) 1 哈希的好处是足迹 - 一个100K哈希minikv

INFO memory

答案 1 :(得分:1)

Redis内置的任何内容都无法为您完成此任务。

实现这一目标的几种方法是:

  1. 将密钥的值返回到您的应用程序中,然后检查该值以查看它是否等于您想要的值
  2. 使用Lua脚本在redis服务器上执行此操作