在实际的业务场景中,我们会用到流水号。

之前的流水号做法是,使用redis的全局锁。然后对数据库进行更新,数据库更新 这个也会有一些问题,比如对于同一个流水号,多个线程去更新,由于事务比较长,那么就会导致数据库被锁定。

这个可以使用redis的lua 脚本去解决。

由于redis 是单线程的处理模式,因此执行 lua 脚本的时候,是不会有并发问题的。

相关代码:

private Long getNo(String key,Integer initVal,Short step,Integer timeout){
DefaultRedisScript<Long> redisScript= new DefaultRedisScript<>(); //setex (key,timeout,val)
String script="if(redis.call('exists',KEYS[1])==0) then redis.call('setex',KEYS[1], tonumber(KEYS[4]), tonumber(KEYS[2])) else redis.call('incrby',KEYS[1],tonumber(KEYS[3])) end return tonumber(redis.call('get',KEYS[1]))"; redisScript.setScriptText(script); List list=new ArrayList<>();
//键
list.add(key);
//初始值
list.add(initVal.toString());
//步长
list.add(step.toString());
//超时时间
list.add(timeout.toString()); redisScript.setResultType(Long.class); Long rtn=(Long) redisTemplate.execute(redisScript,list); return rtn;
}

这里需要注意的是,KEYS 为参数,list为参数传入,这里需要保证数据的类型和redis 的函数保持一致。

另外我们需要保证redis 的存储。

我们可以使用AOF模式

//启动AOf
appendonly yes
//每秒同步
appendfsync everysec

redis 使用lua 生成流水号的更多相关文章

  1. Redis调用lua生成验证码

    场景: ​ 通过微信公众号拿验证码在APP上绑定,为了防止重复,尝试使用reids-lua的方法实现此功能 以下是 php 调用 redis.eval 方法传入的 lua 方法,当然这只是修改后的,保 ...

  2. java,mysql触发器,redis生成流水号(yyyyMM000)

    最近又遇到需要根据日期生成流水号的业务,然后记录了几种生成方法,一个是通过java代码,一个是数据库的触发器,还有是通过redis.下面是代码: 通过java生成简易流水: /** * 通过日期和生成 ...

  3. redis(6)lua脚本

    一.lua脚本 lua是一种轻量小巧的脚本语言,用标准的C语言编写并以源代码形式开放,其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能. lua的详细内容你可以参考lua官方网站 ...

  4. .Net Core使用分布式缓存Redis:Lua脚本

    一.前言 运行环境window,redis版本3.2.1.此处暂不对Lua进行详细讲解,只从Redis的方面讲解. 二.Redis的Lua脚本 在Redis的2.6版本推出了脚本功能,允许开发者使用L ...

  5. 要想用活Redis,Lua脚本是绕不过去的坎

    前言 Redis 当中提供了许多重要的高级特性,比如发布与订阅,Lua 脚本等.Redis 当中也提供了自增的原子命令,但是假如我们需要同时执行好几个命令的同时又想让这些命令保持原子性,该怎么办呢?这 ...

  6. Redis之Lua的应用(四)

    一.什么是Lua脚本 Lua是一个高效的轻量级脚本语言(和JavaScript类似),用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能.Lu ...

  7. PHP中使用redis执行lua脚本示例

    摸索了一下在PHP中如何使用redis执行lua脚本,写了一个脚本如下,供以后参考 <?php $redis = new Redis(); #实例化redis类 $redis->conne ...

  8. redis之lua脚本

    背景介绍 redis数据库提供了一些管理功能比如 流水线:打包发送多条命令,并在一个回复里面接收所有被执行命令的结果.事务:一次执行多条命令,被执行的命令要么就全部都被执行,要么就一个也不执行.并且事 ...

  9. Webfrom 生成流水号 组合查询 Repeater中单选与复选控件的使用 JS实战应用

                                             Default.aspx 网页界面 <%@ Page Language="C#" AutoE ...

  10. Webfrom 生成流水号 组合查询 Repeater中单选与复选控件的使用 JS实战应用

                                             Default.aspx 网页界面 <%@ Page Language="C#" AutoE ...

随机推荐

  1. sql 分组查询并新增序号

    在SQL中,你可以使用ROW_NUMBER()函数来为结果集中的每一行新增一个序号.这个序号是基于某个排序条件的分区排序结果. 以下是一个简单的例子,假设我们有一个名为students的表,它有两列: ...

  2. 项目完成小结:使用DjangoStarter v3和Taro开发的微信小程序

    前言 不知不觉已经九月了,又到了一年的开学季,我每年都想做的项目墙甚至连个影子都没有- 最近生活中的琐事太多了,导致完全没有想写文章的动力,不过再怎么拖还是得记录,随便写写吧~ 这次是7月份的一个小项 ...

  3. 支付宝携手HarmonyOS SDK打造高效便捷的扫码支付体验

    背景 在日常的购物转账.生活缴费等在线支付中,用户在正式拉起支付界面前,均需要至少经历一次"识别"+两次"寻找",即识别归属应用.寻找应用.寻找扫码入口,才能完 ...

  4. Identity – Authorize

    前言 Authorize 授权和 Identity Framework 关系不是很大. 虽然 Framework 有帮忙处理 Role, Claims 这些, 但这些只是整个 Authorize 小部 ...

  5. JavaScript——事件监听

    事件监听      1.事件绑定        2.常见事件     

  6. transaction_timeout:达到事务超时时终止会话

    功能实现背景说明 我们已经有两个参数来控制长事务:statement_timeout 和 idle_in_transaction_session_timeout.但是,如果事务执行的命令足够短且不超过 ...

  7. JVM--解析运行期优化与JIT编译器

    JVM开发团队一直在努力,缩小Java与C/C++语言在运行效率上的差距. 本篇博客,我们来谈一谈JVM(HotSpot)为了提高Java程序的运行效率,都实现了哪些激动人心的技术- 1 JIT编译器 ...

  8. 2021年1月国产数据库排行榜:OceanBase重回前三,TDSQL增长趋势最强劲!

    墨天轮国产数据库排行榜新年第一期已发布.2021年1月份排行榜前三甲依次为 TiDB .DaMeng.OceanBase .PingCAP TiDB 稳居冠军的宝座,短时间内难以撼动,开源的商业数据库 ...

  9. otdolist 案例

    1. 渲染默认任务 2. 回车添加任务 3. 删除任务 4. 底部任务数量 5.  tab栏切换 6. tab切换显示不同任务 7. 清除已完成的任务 8.  头部全选 9. 删除任务

  10. 55.父页面通过ifaram嵌套子页面,如何固定子页面菜单

    使用固定定位 :