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


一、原理

基于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
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/w1014074794/article/details/129404281