如何在redis中使用“where子句”更新zset分数

Posted

技术标签:

【中文标题】如何在redis中使用“where子句”更新zset分数【英文标题】:How to update a zset score with "where clause" in redis 【发布时间】:2014-01-27 03:24:53 【问题描述】:

mysql 中:

update zset.1 set score = score + 10 where value = 1 and score > 100

这意味着它不会更新,除非分数是 gt 100

在 Redis 和程序代码中:

score = zscore zset.1 1
if (score > 100) 
  score = zincrby zset.1 10 1

这应该可以,但它不是原子的。并发更新时分数会多次更新

另外,“WATCH”不适合我的情况,因为它的 RETRY 机制将是一个性能问题。

【问题讨论】:

【参考方案1】:

有两种方法:

使用 Redis multi()/exec() 组合原子地执行一系列 Redis 调用。 See Redis Transactions。 编写 Lua 脚本。请参阅documentation for eval function in Redis 了解更多信息。

【讨论】:

以上是关于如何在redis中使用“where子句”更新zset分数的主要内容,如果未能解决你的问题,请参考以下文章

使用 MS Access 如何使用多个连接和 where 子句执行更新?

如何使用条件(where子句)更新实体并在spring数据jpa中的方法响应中获取更新的实体

Oracle:尝试使用唯一键组合的“更新”语句。卡在 where 子句中

SQL中使用UPDATE更新数据时一定要记得WHERE子句

在“where”子句中使用“in”运算符更新行

在 PL/SQL Developer 中使用了没有 Where 子句的更新语句