如何在Redis中实现多用户安全的线性同余生成器?
2013-6-11 17:46:54
收藏:0
阅读:103
评论:1
我使用线性同余生成器(http://en.wikipedia.org/wiki/Linear_congruential_generator)生成暴露给用户的 ID。
nextID = (a * LastID + c) % m
现在我想在 Redis 中实现 LCGs。 以下是问题所在:在 Redis 之外获取当前 ID 并生成下一个 ID 不是多用户安全的。 Redis 有 2 个可用于简单计数器的命令:INCRBY 和 INCRBYFLOAT,但不幸的是,Redis 并不原生支持模操作。 目前我唯一看到的方法是使用 EVAL 命令并编写一些 lua 脚本。
更新1:
一些类似于
INCRBY LCG_Value ((LCG_Value*a+c)%m)-LCG_Value
的 lua 模拟似乎是实现此目的的一种简洁方法。
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的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 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
使用服务器端的 Lua 脚本很可能是最简单和更高效的方法。
现在也可以使用 Redis 基本操作使用多个/执行块来完成。以下是伪代码:
while not successful: WATCH LCG_Value $LastID = GET LCG_value $NextID = (a*$LastID+c)%m MULTI SET LCG_value $NextID EXEC当然,它比以下 Lua 脚本不够高效:
# 设置初始值 SET LCG_value 1 # 执行带有 a、c 和 m 参数的 LCG_value 上的 Lua 脚本 EVAL "local last = tonumber(redis.call( 'GET', KEYS[1])); local ret = (last*ARGV[1] + ARGV[2])%ARGV[3]; redis.call('SET',KEYS[1], ret); return ret; " 1 LCG_value 1103515245 12345 2147483648注意:整个脚本执行是原子的。请参见 EVAL 文档。