目录
1.整合redis到工程
1.1添加redis配置类
二、分布式锁
2.1 本地锁的局限性
2.1.1 编写测试代码
2.1.2 使用ab工具测试
2.1.3 使用本地锁
2.1.4 本地锁问题演示锁
2.2 分布式锁实现的解决方案
2.3 使用redis实现分布式锁
2.3.1 编写代码
2.3.2 优化之设置锁的过期时间
2.3.3 优化之UUID防误删
2.3.4 优化之LUA脚本保证删除的原子性
2.3.5 总结
2.4 使用redisson 解决分布式锁
2.4.1 实现代码
2.4.2 可重入锁(Reentrant Lock)
2.4.3 读写锁(ReadWriteLock)
1.整合redis到工程
@Bean
public KeyGenerator wiselyKeyGenerator() {<!-- -->
return new KeyGenerator() {<!-- -->
@Override
public Object generate(Object target, Method method, Object... params) {<!-- -->
StringBuilder sb = new StringBuilder();
sb.append(target.getClass().getName());
sb.append(method.getName());
for (Object obj : params) {<!-- -->
sb.append(obj.toString());
}
return sb.toString();
}
};
}
@Bean
public RedisTemplate<object, object=""> redisTemplate(RedisConnectionFactory redisConnectionFactory) {<!-- -->
RedisTemplate<object, object=""> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
// 设置序列化对象,固定写法
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
// 将Redis 中 string ,hash 数据类型,自动序列化!
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
@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);
// 配置序列化(解决乱码的问题),过期时间600秒
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Durat