我必须要有东西(可以是列表,排序集,也许是简单的字符串) 包含各种数字(非重复),我需要能够切换一些
例如列表:
LRANGE todo:20 0 -1 => "2" "5" "6" "7"
做我的开关:即
MULTI
LRANGE todo:20 0 1 => "2" "5" (store them)
LSET todo:20 0 "5"
LSET todo:20 1 "2"
EXEC
最终结果:
LRANGE todo:20 0 -1 => "5" "2" "6" "7"
我有什么方法可以用更简单(或更好)的方式做到这一点,或者是一个"限制" REDIS?
答案 0 :(得分:1)
您可以使用SORT
命令。
将这些索引存储在SET
中,并为每个索引存储相应的分数/权重,并按其排序。分数键可以是散列,您可以有许多不同的分数。
这是一个例子: 包含3个参数的待办事项列表,插入时间,执行时间和优先级。
127.0.0.1:6379> SADD todos 1 2 3
127.0.0.1:6379> HMSET todos:1 insertionTime 1 executionTime 10 priority 5
127.0.0.1:6379> HMSET todos:2 insertionTime 2 executionTime 25 priority 1
127.0.0.1:6379> HMSET todos:3 insertionTime 5 executionTime 4 priority 7
要获取按每个列表排序的列表:
127.0.0.1:6379> SORT todos by todos:*->insertionTime
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> SORT todos by todos:*->executionTime
1) "3"
2) "1"
3) "2"
127.0.0.1:6379> SORT todos by todos:*->priority
1) "2"
2) "1"
3) "3"
如果您还将任务本身(或任何其他数据)保存在此哈希或同一Redis数据库中的任何其他密钥中,您可以使用可选的GET
参数在同一单个调用中获取它:
127.0.0.1:6379> HSET todos:1 task "do something"
127.0.0.1:6379> HSET todos:2 task "do something else"
127.0.0.1:6379> HSET todos:3 task "do this other thing"
127.0.0.1:6379> SORT todos by todos:*->priority get todos:*->task
1) "do something else"
2) "do something"
3) "do this other thing"
请注意,当您访问多个密钥时,SORT命令将无法与Redis群集一起使用。而且这个命令的时间复杂度可能非常高,你应谨慎使用它,特别是当使用和设置的大小扩大时。
答案 1 :(得分:0)
您可以编写一个执行该操作的Lua脚本,然后调用该脚本代替您的事务。您也可以使用模块,但如果请求很简单,则可能过度。