使用原子操作在 Aerospike bin 中设置最小值
2018-11-7 6:25:12
收藏:0
阅读:99
评论:1
我需要一个 Aerospike 原子“设置最小值”的操作,其中我提供一个 bin 名称和一个数值参数,无论当前 bin 的值或参数中的值哪个更小,都将其设置并返回。
以下 Lua UDF 应该可以实现
test.lua
function set_min(rec, bin_name, value)
if aerospike:exists(rec) then
local min = rec[bin_name]
if min > value then
rec[bin_name] = value
aerospike:update(rec)
end
else
rec[bin_name] = value
aerospike:create(rec)
end
return rec[bin_name]
end
使用参数 11、9、5、7 运行:
aql> execute test.set_min('minval', 11) on test.set-min where PK=2
+---------+
| set_min |
+---------+
| 11 |
+---------+
1 行记录 (0.001 秒)
OK
aql> execute test.set_min('minval', 9) on test.set-min where PK=2
+---------+
| set_min |
+---------+
| 9 |
+---------+
1 行记录 (0.001 秒)
OK
aql> execute test.set_min('minval', 5) on test.set-min where PK=2
+---------+
| set_min |
+---------+
| 5 |
+---------+
1 行记录 (0.001 秒)
OK
aql> execute test.set_min('minval', 7) on test.set-min where PK=2
+---------+
| set_min |
+---------+
| 5 |
+---------+
1 行记录 (0.000 秒)
还有其他的方法吗?
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 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 代码?

在任何数据库中,用户定义的函数都比本地操作运行的更慢。Aerospike也不例外,Lua UDF的延迟会更高,而且不会像本地操作那样扩展得很好。
Aerospike的List和Map数据类型有广泛(并且不断增长)的原子操作API。这些操作可以合并成单个多操作事务(使用operate()方法)。
我们可以利用有序列表来执行与上面的UDF相同的原子操作,以更快且更好地扩展的方式进行。
set_min.py
from __future__ import print_function import aerospike from aerospike import exception as e from aerospike_helpers.operations import list_operations as lh import pprint import sys def set_min(bin_name, val): list_policy = { "list_order": aerospike.LIST_ORDERED, "write_flags": (aerospike.LIST_WRITE_ADD_UNIQUE | aerospike.LIST_WRITE_PARTIAL | aerospike.LIST_WRITE_NO_FAIL) } ops = [ lh.list_append(bin_name, val, list_policy), lh.list_remove_by_rank_range(bin_name, 0, aerospike.LIST_RETURN_NONE, 1, True), lh.list_get_by_rank(bin_name, 0, aerospike.LIST_RETURN_VALUE) ] return ops config = {'hosts': [('172.16.39.132', 3000)]} client = aerospike.client(config).connect() pp = pprint.PrettyPrinter(indent=2) key = ('test', 'set-min', 1) key, meta, bins = client.operate(key, set_min('minval', 11)) pp.pprint(bins['minval']) key, meta, bins = client.operate(key, set_min('minval', 9)) pp.pprint(bins['minval']) key, meta, bins = client.operate(key, set_min('minval', 5)) pp.pprint(bins['minval']) key, meta, bins = client.operate(key, set_min('minval', 7)) pp.pprint(bins['minval']) client.close()使用参数11,9,5,7运行:
这三个操作在记录锁下以原子方式发生。
有关参考信息,请参阅Python客户端的文档。