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
给锁设置过期时间
最佳实战
我们设置所得过期时间,时间设置的大一些,然后手动枷锁,手动解锁
读写锁
此问题是,读写调用的时候,读锁只有写锁完成并释放,才可以获取到锁
闭锁
三个班的人都走了,才可以关门
信号量
尝试获取一下,不行就算了,不至于一直等待