redis 知识点整理自敖丙

1,774 阅读6分钟

Redis 基础篇

1、使用redis的目的

使用这种基于内存的缓存中间件。避免大量流量直接访问传统的数据库,降低数据库的使用压力。维持服务的可用性。提升服务高可用性,及时响应。

2、redis 的基本数据结构

  • String(字符串):用户信息、session共享
  • hash (字典) :用户信息,对象(属性没有嵌套其他对象)
  • list (列表):XXX队列、高性能分页查询(微博下拉不断分页的效果) lrange 读取某个闭区间的元素
  • set (集合): 活动的中奖id (交集-两人共同好友、并集、差集)
  • zset (有序集合) :排行榜、点击数
  • Bit Map 位图 实现 ---BloomFilter (布隆过滤器) :避免缓存穿透
  • HyperLogLog : UV-网站用户访问量 大规模数据不精确去重统计
  • Stream (发布订阅-持久化消息队列)/Kfaka
  • Scan

3、分布式锁实现原理----Redisson 实现见

利用 nx ---redis 已经存在key 失败,没有存在这个key 成功 。。 ex-- 设置key 的过期时间

  set  lock:codehole true ex  5 nx

使用锁的注意实项:锁的重入、避免死锁、尝试获取锁、锁超时、公平锁

4、keys 的高级命令

可使用Scan 获取指定数量、指定的key

keys * :所有的key o(n)
​
keys *hello*  :key 中含有hello 的key
keys [pattern]: key 可以匹配正则表达式

5、redis 混合持久化

RDB(内存快照)做镜像全量持久化,AOF做增量持久化。因为RDB会耗费较⻓时间,不够实时,在停机的时候会导致⼤量丢失数据,所以需要AOF来配合使⽤。在redis实例重启时,会使⽤RDB持久化⽂件重新构建内存,再使⽤AOF重放近期的操作指令来实现完整恢复重启之前的状态。

Aof :sync 将增量数据写入磁盘。可指定插入一条写入一条,或者指定插入频率如:1s/1次。这样就只会丢失1s 的数据

6、RDB 的工作原理

fork和cow。fork是指redis通过创建⼦进程来进⾏RDB操作,cow指的是copy on write,⼦进程创建后,⽗⼦进程共享数据段,⽗进程继续提供读写服务,写脏的⻚⾯数据会逐渐和⼦进程分离开来。

7、Pipeline 有什么好处,为什么要用Pipeline

客户端技术:可以将多次IO往返的时间缩减为⼀次,前提是pipeline执⾏的指令之间没有因果相关性。使⽤redisbenchmark进⾏压测的时候可以发现影响redis的QPS峰值的⼀个重要因素是pipeline批次指令的数⽬。

8、Redis 同步机制

Redis可以使⽤主从同步,从从同步。第⼀次同步时,主节点做⼀次bgsave,并同时将后续修改操作记录到内存buffer,待完成后将RDB⽂件全量同步到复制节点,复制节点接受完成后将RDB镜像加载到内存。加载完成后,再通知主节点将期间修改的操作记录同步到复制节点进⾏重放就完成了同步过程。后续的增量数据通过AOF⽇志同步即可,有点类似数据库的binlog。

Redis ——缓存雪崩、击穿、穿透

1、Redis 雪崩 :redis 中过期大量key 同时失效

设置过期时间时,时间+偏移量(随机的过期时间)。|| 或者设置热点数据永不失效,有更新操作就更新缓存可以(比如运维更新了首页商品,那你刷下缓存就完事了,不要设置过期时间),电商首页的数据也可以用这个操作。

2、缓存穿透:用户恶意查询不存在的key

缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,我们数据库的 id 都是1开始自增上去的,如发起为id值为 -1 的数据或 id 为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大,严重会击垮数据库。

解决方法:

  • 基础的接口参数校验:用户鉴权、请求参数有效性
  • NGINX :使用网关对单个ip 访问次数超过阈值的ip进行拉黑限流
  • 使用布隆过滤器(Bloom Filter)-特性:说key有的时候可能有也可能没有,没有的时候就一定没有。

3、缓存击穿:一个热点key 失效后,大量请求访问操成数据库不可用

  • 设置热数据永不过期
  • 第一次查询加锁(分布式),其他查询从后续缓存中能够查询

image-20211221151721955

一般避免以上情况发生我们从三个时间段去分析下:

  • 事前:Redis 高可用,主从+哨兵,Redis cluster,避免全盘崩溃。
  • 事中:本地 ehcache 缓存 + Hystrix 限流+降级,避免MySQL 被打死。
  • 事后:Redis 持久化 RDB+AOF,一旦重启,自动从磁盘上加载数据,快速恢复缓存数据。

Redis 原理

1、高可用保障

image-20211221154734814

2、主从复制

image-20211221154932273

3、缓存更新

image-20211221160050568

4、缓存不一致

image-20211221160151970

5、Redis 淘汰策略

image-20211221161641979

image-20211221161655548

image-20211221161705766

6、双写一致性,缓存和数据库 必须保持一致性

读请求和写请求串⾏化,串到⼀个内存队列⾥去。

串⾏化可以保证⼀定不会出现不⼀致的情况,但是它也会导致系统的吞吐量⼤幅度降低,⽤⽐正常情况下多⼏倍的机器去⽀撑线上的⼀个请求。 把⼀ 些列的操作都放到队列⾥⾯,顺序肯定不会乱,但是并发⾼了,这队列很容易阻塞,反⽽会成为整个系统的弱点,瓶颈

7、为什么更新数据库,删除缓存

image-20211221173004742

8、Redis 的线程模型

image-20211221173131015

Redis 秒杀系统的实现

1、秒杀:指多个并发消耗一个有限的资源。

2、秒杀服务

  • 秒杀服务单独分布式部署

  • 秒杀联络加盐(时间校验),避免url 地址被提前请求

  • url 动态加密处理。避免秒杀脚本

  • 购买产品用户身份唯一性校验,(付款账号、收货地址、身份证号、...各类验证信息)

  • 前端控制

    • 前端页面模板资源静态化,放到cdn 服务器中
    • 按钮控制:点击前置灰,点击后也置灰几ms
  • 限流:系统限流组件的加入:阿里的Sentinel|Hystrix 等

  • redis 预热加载数据:lua 脚本实现超卖失败控制

  • 使用mq 等消息中间件。异步消费修改库存--适用于(某个点多个商品同时秒杀修改库存的场景)

  • 风控:账号行为分析出这个账号是否正式的购买意愿、贷款情况。

  • 通杀:计算出最有可能真实的用户进行秒杀

image-20211222111840792

\