如何在Redis键中使用计数器?

3
有没有在Redis中实现这个的方法?
SET counter 0
INCR counter
SET KEY:{counter} "Content of line 1"
INCR counter
SET KEY:{counter} "Different content of line 2"

我的示例代码应该被替换(即在运行时由redis-cli转换)为:

SET counter 0
INCR counter
SET KEY:1 "Content of line 1"
INCR counter
SET KEY:2 "Different content of line 2"
etc.

我的问题不是如何自动递增计数器。
我的问题是语法:如何将一个通用的{通配符}包含到类似于:

SET keyname:{currentcounter} "value" ...

任何帮助都将不胜感激。非常感谢! Bernie
2个回答

1
如果您正在使用Redis 2.6+,则可以使用Lua脚本和EVAL命令,如下所示:
eval "local c = redis.call('incr', KEYS[1]); 
      return redis.call('set', KEYS[2] .. ':' .. c, ARGV[1])"
      2 counter KEY "Content of line 1"

我将其分成多行以便于阅读。 编辑
抱歉,我出差几天了。这是一个示例,表明它可以工作。
redis 127.0.0.1:6379> flushdb
OK
redis 127.0.0.1:6379> eval "local c = redis.call('incr', KEYS[1]); return redis.call('set', KEYS[2] .. ':' .. c, ARGV[1])" 2 counter KEY "Content of line 1"
OK
redis 127.0.0.1:6379> keys *
1) "KEY:1"
2) "counter"
redis 127.0.0.1:6379> get counter
"1"
redis 127.0.0.1:6379> get KEY:1
"Content of line 1"
redis 127.0.0.1:6379> eval "local c = redis.call('incr', KEYS[1]); return redis.call('set', KEYS[2] .. ':' .. c, ARGV[1])" 2 counter KEY "Content of the next thing"
OK
redis 127.0.0.1:6379> keys *
1) "KEY:1"
2) "KEY:2"
3) "counter"
redis 127.0.0.1:6379> get counter
"2"
redis 127.0.0.1:6379> get KEY:2
"Content of the next thing"

为了确定一个明确的起点,请使用“SET counter 0”。然后,当我运行您的示例时,我会得到一个OK。接下来,“GET counter”会回复“1”。很好。 但是,“GET KEYS:1”和“GET KEYS[1]”都会回复(nil)。我该如何检索KEY:1或KEY[1]的值?谢谢!Bernie - Bernie Reiter
你好,sberry,能否请您跟进我的问题?我非常想使用您的方法,但是我对Lua一无所知。我是否需要编写Lua脚本来从redis中检索值,还是可以使用普通的redis命令?如果选择后者,那么在您的示例中我该如何查询redis?非常感谢!Bernie - Bernie Reiter
1
@BernieReiter:我添加了从redis-cli运行的示例输出。 - sberry
我仍然不理解Lua语句中的KEYS[1]和KEYS[2]部分,虽然我对Lua一无所知,但结果很好,我可以尝试调整Lua语句。已批准并关闭问题。非常感谢您的帮助!Bernie - Bernie Reiter

0

没有,SET/GET命令不支持这个。

你可以使用Redis中的LUA脚本来完成类似的操作,或者更简单地,你可以以Redis所期望的方式发出这些命令,使用一些简单的编程/脚本语言。


SET/GET命令不支持此操作。是否有其他Redis命令(如列表或哈希)支持自动递增计数器的这种用法?如果我使用简单的编程/脚本...那么每次插入新值时,我必须调用redis-cli两次。一次检索计数器的当前值,一次存储新值。这正是我想避免的。还有其他提示或技巧吗?谢谢!伯尼 - Bernie Reiter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接