在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可以直接执行此操作,如上面的陈述所示。
答案 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}}报告:
然而,真正的问题是为什么要将所有内容保存在单独的密钥中。除非在您的使用案例中有令人信服的理由不这样做,否则请考虑使用单个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内置的任何内容都无法为您完成此任务。
实现这一目标的几种方法是: