<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
spring:
redis:
database: 1
lettuce:
pool:
max-active: 8
max-wait: -1
max-idle: 8
min-idle: 0
cluster:
nodes:
- 192.168.66.101:7000
- 192.168.66.101:7001
- 192.168.66.101:7002
- 192.168.66.101:7003
- 192.168.66.101:7004
- 192.168.66.101:7005
@Configuration
@EnableCaching
public class RedisConfig {
private Duration timeToLive = Duration.ofHours(1);
@Bean
public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory connectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
template.setConnectionFactory(connectionFactory);
// GenericJackson2JsonRedisSerializer jackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
// key采用String的序列化方式
template.setKeySerializer(stringRedisSerializer);
// hash的key也采用String的序列化方式
template.setHashKeySerializer(stringRedisSerializer);
// value序列化方式采用jackson
template.setValueSerializer(jackson2JsonRedisSerializer);
// hash的value序列化方式采用jackson
template.setHashValueSerializer(jackson2JsonRedisSerializer);
// 初始化 RedisTemplate 序列化完成
template.afterPropertiesSet();
return template;
}
private void setSerializer(StringRedisTemplate template) {
@SuppressWarnings({ "rawtypes", "unchecked" })
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
template.setValueSerializer(jackson2JsonRedisSerializer);
}
@Bean
public CacheManager cacheManager(RedisConnectionFactory factory) {
RedisSerializer<String> redisSerializer = new StringRedisSerializer();
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
//解决查询缓存转换异常的问题
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
// 配置序列化(解决乱码的问题)
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(timeToLive)
// 设置key的序列化方式
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
// 设置value的序列化方式
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
// 不缓存null值
.disableCachingNullValues();
RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
.cacheDefaults(config)
.build();
return cacheManager;
}
/**
* 对hash类型的数据操作
*
* @param redisTemplate
* @return
*/
@Bean
public HashOperations<String, String, Object> hashOperations(RedisTemplate<String, Object> redisTemplate) {
return redisTemplate.opsForHash();
}
/**
* 对redis字符串类型数据操作
*
* @param redisTemplate
* @return
*/
@Bean
public ValueOperations<String, Object> valueOperations(RedisTemplate<String, Object> redisTemplate) {
return redisTemplate.opsForValue();
}
/**
* 对链表类型的数据操作
*
* @param redisTemplate
* @return
*/
@Bean
public ListOperations<String, Object> listOperations(RedisTemplate<String, Object> redisTemplate) {
return redisTemplate.opsForList();
}
/**
* 对无序集合类型的数据操作
*
* @param redisTemplate
* @return
*/
@Bean
public SetOperations<String, Object> setOperations(RedisTemplate<String, Object> redisTemplate) {
return redisTemplate.opsForSet();
}
/**
* 对有序集合类型的数据操作
*
* @param redisTemplate
* @return
*/
@Bean
public ZSetOperations<String, Object> zSetOperations(RedisTemplate<String, Object> redisTemplate) {
return redisTemplate.opsForZSet();
}
// 自定义key生成器
@Bean
public KeyGenerator keyGenerator(){
return (o, method, params) ->{
StringBuilder sb = new StringBuilder();
sb.append(o.getClass().getName()); // 类目
sb.append(method.getName()); // 方法名
for(Object param: params){
sb.append(param.toString()); // 参数名
}
return sb.toString();
};
}
}
@Component
public class RedisUtil {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
/***
* 生成订单号
* 递增并设置过期时间,毫秒数算的 每天一次结算
* @yyMMddHHmm(6)-[店铺ID]-[今日订单数从1开始累加]
*/
public String getIncr(String shopId) {
LocalDateTime now = LocalDateTime.now();
String dateTime = DateTimeFormatter.ofPattern("yyMMdd").format(now);
//key规则:yyMMdd+shopId,有效期24小时
StringBuffer key =new StringBuffer(dateTime).append(shopId);
RedisAtomicLong entityIdCounter = new RedisAtomicLong(key.toString(), redisTemplate.getConnectionFactory());
Long increment = entityIdCounter.getAndIncrement();
if(increment==0) {
Long end = LocalDate.now().plusDays(1).atStartOfDay().toInstant(ZoneOffset.of("+8")).toEpochMilli();
Long cur = now.toInstant(ZoneOffset.of("+8")).toEpochMilli();
increment = entityIdCounter.getAndIncrement();
entityIdCounter.expire(end-cur, TimeUnit.MILLISECONDS);
}
DecimalFormat df=new DecimalFormat("00000");
return key.append(df.format(increment)).toString();
}
/***
* 递减,没有设置过期时间
*/
public Long getIndr(String shopId) {
LocalDateTime now = LocalDateTime.now();
String dateTime = DateTimeFormatter.ofPattern("yyMMdd").format(now);
//key规则:yyMMdd+shopId,有效期24小时
StringBuffer key =new StringBuffer(dateTime).append(shopId);
RedisAtomicLong entityIdCounter = new RedisAtomicLong(key.toString(), redisTemplate.getConnectionFactory());
Long indrement = entityIdCounter.getAndDecrement();
if(indrement==0) {
Long end = LocalDate.now().plusDays(1).atStartOfDay().toInstant(ZoneOffset.of("+8")).toEpochMilli();
Long cur = now.toInstant(ZoneOffset.of("+8")).toEpochMilli();
indrement = entityIdCounter.getAndDecrement();
entityIdCounter.expire(end-cur, TimeUnit.MILLISECONDS);
}
return indrement;
}
}
@Resource
private RedisUtil redisUtil;
@RequestMapping("order/{shopId}")
public String getId(@PathVariable("shopId") String shopId){
return redisUtil.getIncr(shopId);
}
版权声明:本文为qq_37705525原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。