redis

常用类型

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分布式锁的不能解决超时的问题

  1. 锁未被释放
  2. B锁被A锁释放了
  3. 数据库事务超时
  4. 锁过期了,业务还没执行完
  5. Redis主从复制的问题

 

posted @ 2023-05-27 11:27  BrowerBear  阅读(14)  评论(0)    收藏  举报