redis总结

1.redis数据类型5种

2.redis持久化方式

2.1.rdb 默认的方式,按照一定的时间周期策略把内存的数据以快照(全量)的形式保存到硬盘的二进制文件

触发机制

2.1.1 save(手动),进行该命令的时候,会阻塞redis服务,不能进行其他操作

2.1.2bgsave(手动),该命令会创建fork进程来进程来进行备份,redis服务正常运行

2.1.3 自动备份,通过配置文件,通过save  n  m,n秒内m个key值被修改,则进行备份

2.1.4其他备份配置

  stop-writes-on-bgsave-error 备份出错,不接收数据

  rdbcompression,是否进行压缩,默认是

2.1.5优势和劣势,

       a.备份的时候,通过fork子进程进行,主进程不需要进行任何io操作

       b.备份恢复速度快

       c.由于是全量的,所以速度较慢。

2.2aof方式,追加记录方式

2.2.1 bgrewriteaof命令,解决aof文件越来越大的问题,会将内存中的数据重新以aof记录,会合并重复的命令

2.2.2触发方式

  a. always总是,每次添加数据都记录

  b.everysec 每秒

  c.备份

2.3 混合持久化

   Redis 4.0 开始支持 rdb 和 aof 的混合持久化(默认关闭)。这个功能可以通过 aof-use-rdb-preamble 选项进行开启。如果把混合持久化打开,aof rewrite 的时候就直接把 rdb 的内容写到 aof 文件开头

 

3 redis最佳实践总结

3.1.Redis 默认开启RDB持久化方式,在指定的时间间隔内,执行指定次数的写操作,则将内存中的数据写入到磁盘中。

3.2.RDB 持久化适合大规模的数据恢复但它的数据一致性和完整性较差。

3.3.Redis 需要手动开启AOF持久化方式,默认是每秒将写操作日志追加到AOF文件中。

3.4.AOF 的数据完整性比RDB高,但记录内容多了,会影响数据恢复的效率。

3.5.若只打算用Redis 做缓存,可以关闭持久化。

3.6.有主从的情况下,建议主库不做持久化,从库开启持久化。

7.建议使用redis4.0以上版本,使用混合持久化。

8.建议控制单个实例大小,体量越大,rdb生成时间越长,开销越大。同时,在从库初始化时,所需要的时间更长,网络开销更多。

9.主从复制不要用图状结构,用单向链表结构更为稳定,即: Master <- Slave1 <- Slave2 <-
Slave3…

4.

redis的过期策略以及内存淘汰机制

定期删除+惰性删除策略,默认100ms进行一次随机检查,过期的干掉,访问数据是,判断是否过期,该数据过期,干掉

没有没检查,也没有被访问的,数据超过设置的最大内存,启用淘汰机制,配置maxmemory-policy volatile-lru

volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
no-enviction(驱逐):禁止驱逐数据,新写入操作会报错
ps:如果没有设置 expire 的key, 不满足先决条件(prerequisites); 那么 volatile-lru, volatile-random 和 volatile-ttl 策略的行为, 和 noeviction(不删除) 基本上一致。

 

缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级等问题

a。缓存雪崩,大量缓存缓存同时失效,服务不可用

  解决方案,

      集群保证,即使某个节点不可用,其他节点依然可用。

      分布式锁或者对列,比如某个key只准现场查询数据库和写缓存。其他线程等待

      添加缓存的时候写,失效时间加上随机数,分散开。

b。 缓存击穿  当客户端查询数据库中不存在的数据的时候,缓存中也肯定不存在,每次查询都会进入数据库

     解决方案

         方法1. 布隆过滤器,将可能的hash存以其中,不符合过滤掉

         方案2.缓存空对象,当缓存中查询不到,去查询数据库得到空数据,将其缓存起来,同时设置过期时间,第二次查询的时候,会从缓存中得到空数据

          

     

      

redis集群

1,主从模式,主要特点,一主多从,master挂了以后,从节点不会作为主节点

 

* 主数据库可以进行读写操作,当读写操作导致数据变化时会自动将数据同步给从数据库

* 从数据库一般都是只读的,并且接收主数据库同步过来的数据

