Redis笔记,涵盖了 Redis 所有知识点,拿走不谢


Redis笔记,涵盖了 Redis 所有知识点,拿走不谢

文章插图
 
一、redis为什么那么快
  1. QPS达到10万/秒
  2. 用C语言实现
  3. 基于内存
  4. 单线程,不用线程上下文切换及加锁
二、redis数据类型
  1. String,常见的缓存,存储登录session等
  2. hash,存储对象,单独修改对象属性
  3. List,有序列表,可实现简单的消息队列,阻塞队列
  4. Set,分布式去重
  5. Zset,也叫做sorted set,有序集合,关联一个double类型的分数,根据分数排序,可实现排行榜、延时队列
  6. Stream,redis 5.0后的新数据类型,消费者可分组,一条消息只能被同组的一个消费者消费,但可以被不同组的多个消费者重复消费,借此实现可持久化的发布&订阅功能
三、缓存模式A:旁路缓存模式
  1. Cache Aside Pattern
  2. 应用程序同时对接缓存、数据库
  3. 查询时先查询缓存,缓存未命中则查询数据库,同时更新数据库
  4. 更新时先更新数据库,在删除缓存缓存
  5. 最常用的模式
  6. 会有数据不一致性问题
  7. 适用读多写少的场景
  8. 两种加载缓存的方式,读到再加载,或者启动时就加载
  1. 为什么是先更新数据库再删除缓存,而不是先删除缓存再更新数据库?
  2. 为什么是更新数据库后删除缓存,而不是更新缓存?
四、缓存模式B:读写穿透模式
  1. Read/Write Through Pattern
  2. 应用程序只对接缓存,由缓存对接数据库,相当于Cache Provider中封装了数据库
  3. 查询时若缓存未命中则,则Cache Provider去查询数据库,设置到缓存后再返回
  4. 更新时,由Cache Provider同时更新缓存和数据库,这里有事务保证
  5. 此模式很耗时,但能保证数据一致性
  6. 少见的模式
五、缓存模式C:异步缓存写入
  1. Write Behind
  2. 应用程序只更新缓存,不直接更新数据库
  3. 在一定时间触发异步的方式写入数据库
  4. 类似于MySQL InnoDB 缓冲池的模式
  5. 在写入数据库前断电挂机会有丢失数据可能
  6. 放大了数据不一致性,但速度很快
  7. 适用于高并发写,但对数据一致性要求不高且允许丢失的场景
六、问题A:缓存雪崩 
电商首页热点数据会做缓存,定时任务刷新,所有key失效时间一样 。
热点key大面积集中失效,大量请求一下子打到数据库,导致数据库挂掉 。
 
  1. 失效时间加随机值,不让它们集中失效
  2. 设置热点key永不过期,有更新时就更新缓存
  3. 如果Redis是集群部署,可让热点key分布在不同的Redis库中
七、问题B:缓存穿透 
缓存和数据库中都不存在的数据,被攻击者利用,如id = -1,发起攻击的时候会绕过换过,不断查询数据库 。
 
  1. 对参数合法性进行检验
  2. 使用布隆过滤器,会有一定误判
  3. 数据库查询为null时,可以缓存约定的数据,如“请稍后重试”,缓存时间设置短点,如30秒(防止正常了这个id下有数据了也无法正常使用)
  4. 限流
八、问题C:缓存击穿【Redis笔记,涵盖了 Redis 所有知识点,拿走不谢】 
一个热点key,在失效的瞬间,遭遇高并发,大量请求在缓存中查不到,会直接去查数据库
 
  1. 设置热点key永不过期
  2. 使用分布式互斥锁,保证在缓存失效时,只有一个请求能查到数据库
九、问题D:数据一致性 
数据一致性就是指数据库和缓存的数据一致的问题 。
根据三种缓存模式可知,在数据一致性和效率是两个极端,只能取一个中间平衡点 。
一般是采用旁路缓存模式,且采用先更新数据库,后删除缓存的方式 。
但就这时候还是会有少量请求因为删除缓存不及时而读到旧数据,不过一般都能顺利删除缓存,这已经是对业务影响最轻的做法 。


推荐阅读