关注我,更多精彩文章第一时间推送给你

这里需求是创建每日的流水号,例如:每向数据库中添加一条数据,其编号设置为yyyyMMdd0001、yyyyMMdd0002这样的格式,日期加后四位为当日流水号,也就是当日第几个添加的数据。

  • 为什么考虑使用redis呢?

额、redis的特性就不介绍了,反正本文也不是介绍redis怎么使用的…

简而言之,为了显示自己用过redis而用,哈哈哈

  • 这里docker启动redis遇到一个问题,记录一下
#创建容器的时候报错WARNING: IPv4 forwarding is disabled. Networking will not work.
#这个错导致连接不上redis,但是在容器内部docker exec -it redis bash     redis-cli能够使用
#我启动redis容器的命令
docker run -d --privileged=true --restart=always -p 6379:6379 -v /usr/docker/redis/data:/data --name redis redis:latest redis-server --appendonly yes
#解决办法
vim  /usr/lib/sysctl.d/00-system.conf
#添加下面这行
net.ipv4.ip_forward=1
#重启network
systemctl restart network
#删除错误的重启重新执行启动redis的命令
docker stop redis
docker rm redis
  • 创建一个spring boot项目,在pom.xml中引入如下依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--因为Springboot 2.0 中redis客户端使用了Lettue, 其依赖于commons-->
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId>
</dependency>
  • 配置application.yml连接redis
spring:redis:host: 192.168.16.128port: 6379# 连接超时时间(记得添加单位,Duration)timeout: 10000ms# Redis默认情况下有16个分片,这里配置具体使用的分片# database: 0lettuce:pool:# 连接池最大连接数(使用负值表示没有限制) 默认 8max-active: 8# 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1max-wait: -1ms# 连接池中的最大空闲连接 默认 8max-idle: 8# 连接池中的最小空闲连接 默认 0min-idle: 0
  • 创建redis操作类,这里主要利用的redis自增操作
@Component
@Slf4j
public class RedisCacheTemplate {@Resourceprivate RedisTemplate<String, Object> redisTemplate;/*** @Title: incr* @Description: 获取redis自增序号* @param key redis的 key值* @param delta 自增的增量* @return*/public long incr(String key, long delta, long time) {try {long l = redisTemplate.opsForValue().increment(key, delta);if (time > 0) {expire(key, time);}return l;} catch (Exception e) {log.error("redis获取" + key + "失败", e);return -1;}}/*** @Title: expire* @Description: 设置过期时间* @param key* @param time* @return*/public boolean expire(String key, long time) {try {if (time > 0) {redisTemplate.expire(key, time, TimeUnit.SECONDS);}return true;} catch (Exception e) {log.error("redis设置" + key + "过期时间失败", e);return false;}}
}
  • 把获取到的redis自增的序号格式化成指定格式0001/0002/…
public class SequenceUtil {private static final int DEFAULT_LENGTH = 3;/*** 将传入的数 seq 格式化成 length 位,不够前边补 0* 如果 length < 3 则按照 3 算* @param seq* @param length* @return*/public static String getSequence(long seq, int length) {String str = String.valueOf(seq);int len = str.length();length = Math.max(length, DEFAULT_LENGTH);if (len >= length) {return str;}int rest = length - len;StringBuilder sb = new StringBuilder();for (int i = 0; i < rest; i++) {sb.append('0');}sb.append(str);return sb.toString();}
}
  • 测试获取到的yyyyMMdd0001格式的每日流水号
@SpringBootTest
@Slf4j
class DemoRedisApplicationTests {private static final String  SERIAL_NUM= "redis:serialNumber:";@Autowiredprivate RedisCacheTemplate redisCacheTemplate;@Testvoid contextLoads() {String currentDate = new SimpleDateFormat("yyyyMMdd").format(new Date());String key = SERIAL_NUM + currentDate;long incr = redisCacheTemplate.incr(key, 1, 86400);//移位运算符<<,左移几位相当于乘以2的几次方, 1 << 2 = 4String code = SequenceUtil.getSequence(incr, 1 << 2);log.info(currentDate + code);}}

解释一下:用redis:serialNumber:20200409这个作为redis的key去查找自增值,每次执行加1

redis中的key-value将是这样:

key value

redis:serialNumber:20200409 0001

redis:serialNumber:20200409 0002

直到下一天key变成了redis:serialNumber:20200410,value则会从0001开始递增

又因为我设置了redis的过期时间是86400秒 = 1天,所以过期的数据会自动删除