* 一个master可以拥有多个slave,但是一个slave只能对应一个master

* slave挂了不影响其他slave的读和master的读和写,重新启动后会将数据从master同步过来

* master挂了以后,不影响slave的读,但redis不再提供写服务,master重启后redis将重新对外提供写服务

* master挂了以后,不会在slave节点中重新选一个master  

工作机制:

当slave启动后,主动向master发送SYNC命令。master接收到SYNC命令后在后台保存快照(RDB持久化)和缓存保存快照这段时间的命令,然后将保存的快照文件和缓存的命令发送给slave。slave接收到快照文件和命令后加载快照文件和缓存的执行命令。

复制初始化后,master每次接收到的写命令都会同步发送给slave,保证主从数据一致性

 

2.sentinel模式,主要特点,主服务挂掉会有从服务顶上来,主恢复之后不再试主服务,客户端连接sentinel。

特点:

* sentinel模式是建立在主从模式的基础上,如果只有一个Redis节点,sentinel就没有任何意义

* 当master挂了以后,sentinel会在slave中选择一个做为master,并修改它们的配置文件,其他slave的配置文件也会被修改,比如slaveof属性会指向新的master

* 当master重新启动后,它将不再是master而是做为slave接收新的master的同步数据

* sentinel因为也是一个进程有挂掉的可能,所以sentinel也会启动多个形成一个sentinel集群

* 多sentinel配置的时候,sentinel之间也会自动监控

* 当主从模式配置密码时,sentinel也会同步将配置信息修改到配置文件中,不需要担心

* 一个sentinel或sentinel集群可以管理多个主从Redis,多个sentinel也可以监控同一个redis

* sentinel最好不要和Redis部署在同一台机器,不然Redis的服务器挂了以后,sentinel也挂了

 

 

机制:ping在线心跳,如果得不到,会主管下线,其他sentinel会跟高频ping,足够数量同意则下线,否则主管状态移除,如果master重新想sentinel发送心跳回复有效,主观下线移除

* 每个sentinel以每秒钟一次的频率向它所知的master,slave以及其他sentinel实例发送一个 PING 命令 

* 如果一个实例距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 则这个实例会被sentinel标记为主观下线。 

* 如果一个master被标记为主观下线,则正在监视这个master的所有sentinel要以每秒一次的频率确认master的确进入了主观下线状态

* 当有足够数量的sentinel(大于等于配置文件指定的值)在指定的时间范围内确认master的确进入了主观下线状态, 则master会被标记为客观下线 

* 在一般情况下, 每个sentinel会以每 10 秒一次的频率向它已知的所有master,slave发送 INFO 命令 

* 当master被sentinel标记为客观下线时,sentinel向下线的master的所有slave发送 INFO 命令的频率会从 10 秒一次改为 1 秒一次 

* 若没有足够数量的sentinel同意master已经下线,master的客观下线状态就会被移除;
  若master重新向sentinel的 PING 命令返回有效回复,master的主观下线状态就会被移除

  3.cluster模式的出现就是为了解决单机Redis容量有限的问题,将Redis的数据根据一定的规则分配到多台机器。

cluster可以说是sentinel和主从模式的结合体,通过cluster可以实现主从和master重选功能,所以如果配置两个副本三个分片的话,就需要六个Redis实例

特點

* 多个redis节点网络互联,数据共享

* 所有的节点都是一主一从(也可以是一主多从),其中从不提供服务,仅作为备用

* 不支持同时处理多个key(如MSET/MGET),因为redis需要把key均匀分布在各个节点上,
  并发量很高的情况下同时创建key-value会降低性能并导致不可预测的行为
  
* 支持在线增加、删除节点

* 客户端可以连接任何一个主节点进行读写

  

 

 

参考:https://blog.csdn.net/miss1181248983/article/details/90056960 redis集群(经典)

           https://www.cnblogs.com/George1994/p/10668889.html  缓存雪崩,击穿

           https://blog.csdn.net/Butterfly_resting/article/details/89668661 redis相关

           https://blog.csdn.net/chenqiushi123/article/details/109520239  redis 持久化最佳实践

posted @ 2021-01-17 21:56  longtengdama  阅读(117)  评论(0编辑  收藏  举报