redis一些学习笔记

Posted by hang.li on November 20, 2022

安装

如果遇到环境没有安装,先安装环境

  1. 下载安装包 wget http://download.redis.io/releases/redis-4.0.0.tar.gz
  2. 解压 tar -xvf redis-4.0.0.tar.gz
  3. 进入redis解压的目录,编译 make 或 (make MALLOC=libc) 安装 make install

持久化

快照 RDB

手动快照

– save 单线程,会阻塞当前redis

后台异步打快照

–bgsave(fork函数调用子进程,保存快照)

RDB特点

优点:

快照为二进制文件,存储效率高 相当于按时间点备份, 可当做异地备份方案 恢复速度快

缺点

无法实时持久化 开启fork子进程,消耗redis性能 不同版本的dump文件格式不一致

操作过程 AOF

相当于恢复备份时,相当于把之前执行的所有操作重新恢复一遍.

备份时机:

  1. 按操作备份,执行成功一条,备份一条操作(数据不丢失,备份的会和真实的数据一致,但是效率较低)
  2. 按秒备份, 将每一秒的语句缓冲起来, 每隔一秒一执行(可能会丢失1秒的数据,效率较高,默认配置)
  3. 系统策略(不可控)

    数据删除策略

    定时删除

    • 使用定时器,扫描所有key对已经到期的数据进行清理(对cpu性能消耗大)
    • 惰性删除: 下次访问时,如果过期则删除(内存中可能会出现很多过期数据占用内存)
    • 定期删除(随机扫描,重点扫描): 将expires分成几个区,扫描每个区,每次执行250ms/server.hz,
    1. 如果遇到如果key超时,删除key
    2. 如果一轮中删除的key的数量>W*25%,循环该过程(再扫描此区)
    3. 如果一轮中删除的key的数量≤W25%,检查下一个expires[],0-15循环
    4. W取值=ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP属性值
      • 逐出算法: 有点向并发gc过程 检测易失数据(可能会过期的数据集server.db[i].expires ) ① volatile-lru:挑选最近最少使用的数据淘汰 ② volatile-lfu:挑选最近使用次数最少的数据淘汰 ③ volatile-ttl:挑选将要过期的数据淘汰 ④ volatile-random:任意选择数据淘汰 检测全库数据(所有数据集server.db[i].dict ) ⑤ allkeys-lru:挑选最近最少使用的数据淘汰 ⑥ allkeys-lfu:挑选最近使用次-数最少的数据淘汰 ⑦ allkeys-random:任意选择数据淘汰 放弃数据驱逐 ⑧ no-enviction(驱逐):禁止驱逐数据(redis4.0中默认策略),会引发错误OOM(Out Of Memory)

        常见问题

        缓存预热

        为防止redis刚启动数据为空, 导致数据库服务器承受压力较大. 刚启动时会向redis中预加载一些热点数据.

        缓存雪崩

        大量数据同时失效时,redis类似恢复到刚刚重启之后时,一批请求过来,导致数据库压力过大. 根据业务散列过期时间, 热点数据设置永久key,人工干预, 限流,熔断机制.

        缓存击穿

        热点数据访问,在高并发下,缓存还没来得及写入,请求直接转到数据库中 热点数据设置永久key, 缓存预热, 加锁双重校验(类似于单例的懒汉式)

        缓存穿透

        大量缓存未命中请求发生, 请求直接攻击到数据库 布隆过滤器, 缓存null值(不推荐,第一次还是会访问到数据库)