boot整合redis 压力测试出现失败
解决方案 排除lettuce 使用jedis
<!-- 引入redis --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><exclusions><exclusion><groupId>io.lettuce</groupId><artifactId>lettuce-core</artifactId></exclusion></exclusions></dependency><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId></dependency>
最终使用的都是redisTemplate
缓存穿透
分布式锁
分布式锁演示过程
进阶2 设置过期时间和不存在则枷锁
占锁
锁的值应该是一个唯一标识,不然分布式应用,相同的value 会引起此服务将另外的服务的锁给释放掉了
释放锁
删除也必须是原子性的,否则有可能redis在传输过程中已过期,结果没结果删
完整(保证一定会释放锁)
完整操作
使用redisson
引入依赖
<!-- 以后使用Redisson作为所有分布式锁 --><dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.12.0</version></dependency>
创建配置类
@Configuration
public class MyRedissonConfig {/*** 所有对Redisson的使用都是通过RedissonClient* @return* @throws IOException*/@Bean(destroyMethod="shutdown")public RedissonClient redisson() throws IOException {//1、创建配置Config config = new Config();config.useSingleServer().setAddress("redis://192.168.1.100:6379");//2、根据Config创建出RedissonClient实例//Redis url should start with redis:// or rediss://RedissonClient redissonClient = Redisson.create(config);return redissonClient;}}
使用
方式2
给锁设置过期时间
最佳实战
我们设置所得过期时间,时间设置的大一些,然后手动枷锁,手动解锁
读写锁
此问题是,读写调用的时候,读锁只有写锁完成并释放,才可以获取到锁
闭锁
三个班的人都走了,才可以关门
信号量
尝试获取一下,不行就算了,不至于一直等待