从几个服务器,我想添加键,如doc:1,然后doc:2等。现在,为了避免不同的服务器同时尝试添加到doc:2,我认为有一些类似“add to doc:{index}”的机制,索引会自动转移。有什么办法能让它起作用吗?
hmmo2u0o1#
您可以使用分布式锁并让赢家写入
for each server, attempt to acquire lock until success on acquire lock read numeric value increment write release lock
文档
ioekq8ef2#
您 可以 使用 每次 添加 时 递增 的 键 :INCR 命令 以 原子 方式 执行 此 操作 , 并 返回 增量 值 , 您 可以 使用 该 值 生成 新 的 键名 。
INCR
> INCR counter 42 > SET doc:42 foobar OK
中 的 每 一 个
> EVAL "local value = redis.call('INCR', 'counter'); redis.call('SET', 'doc:'..value, ARGV[1])" 0 foobar (nil)
格式说明 :
local value = redis.call('INCR', 'counter');
格式执行 INCR counter 并 将 结果 存储 在 value 变量 中 。
INCR counter
value
redis.call('SET', 'doc:'..value, ARGV[1]);
格式使用 通过 第 一 个 EVAL 参数 传递 的 数据 ( 在 我们 的 示例 中 为 * foobar * ) , 对 以 doc: 和 value 变量 的 串联 命名 的 键 执行 SET 。最 后 , 如果 您 需要 将 递增 的 计数 器 值 返回 给 调用 方 , 只需 将 最 后 一 个 return value; 块 附加 到 脚本 中 。
EVAL
doc:
SET
return value;
2条答案
按热度按时间hmmo2u0o1#
您可以使用分布式锁并让赢家写入
文档
ioekq8ef2#
您 可以 使用 每次 添加 时 递增 的 键 :
INCR
命令 以 原子 方式 执行 此 操作 , 并 返回 增量 值 , 您 可以 使用 该 值 生成 新 的 键名 。中 的 每 一 个
格式
说明 :
格式
执行
INCR counter
并 将 结果 存储 在value
变量 中 。格式
使用 通过 第 一 个
EVAL
参数 传递 的 数据 ( 在 我们 的 示例 中 为 * foobar * ) , 对 以doc:
和value
变量 的 串联 命名 的 键 执行SET
。最 后 , 如果 您 需要 将 递增 的 计数 器 值 返回 给 调用 方 , 只需 将 最 后 一 个
return value;
块 附加 到 脚本 中 。