zoukankan      html  css  js  c++  java
  • 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 持久化最佳实践

  • 相关阅读:
    正则表达式
    Requests库基本使用(转载)
    prometheus + grafana + pushgateway 搭建监控可视化系统
    Docker的系统资源限制(转载)
    DAY8 文件操作
    DAY7 集合,深浅copy
    DAY6 Python之代码块,小数据池的详解
    DAY5 Python基础类型之字典
    DAY4 Python数据类型之列表
    DAY3 python基础之数据类型总览
  • 原文地址:https://www.cnblogs.com/longsanshi/p/14290411.html
Copyright © 2011-2022 走看看