Redis:原子性获取和条件设置
我想在 Redis 中执行一个原子的 GET 操作,如果返回的值等于某个期望的值,我想要做一个 SET 操作,但是我希望将所有这些操作都链式地作为一次原子操作。 (我正在尝试设置一个指示是否有任何进程正在将数据写入磁盘的标志,因为只有一个进程被允许这样做。)
这是否可能用 Redis 实现?
我看到了关于 MULTI 操作的文档,但我没有看到条件操作的 MULTI 操作。希望其他人能给出一些关于这个问题的建议,这将非常感激!
我最终使用了redlock-py,这是Redis文档推荐用于创建写锁的redlock算法的一种实现:https://redis.io/topics/distlock。该文章对于任何想在Redis中创建类似的写锁的人来说都是非常棒的阅读材料。
redis-if
redis-if 是一个用于“条件事务”的 Lua 脚本库。比WATCH + MULTY更方便。
你可以传递任何组合的条件和后续命令作为 JSON 对象:
const Redis = require('ioredis')
const redis = new Redis()
redis.defineCommand('transaction', { lua: require('redis-if').script, numberOfKeys: 0 })
await redis.set('custom-state', 'initialized')
await redis.set('custom-counter', 0)
// this call will change state and do another unrelated operation (increment) atomically
let success = await redis.transaction(JSON.stringify({
if: [
// apply changes only if this process has acquired a lock
[ 'initialized', '==', [ 'sget', 'custom-state' ] ]
],
exec: [
[ 'set', 'custom-state', 'finished' ],
[ 'incr', 'custom-counter' ]
]
}))
运用这个脚本,我们从项目中删除了所有自定义脚本。
我在寻找类似功能时遇到了这篇文章,但我没有看到任何吸引我的选项。相反,我选择用 Rust 写了一个小模块,提供了这种准确的操作:
https://github.com/KennethWilke/redis-setif
使用这个模块,你可以这样做:
SETIF <key> <expected> <new>
HSETIF <key> <field> <expected> <new>
你可以使用SET命令来实现此操作,使用以下两个参数,详细信息请参考这里:
GET - 返回存储在键中的旧字符串,不存在时返回nil。
NX - 只有在键不存在时才设置键。
由于Redis在运行另一个命令时不会执行任何命令,所以您可以以原子方式完成这两个操作。
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

你可以使用Lua脚本在Redis服务器上执行GET和set操作。它们是原子的,允许您添加逻辑。