  • 看一下控制台的log日志

  • 在执行一次

使用redis特性来创建每日流水号相关推荐

  1. 【低功耗蓝牙】③ 蓝牙服务和特性的创建

    摘要 本文章主要基于ESP32的MicroPython平台,讲解了蓝牙服务和特性的建立,以及基于特性的数据交互,实现手机于蓝牙模块相互通信.主要涉及的概念有 UUID,GATT,服务,特性 UUID ...

  2. 利用多态特性,创建一个手机类Phones,定义打电话的方式call,创建三个子类,并在各自的方法中重写方法,编写程序入口main()方法,实现多种手机打电话...

    |--需求说明 利用多态特性,创建一个手机类Phones,定义打电话的方式call,创建三个子类,并在各自的方法中重写方法,编写程序入口main()方法,实现两种手机打电话 |--解题思路 采用简单工 ...

  3. Azure Redis Cache (3) 创建和使用P级别的Redis Cache

    <Windows Azure Platform 系列文章目录> 在笔者之前的文档里面已经说明了,Azure Redis Cache分为三个不同的级别: - 基本,Basic,不包含SLA ...

  4. 青蛙换位置excel_吃青蛙:如何在Excel中创建每日交付的sprint消耗图

    青蛙换位置excel In the first article I wrote on how to create a SCRUM-based, sprint burn down in Excel, H ...

  5. 基于Redis实现多模块共享流水号生成

    public String obtainSyntheticBatchNo() {String begin = "0001";String dateTime = DateFormat ...

  6. 阿里云redis数据库的创建与使用

    1.登录阿里云搜索云数据库redis 2.点击创建实例 3.选择对应的信息 设置密码并购买,注意阿里云账户需要有一定余额! 4.点击示例id,(蓝色的文字) 申请公网访问地址 5.记录地址并保存,点击 ...

  7. java8 list切片_Java8新特性_创建 Stream、流筛选与切片

    package com.atguigu.java8; import java.util.ArrayList; import java.util.Arrays; import java.util.Ite ...

  8. 软件架构-redis特性和集群特性(上)

    上次已经说到了redis其实就是nosql,这次具体redis是个什么样的东西. (一)Redis安装 通过虚拟机的方式在centos7下面安装下,这次我不通过docker的方式了,按照正常的方式,让 ...

  9. oracle 12c新特性(1)——创建新用户(公用用户名或角色名无效)

    GRANT CONNECT,RESOURCE,UNLIMITED TABLESPACE TO C##SCOTT IDENTIFIED BY TIGER container=all; ALTER USE ...

最新文章

  1. @property疑难杂症
  2. sqlalchemy mysql配置中怎么设置utf8_sqlalchemy 的设置及使用
  3. ★ 科幻分离式手机 富士通F-04B详细图解 ★
  4. CG CTF CRYPTO 异性相吸
  5. 打印机一直显示正在打印中_中国和桌面3D打印机正在引领3D打印市场
  6. LeetCode 327. 区间和的个数(multiset二分查找/归并排序)
  7. Format Currency Sample
  8. idea设置中文界面_英雄联盟手游中文翻译--游戏主页设置界面翻译
  9. volatile和原子操作
  10. 算法第五章上机实践报告
  11. springboot文件上传和下载工具_SpringBoot图文教程7—SpringBoot拦截器的使用姿势这都有...
  12. 触发器、作业、序列、连接
  13. python-编程之美
  14. 2.1 图像验证码(英文验证码、超级鹰)
  15. Your GPU Compute Capability计算能力
  16. 微信公众平台开发-access_token获取及应用(含源码)
  17. DragonBones+Unity 实现换装
  18. C#反编译工具:.NET Reflector基础使用
  19. 用ps做个一寸的照片
  20. 基于PP-Human V2的闯入人员检测

热门文章

  1. AI大时代——一次全新的生产力革命
  2. java jlabel用法_java swing JLabel详解以及使用示例
  3. java jlabel_java – 如何将JLabel放在JLabel中或将JLabel划...
  4. TTS 文字转语音 语音转文字
  5. python中逗号在print的作用_Python 逗号的几种作用
  6. 跟java有关的搞笑句子,搞笑又不失可爱的句子50句
  7. win10的剪贴板在哪里?
  8. PDF.js预览文件
  9. STM32HAL库-F4-针对芯片内部FLASH读保护实现防篡改、破解功能(详解)
  10. 稻盛和夫的灵魂7问,句句让人醍醐灌顶,胜读10年书