Redis中哈希的原子GETSET

Posted

技术标签:

【中文标题】Redis中哈希的原子GETSET【英文标题】:Atomic GETSET on a hash in Redis 【发布时间】:2011-10-09 09:23:48 【问题描述】:

我将在 Redis 中存储多个 URL 的命中计数器。我打算使用hash,因为这似乎很有意义。它还有一个原子增量函数,这对我的用例至关重要。

每隔一段时间,我都会将每个 URL 的点击计数汇总到另一个数据存储中。为此,我想获取命中计数并将其重置为零。我似乎找不到像 GETSET 这样的操作来处理哈希。如果我在获取命中计数和将其重置为零之间记录一次命中,那么如果没有某种原子操作,它就会丢失。

我错过了什么吗?我想到的一种替代方法是在我的客户端 (python) 代码中对 URL 进行哈希处理并使用 string commands,但是当 Redis 本身提供哈希时,这似乎有点不妥。

【问题讨论】:

【参考方案1】:

尝试查看redis transactions docs,即WATCH和MULTI命令的组合:

监视 WATCHed 键以检测针对它们的更改。如果 在 EXEC 命令之前至少修改了一个被监视的键​​, 整个事务中止,并且 EXEC 返回 Null 多批量回复 通知事务失败。

...

那么,WATCH 的真正含义是什么? 这是一个使 EXEC 有条件的命令:我们在问 Redis 仅在没有其他客户端修改任何内容时才执行事务 WATCHed 键。否则根本不进入交易。

【讨论】:

不幸的是,它锁定了整个哈希而不是单个条目。看起来您无法在哈希中查看单个条目。

以上是关于Redis中哈希的原子GETSET的主要内容,如果未能解决你的问题,请参考以下文章

redis学习

Springboot使用redis的setnx和getset实现并发锁、分布式锁

使用Redis之前5个必须了解的事情

Redis在C#中的使用及Redis的封装

Redis 学习笔记一

Redis 哈希(Hash)命令