基于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生成器。
org.springframework.boot spring-boot-starter-data-redis
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=123456
@Component
public class RedisIdentifierGenerator implements IdentifierGenerator{@ResourceRedisTemplate redisTemplate;@Overridepublic Number nextId(Object entity) {//可以将当前传入的class全类名来作为bizKey,或者提取参数来生成bizKey进行分布式Id调用生成.String bizKey = entity.getClass().getName();//根据bizKey调用分布式ID生成return redisTemplate.opsForValue().increment(bizKey);}
}
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;
}
@Testpublic 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