0
点赞
收藏
分享

微信扫一扫

基于Redis实现分布式自增主键


文章目录

  • ​​一、原理​​
  • ​​二、实战​​
  • ​​1、maven中新增redis依赖​​
  • ​​2、redis连接属性配置​​
  • ​​3、自定义Redis主键生成器RedisIdentifierGenerator​​
  • ​​4、指定主键id的生成策略`IdType.ASSIGN_ID`​​
  • ​​5、测试​​

一、原理

基于Redis实现分布式自增主键的核心原理是​​INCR​​命令,每次调用将对应键 key 储存的数字值加上1,所以可以轻松实现类似Mysql数据库中的自增主键。

缺点:只支持数值型主键,如果缓存丢失,会造成主键重复。

[root@Mobile redis-stable]# redis-cli 
127.0.0.1:6379> incr mycounter
(error) NOAUTH Authentication required.
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> incr mycounter
(integer) 1
127.0.0.1:6379> incr mycounter
(integer) 2
127.0.0.1:6379>

二、实战

整体项目还是采用​​spring boot + mybaits-plus + mysql​

其他内容可以参考:​​mybatis-plus雪花算法生成Id使用详解​​

本文主要是将其中默认的雪花算法的ID生成器替换成了自定义的Redis分布式ID生成器。

1、maven中新增redis依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2、redis连接属性配置

spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=123456

3、自定义Redis主键生成器RedisIdentifierGenerator

@Component
public class RedisIdentifierGenerator implements IdentifierGenerator{
@Resource
RedisTemplate redisTemplate;

@Override
public Number nextId(Object entity) {
//可以将当前传入的class全类名来作为bizKey,或者提取参数来生成bizKey进行分布式Id调用生成.
String bizKey = entity.getClass().getName();
//根据bizKey调用分布式ID生成
return redisTemplate.opsForValue().increment(bizKey);
}
}

4、指定主键id的生成策略​​IdType.ASSIGN_ID​

@TableName(value ="user")
@Data
@EqualsAndHashCode
public class User implements Serializable {
/**
* 主键ID
*/
@TableId(value = "id",type = IdType.ASSIGN_ID)
//@TableId(value = "id",type = IdType.AUTO)
private Long id;

/**
* 姓名
*/
private String name;

/**
* 年龄
*/
private Integer age;

/**
* 邮箱
*/
private String email;

@TableField(exist = false)
private static final long serialVersionUID = 1L;
}

5、测试

@Test
public void testInsert() {
System.out.println("----- insert method test ------");
User user = new User();
user.setName("test");
user.setAge(13);
user.setEmail("101@qq.com");
userMapper.insert(user);
System.out.println(user.toString());
}

由RedisIdentifierGenerator分配了主键id为1


举报

相关推荐

0 条评论