Redis 三大问题基本解决方案
Redisson
- maven
<!-- redisson-->
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.12.0</version>
</dependency>
- config
@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://101.33.243.226:6379");
//2、根据Config创建出RedissonClient实例
//Redis url should start with redis:// or rediss://
RedissonClient redissonClient = Redisson.create(config);
return redissonClient;
}
}
lock与看门狗机制
- tryLock(API)
公平锁(等待队列)
可重入-读写锁(保证消息最新数据)
- 读锁=》要等写锁释放完才能读;
- 读锁是共享锁,写锁是排它锁
- 在读锁期间,写锁需要等待读锁的释放后,才能进行写锁操作。
- 应用场景:保证读取到最新数据
信号量Semaphore (可用队列、限流)
- 可用队列
1.假设可用空间为3;即可以放置三次;
2.当空间为0时候,进行阻塞;
- Demo
- 可用lock.acquire(); 但是它是阻塞式的,没有获取到线程就会阻塞住;
2.lock.tryAcquire(); 这个是不会阻塞的,并且会返回boolean 是否获取到锁。
闭锁(CountDownLatch)子弹填充
- 都走完了,才能锁门
问题:如何保持缓存中数据的一致性?
读多写少的数据,适放缓存
- 总结