常用类型
list 有序
使用:队列
列表类型可以使用 rpush 实现先进先出的功能,同时又可以使用 lpop 轻松的弹出(查询并删除)第一个元素,所以列表类型可以用来实现消息队列
基于rpush+blpop
hash
使用:Hash类型大家应该都不陌生,他就是一个键值对集合,Hash相当于一个 string 类型的 key和 value 的映射表,key 还是key,但是value是一个键值对(key-value),类比于 Java里面的 Map> 集合。
订单功能: id作为key ,商品订单id为内部里面的key,商品的介绍信息维value
string
使用:分布式缓存,限流,验证码
set
集合类型 (Set) 是一个无序,不可重复键值集合。它的存储顺序不会按照插入的先后顺序进行存储
zset
集合类型 (ZSet) 是一个有序,不可重复键值集合。它的存储顺序不会按照插入的先后顺序进行存储
速度比较快的原因
1、内存
2、数据结构
3、线程模型 IO的多路复用
4、字典 k-v类型数据
缓存穿透
多次查询一个不存在的数据,从而导致中间件redis失效
缓存击穿
redis的热点key在某一个时间正好过期,正好有大量的请求过来,导致直接到达数据库上面
缓存雪崩
redis的数据同一时间大量过期,从而请求直接到达数据库里面
过期策略
定时过期
设置key的过期时间,到时间就会立即对key进行清楚
惰性过期
只有当访问这个key时,才会判断这个key是否过期,过期就清除
Redis中同时使用了惰性过期和定期过期两种过期策略
持久化方式
AOF
每秒,每一个操作
RDB
每隔一段时间
如何保持和数据库一致
淘汰式缓存:在redis'里面进行关于数据的增删改是先进行数据库的删除,再进行新增
redis实现分布式锁
//使用uuid,解决锁释放的问题
@GetMapping
public void testLock() throws InterruptedException {
String uuid = UUID.randomUUID().toString();
Boolean b_lock = redisTemplate.opsForValue().setIfAbsent("lock", uuid, 10, TimeUnit.SECONDS);
if(b_lock){
Object value = redisTemplate.opsForValue().get("num");
if(StringUtils.isEmpty(value)){
return;
}
int num = Integer.parseInt(value + "");
redisTemplate.opsForValue().set("num",++num);
Object lockUUID = redisTemplate.opsForValue().get("lock");
if(uuid.equals(lockUUID.toString())){
redisTemplate.delete("lock");
}
}else{
Thread.sleep(100);
testLock();
}
}
【使用lua脚本保证分布式锁的原子性】
redis分布式锁的缺点
redis分布式锁的不能解决超时的问题
- 锁未被释放
- B锁被A锁释放了
- 数据库事务超时
- 锁过期了,业务还没执行完
- Redis主从复制的问题
标签:过期,lock,redis,value,key,redisTemplate From: https://www.cnblogs.com/wyhqmm/p/17436426.html