如何在redis密钥中使用计数器?

时间:2013-08-23 22:36:39

标签: redis

有没有办法在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.

我的问题不是如何自动增加计数器 我的问题是语法:如何将通用{wildcard}包含在以下内容中:

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

感谢任何帮助。非常感谢!

伯尼

2 个答案:

答案 0 :(得分: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"

答案 1 :(得分:0)

不,SET / GET命令不支持此功能。

您可以使用redis中的LUA脚本执行类似的操作,甚至更简单;你可以发布命令,因为redis期望使用简单的编程/脚本