采用INCR命令来实现分布式全局ID生成。
org.springframework.boot
spring-boot-starter-data-redis
# Redis配置
spring.redis.host=192.168.1.160
#Redis服务器连接端口
spring.redis.port=6379
#Redis服务器连接密码(默认为空)
spring.redis.password=123456
#连接池最大连接数(使用负值表示没有限制)
spring.redis.max-active=8
#连接池最大阻塞等待时间(毫秒)(使用负值表示没有限制)
spring.redis.max-wait=30000
#连接池中的最大空闲连接
spring.redis.max-idle=8
#连接池中的最小空闲连接
spring.redis.min-idle=0
#连接超时时间(毫秒)
spring.redis.timeout=30000
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory factory) {
RedisTemplate template = new RedisTemplate<>();
// 配置连接工厂
template.setConnectionFactory(factory);
//使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式)
Jackson2JsonRedisSerializer jacksonSeial = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
// 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
// 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常
om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
jacksonSeial.setObjectMapper(om);
// key序列化
template.setKeySerializer(new StringRedisSerializer());
// value序列化
template.setValueSerializer(jacksonSeial);
// Hash key序列化
template.setHashKeySerializer(new StringRedisSerializer());
// Hash value序列化
template.setHashValueSerializer(jacksonSeial);
template.afterPropertiesSet();
return template;
}
}
@Service
public class RedisService {
@Autowired
private StringRedisTemplate stringRedisTemplate;
private static final String ID_KEY = "id:generator:order";
private static final long BASE_ID = 1000000000;
/**
* 生成唯一ID
* @date 2022/7/18 16:03
*/
public long getUniqueId() {
long inc = stringRedisTemplate.opsForValue().increment(ID_KEY);
System.out.println(BASE_ID + inc);
return BASE_ID + inc;
}
}
redis.clients
jedis
jedis.pool.host=192.168.1.201
jedis.pool.port=6379
jedis.pool.password=123456
jedis.pool.timeout=7200
jedis.pool.config.maxTotal=1000
jedis.pool.config.maxIdle=100
jedis.pool.config.minIdle=50
jedis.pool.config.maxWaitMillis=1000
jedis.pool.config.testOnBorrow=true
@Configuration
public class RedisConfig {
@Bean
public JedisPoolConfig jedisPoolConfig(@Value("${jedis.pool.config.maxTotal}") int maxActive,
@Value("${jedis.pool.config.maxIdle}") int maxIdle,
@Value("${jedis.pool.config.minIdle}") int minIdle,
@Value("${jedis.pool.config.maxWaitMillis}") long maxWaitMillis,
@Value("${jedis.pool.config.testOnBorrow}") boolean testOnBorrow) {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxTotal(maxActive);
jedisPoolConfig.setMaxIdle(maxIdle);
jedisPoolConfig.setMinIdle(minIdle);
jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);
jedisPoolConfig.setTestOnBorrow(testOnBorrow);
return jedisPoolConfig;
}
@Bean
public JedisPool jedisPool(@Value("${jedis.pool.host}") String host,
@Value("${jedis.pool.port}") int port,
@Value("${jedis.pool.password}") String password,
@Value("${jedis.pool.timeout}") int timeout, JedisPoolConfig jedisPoolConfig) {
if (password == null || password.length() == 0) {
return new JedisPool(jedisPoolConfig, host, port, timeout);
}
return new JedisPool(jedisPoolConfig, host, port, timeout, password);
}
}
@Service
public class RedisService {
@Autowired
private JedisPool jedisPool;
private static final String ID_KEY = "id:generator:order";
private static final long BASE_ID = 1000000000;
/**
* 生成唯一ID
* @date 2022/7/18 16:03
*/
public long getUniqueId() {
Jedis jedis = jedisPool.getResource();
long inc = jedis.incr(ID_KEY);
System.out.println(BASE_ID + inc);
return BASE_ID + inc;
}
}