redis生成自增主键 redis自增流水号缺陷

本文目录一览:

  • 1、java怎么使用redis的incr的自增序列生成8位长度的id
  • 2、java高性能订单流水号永远不重复8位数
  • 3、一起讨论下,消息幂等(去重)通用解决方案
java怎么使用redis的incr的自增序列生成8位长度的id【redis生成自增主键 redis自增流水号缺陷】1、实现方式:String在redis内部存储默认就是一个字符串,被redisObject所引用,当遇到incr、decr等操作(自增自减等原子操作)时会转成数值型进行计算,此时redisObject的encoding字段为int 。
2、id++;} 在上面的代码中,我们定义了一个变量 id , 并将其初始化为 0 。然后 , 我们使用一个无限循环来不断打印 ID 。
3、id长度可控 。雪花算法生成的id是一个64位的整数,其中包括了时间戳、机器id、序列号等信息,不同位数的id可以通过调整这些信息的位数来实现 。
java高性能订单流水号永远不重复8位数既然是流水不重复,那么这个变量一定是常驻内存 。简单的方法当然是个静态变量 。。
package Snsq;import java.util.*;public class java8 {//随机数字(0~N)不重复的数字,过程及随机所需的次数 。
sequence 是数据库级别的流水号 java生成流水号一般都用uuid生成32位的ID值 , 确保不会重复 。
这样算下来,时间戳+ip 刚好19位,同一毫秒只能有一笔订单 。很显然这样的重复几率有点太大了 。但是又不能超过长度,最后我选定的方法是,舍弃时间戳的第一位,留一位用来做序列 。
那么最后这个id的生成方式就变成了 12位时间戳 + 6位ip + 1位自增序列 。虽然是分布式环境,但是序列并没有分布式,而是维护在了本地 。
一起讨论下,消息幂等(去重)通用解决方案如果要保证一致性,需要生产者在失败后重试,不过重试又会导致消息重复的问题,一个解决方案是每个消息给一个唯一的id,通过服务端的主动去重来避免重复消息的问题,不过这一机制目前Kafka还未实现 。
服务器处理消息需要是幂等的,消息的生产方和接收方都需要做到幂等性; 发送放需要添加一个定时器来遍历重推未处理的消息,避免消息丢失,造成的事务执行断裂 。
Kafka本身支持At least once消息送达语义,因此实现消息发送的幂等关键是要实现Broker端消息的去重 。
另外打造一个高可靠的幂等服务还需要考虑很多问题,比如一台机器虽然把全局ID先写入了存储,但是在写入之后挂了 , 这就需要引入全局ID的超时机制 。使用全局唯一ID是一个通用方案,可以支持插入、更新、删除业务操作 。

    推荐阅读