Redis自旋锁解决分布高并发问题
- Redis特性:
Redis 与其他 key - value 缓存产品有以下三个特点:
- 持久化
Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
- 数据类型
Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
- 数据备份
Redis支持数据的备份,即master-slave模式的数据备份。
- 原子性操作
Redis的所有操作都是原子性的。也就是说所有操作都是同步进行的,这也是解决分布式问题的必要条件
2.高并发下如何使用redis锁使线程异步变为同步执行
- 自旋锁
当一个线程在获取锁的时候,如果锁已经被其它线程获取,那么该线程将循环等待,然后不断的判断锁是否能够被成功获取,直到获取到锁才会退出循环。 - 使用redisson实现自旋锁
@Configuration
public class RedissionConfig {
@Autowired
private Environment env;
@Bean
public RedissonClient redissonClient(){
Config config=new Config();
config.useSingleServer()
.setAddress(env.getProperty("redis.config.host"))
.setPassword(env.getProperty("spring.redis.password"));
RedissonClient client= Redisson.create(config);
return client;
}
}
@RequestMapping("/doubleElevenSale")
public String redissionTest(String productId,String userId){
String lockKey = productId;
RLock lock = redissonClient.getLock(lockKey);
try{
//使线程阻塞,后台会开启定时器每隔设置时间的1/3进行续命操作
lock.lock(10, TimeUnit.SECONDS);
}catch (Exception e) {
}finally {
lock.unlock();
}
return "success";
}