使用 Redis 实现分布式锁案例

目录
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到工程

org.springframework.boot spring-boot-starter-data-redis org.apache.commons commons-pool2 2.6.0 org.redisson redisson 3.11.2 server: port: 8206 spring: redis: host: xxxxx port: 6379 database: 0 timeout: 1800000 password: lettuce: pool: max-active: 20 #最大连接数 max-wait: -1 #最大阻塞等待时间(负数表示没限制) max-idle: 5 #最大空闲 min-idle: 0 #最小空闲 1.1添加redis配置类 @Configuration @EnableCaching public class RedisConfig {
@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
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值