文章目录
一、原理
基于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("[email protected]");
userMapper.insert(user);
System.out.println(user.toString());
}
由RedisIdentifierGenerator分配了主键id为1