基于Redis5.0.2的总结随笔

2020-01-06  本文已影响0人  Snipers_onk

Redis支持数据持久化,众多数据结构存储,master-slave模式数据备份等多种功能。

Redis持久化

持久化主要是Redis故障后,从备份中读取数据,尽快恢复对外提供服务。

Redis持久化的两种方式

RDB

RDB(Redis DataBase)持久化机制,对Redis中的数据执行周期性的持久化。

AOF

AOF(Append Only File)对每条写入指令作为日志,以append-only的模式写入一个日志文件中,在Redis重启的时候,以回放AOF日志中的写入指令重新构建整个数据库。

RDB or AOF?

Redis支持同时开启两种持久化方式,所以可以综合两种持久化机制,用AOF保证数据不丢失,作为数据恢复的第一选择;用RDB来做不同程度的冷备,在AOF文件都丢失或损坏的情况下使用RDB来进行文件的快速修复。

Redis数据淘汰策略

当Redis内存超出物理内存限制,或者超出maxmemory时,Redis就需要使用淘汰策略淘汰无用的key。Redis策略如下

补充几个指令

# 获取当前maxmemory 64bit系统0代表无限制
CONFIG GET maxmemory
# 设置maxmemory
CONFIG SET maxmemory 100MB

常见面试问题

问:mysql里有2000w条数据,redis只存20w条热点数据,如何保证redis中的数据都是热点数据?

答:可以设置最大内容,然后设置淘汰策略volatile-lru或者volatile-ttl。

Redis缓存穿透

恶意用户模拟大量请求缓存中不存在的key,由于缓存中不存在,所以会进行数据库查询,造成数据库异常。

解决方案:

  1. 使用互斥锁,当请求key获取value为空时上锁,单机环境下使用同步锁,分布式环境使用分布式锁。从数据库获取数据后再释放锁。其他线程请求失败,需要等待一段时间再试。
  2. 接口限流和降级。重要的接口需要做好限流策略,防止用户恶意刷接口,同时做好降级准备,当接口中某些服务不可用时,进行熔断,失败快速返回机制。应对接口级故障:服务降级、熔断、限流、排队
  3. bloomfilter,布隆过滤器。快速判断key是否存在于集合中。

Redis缓存雪崩

多个key的过期时间相同,在同一时刻会出现大面积的缓存失效,在这时发生的请求会进行数据库查询导致连接异常。

解决方案:

  1. 使用互斥锁,同上
  2. 建立备份缓存,缓存A和缓存B,A设置超时时间,B不设超时时间。先从A读取缓存,A没有则读取B,并且更新A和B
  3. 设置缓存过期时间时加上一个随机时间,比如12h加上几分钟,避免缓存雪崩。

Redis缓存分区

就是将数据分布到不同的redis实例中,最常用的方式是范围分区和hash分区。

范围分区

映射一定范围的数据到特定的Redis实例,比如ID为1-10000的数据到R0,ID为10001-20000的数据到R1。

Hash分区

根据hash的一致性算法进行分区。

分区是多台redis共同作用的,如果其中一台宕机,则整个分片都不能用,虽然缓解了内存压力,但没有实现高可用,可以采用哨兵机制实现主从复制实现高可用(@标记,下一篇写这个)。

参考

Redis缓存穿透、缓存雪崩、redis并发问题分析
redis 的持久化
redis数据结构

上一篇 下一篇

猜你喜欢

热点阅读