1.编写lua脚本用于生成主键ID序列号,内容如下

local key = tostring(KEYS[1]);
local count = tonumber(KEYS[2]);
local dateStr = tostring(KEYS[3]);local newKey = key .. "_" .. dateStr;
local numRedis = redis.call("incr", newKey);
print(numRedis);if (numRedis == 1) thenredis.call("expire",newKey,60);
end-- 计算数字的位数
local function DightNum(num)if math.floor(num) ~= num or num < 0 thenreturn -1;elseif 0 == num thenreturn 1;elselocal tmp_dight = 0;while num > 0 donum = math.floor(num/10);tmp_dight = tmp_dight + 1;endreturn tmp_dight;end
end-- 在整数数字前面加0
-- dest_dight 标识最终生成位数,例如 AddZeroFrontNum(5, 1) 计算后是00001
local function AddZeroFrontNum(dest_dight, num)local num_dight = DightNum(num);if -1 == num_dight thenreturn -1;elseif dest_dight <= num_dight thenreturn tostring(num);elselocal str_e = ""for var =1, dest_dight - num_dight dostr_e = str_e .. "0";endreturn str_e .. tostring(num);end
endlocal idStr = AddZeroFrontNum(count, numRedis);
return dateStr .. idStr;

2.redis加载lua脚本文件

redis-cli -a redis script load "$(cat getGenerateId.lua)"
"b3d58fe8b47b1ca1e1fb074db5c3506a09ffdae8"

-a: redis密码,如果没有密码,该项不需要输入
下面的字符串即为加载后redis保存的sha值,通过该sha值可以访问lua脚本

3.java代码执行缓存的lua脚本文件

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import redis.clients.jedis.Jedis;import java.text.DateFormat;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;
@Service
public class RedisService {private static final DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");@Autowiredprivate RedisTemplate<String, String> redisTemplate;public Object executeScript(final String sha, final List<String> keys, final ArrayList<String> vals) {return redisTemplate.execute(new RedisCallback() {@Overridepublic Object doInRedis(RedisConnection connection) throws DataAccessException {Jedis jedis = (Jedis) connection.getNativeConnection();return jedis.evalsha(sha, keys, vals);}}, true);}/*** 每秒从 1 开始生成唯一标识,包括时间戳:yyyyMMddHHmmss* 最终格式为:yyyyMMddHHmmss + 四位有序数字* @param sha     redis中生成lua脚本的序列号* @param key     redis中存放id的key前缀* @param length  后面生成有序数字的位数* @return*/public Long fetchUUID(String sha, String key, String length){List<String> keys = new ArrayList<>();keys.add(key);keys.add(length);Calendar now = new GregorianCalendar();String datetime = df.format(now.getTime());keys.add(datetime);Object obj = executeScript(sha, keys, new ArrayList<String>());return Long.parseLong(String.valueOf(obj));}
}

然后调用fetchUUID该方法就可以了,key和length自定义,sha为第二步生成值

转载于:https://www.cnblogs.com/alan319/p/10600641.html

