list - 如何以原子方式将项目添加到具有固定数量元素的虚拟列表中?

标签 list concurrency redis

我们有固定大小的列表,这些列表将由不同的进程同时填充。有没有一种方法可以在不使用 TRANSACTIONS 的情况下执行此操作?

例如,是否存在原子操作,仅当列表的大小小于 X 时才向列表添加项目?

最佳答案

没有单个命令可以仅在列表包含的项目少于 n 时将项目添加到列表中。您需要将它们包装到事务中才能使它们成为“原子”。 在没有事务的情况下实现原子调用的唯一方法是通过 LUA 脚本。沿线的东西(伪代码):

local len = redis.call("LLEN", KEYS[1])
if len >= ARGV[1] then
    return nil
end
redis.call("LPUSH", KEYS[1], ARGV[2])
return ARGV[2]

您可以使用列表的键名 (KEYS[1])、列表的最大长度 (ARGV[1]) 和应该放在列表中的项目 (ARGV[ 2]).只有当列表的长度小于最大值时,才会添加并返回该项目。如果列表长度大于等于最大值,则返回“nil”。

关于list - 如何以原子方式将项目添加到具有固定数量元素的虚拟列表中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26380210/

相关文章:

redis - Redis官网的查询教程在哪里?

python - 删除字符串列表中包含特定字符串的元素

list - 我如何将值存储到 Scheme 的读取中?或者那是不可能的?

python - concurrent.futures.Executor.map 中的异常处理

Java 并发递增值

c++ - 整数读取需要临界区保护吗?

c - 使用函数为链表创建项目时丢失数据(并添加随机节点)

python - 创建一个以列表或整数作为参数的函数 (Python)

java - 使用 key 存储和 mysql 数据库实现分析聚合

laravel - 使用正则表达式忘记缓存 laravel