java+redis+lua生成自动增长的ID序列号相关推荐

  1. django之 将字典数据导入数据库以及解决insert自动增长的id不是从1开始或不连续

    当我对mysql数据库进行insert插入操作时,发现insert自动增长的id不是从1开始或不连续 这个是我对我的mysql中的数据库zx里的configuration表进行insert字典格式的数 ...

  2. 写出一条Sql语句,取出表A中的第31条到第40条记录。表A以自动增长的ID作为主键。(注意:ID可能不是连续的)

    写出一条Sql语句,取出表A中的第31条到第40条记录.表A以自动增长的ID作为主键.(注意:ID可能不是连续的).笔试的时候经常会出现这道题,网上的答案也是龙鱼混杂,今天自己实践了一下,找出了正确的 ...

  3. SQL获取刚插入的记录的自动增长列ID的值

    假设表结构如下: CREATE TABLE TestTable ( id int identity, CreatedDate datetime ) SQL2005获得新增行的自动增长列的语句如下: i ...

  4. 使用redis批量生成主键(订单)Id

    前言: 在多线程.高并发情况下,某些业务场景需要创建唯一标识的主键(订单)Id:通常情况下都是一个请求创建一个,考虑到性能和QPS我们会提前生成好一堆随机id保存到redis:从redis进行poll ...

  5. Java自动生成增量补丁自动部署_java-Hibernate正在为表生成自动增量交替ID

    我的环境:WAMP中的Hibernate 5,Java 8,Phpmyadmin 问题:Hibernate在表中创建自动增量ID,但是下一个序列被赋予另一个表. 预期 Table 1 Table 2 ...

  6. 解决 mysql 自动增长的 id 不是从 1 开始 或 不连续

    原因:1.insert 失败后,id 已自动增加,会造成 id 不连续 2.delete 后,再重新插入数据后,id 会从删除前最后的 id 开始增加,造成 id 不是从1开始增加 注意:删除全部数据 ...

  7. MySQL 数据库生成自动增长序号

    Oracle 数据库中有 ROWNUM 这个功能,查询 list 后生成序号,很是方便,但 MySQL 是模拟了 Oracle 和 SQL Server 中的大部分功能,可自动生成序号却没有现成的函数 ...

  8. .NET Core EntityFramework生成自动增长的主键

    在使用 .NET Core的时候,希望主键可以递增,不需要你手动输入,然后我找到了一个回答,地址:c# - EntityFramework Core auto generate key id prop ...

  9. java项目实现流水号自动增长

    项目中有一个规则编号字段,从1开始,编号长度为5位,那么第一条数据编号就是00001. 实现的基本思路就是项目启动时,从数据库获取当前最大值,作为静态变量存储: 业务获取新的编码,考虑并发问题,获取编 ...

最新文章

  1. 什么时候应该在C ++中使用类与结构?
  2. python【力扣LeetCode算法题库】5- 最长回文子串
  3. wincc客户机打开服务器文件通讯不上,wincc客户机连不上服务器
  4. 企业员工工资管理系统
  5. 一旦上云,欲罢不能,带大家薅一薅“云羊毛”
  6. Android OpenGL ES(十二):三维坐标系及坐标变换初步 .
  7. ip代理 12-02-03
  8. JavaScript按住鼠标左键选中元素, 实现框选(Rubberband)效果
  9. Flutter tween动画
  10. 22届滴滴校招礼盒开箱记录~
  11. 从程序员角度看“上帝“玩游戏
  12. (动归三剑客)打家劫舍 (动归三剑客)
  13. 数学建模_数学模型的分类数学建模十大算法
  14. 一文详解脏读、不可重复读、幻读
  15. 毕业设计EMS办公管理系统(B/S结构)+J2EE+SQLserver8.0
  16. 今天,辛辛苦苦开发的雷超站终于上线了
  17. java properties 遍历_如何遍历properties文件的键值对并放置到application作用域里
  18. android studio ant编译,Android Studio编译cocos2dx项目
  19. 第二季4:初始化MPP系统(step12)
  20. 镜像法的理解——工程电磁场 P9

热门文章

  1. windows 10开机后弹出的certificate选择弹出窗
  2. SAP S/4HANA里修改了Business Partner后的调试入口
  3. SAP Cloud for Customer销售订单Account字段的实现逻辑
  4. Ubuntu2004,虚拟机中使用,解决系统图标变大变小以及分辨率降低问题
  5. java applet 游戏_Java Applet实现五子棋游戏
  6. html 输入框变红色,input输入框 输入错误时,点击注册按钮,输入框的边框变成红色,重新输入时,边框颜色恢复原来的,同时错误提示消失?...
  7. detectandcompute 图像尺寸太大_基于深度局部特征的图像检索
  8. python注释_python中的单行注释、多行注释
  9. 苹果字体怎么改_GoodNotes制作电子手帐之添加中文字体
  10. 买卖股票的最佳时机Python解法