• redis的主从复制,哨兵和cluster集群


    一、redis性能管理

    (1) redis-cli
     127.0.0.1:6379> info memory
     ​
     
     (2) redis-cli info memory

    • used_memory_rss:是Redis向操作系统申请的内存。
    • used_memory:是Redis中的数据占用的内存。
    • used_memory_peak:redis内存使用的峰值。

    1.2内存碎片

    内存碎片率=Redis向操作系统申请的内存 / Redis中的数据占用的内存

    mem_fragmentation_ratio = used_memory_rss / used_memory

    mem_fragmentation_ratio:内存碎片率。

    redis-cli info memory |grep ratio
     

    内存碎片产生的原因

    • Redis内部有自已的内存管理器,为了提高内存使用的效率,来对内存的申请和释放进行管理。
    • Redis中的值删除的时候,并没有把内存直接释放、交还给操作系统,而是交给了Redis内部有内存管理器。
    • Redis中申请内存的时候,也是先看自己的内存管理器中是否有足够的内存可用。
    • Redis的这种机制,提高了内存的使用率,但是会使Redis中有部分自己没在用,却不释放的内存,导致了内存碎片的发生。

    内存碎片率对redis的影响 

    • 内存碎片率在1到1.5之间是正常的,这个值表示内存碎片率比较低,也说明Redis 没有发生内存交换。
    • 内存碎片率超过1.5,说明Redis消耗了实际需要的物理内存的150%,其中50%是内存碎片率。
    • 内存碎片率低于1的,说明Redis内存分配超出了物理内存,操作系统正在进行内存交换(使用虚拟内存,会降低性能)。需要增加可用物理内存或减少Redis内存占用。

    解决碎片率过大的方法 

    • 如果你的Redis版本是4.0以下的,需要在redis-cli 工具上输入shutdown save命令,让Redis数据库执行保存操作并关闭Redis服务,再重启服务器。Redis服务器重启后,Redis 会将没用的内存归还给操作系统,碎片率会降下来。
    • Redis4.0版本开始,可以在不重启的情况下,线上整理内存碎片,将未使用的内存归还给操作系统。

     config set activedefrag yes    #自动碎片清理
     memory purge                   #手动碎片清理

     1.3内存使用率 

    redis实例的内存使用率超过可用最大内存,操作系统将开始进行内存与swap空间交换。

    避免内存交换发生的方法:

    • 针对缓存数据大小选择安装Redis 实例
    • 尽可能的使用Hash数据结构存储
    • 设置key的过期时间

    1.4内回收key 

    存清理策略,保证合理分配redis有限的内存资源。

    当内存使用达到设置的最大阈值时,需选择一种key的回收策略,默认情况下回收策略是禁止删除(noenviction)。配置文件中修改 maxmemory-policy 属性值:

    im /etc/redis/6379.conf
     ---598行----
     maxmemory-policy noenviction   #修改max-memory-policy属性值
     ​
     ##回收策略有以下几种:##
     ●volatile-lru
     #使用LRU算法从已设置过期时间的数据集合中淘汰数据
     (移除最近最少使用的key,针对设置了TTL的key)
     ​
     ●volatile-ttl
     #从已设置过期时间的数据集合中挑选即将过期的数据淘汰
     (移除最近过期的key)
     ​
     ●volatile-random
     #从已设置过期时间的数据集合中随机挑选数据淘汰
     (在设置了TTL的key里随机移除)
     ​
     ●allkeys-lru
     #使用LRU算法 从所有数据集合中淘汰数据
     (移除最少使用的key,针对所有的key)
     ​
     ●allkeys-random
     #从数据集合中任意选择数据淘汰(随机移除key)
     ​
     ●noenviction
     #禁止淘汰数据(不删除直到写满时报错)

    二、redis的优化策略

    2.1设置Redis客户端连接的超时时间 

    vim /etc/redis/6379.conf
     -----114行------
     114 timeout 0     
     #单位为秒(s),取值范围为0~100000。默认值为0,表示无限制,即Redis不会主动断开连接,即使这个客户端已经空闲了很长时间。
     #例如可设置为600,则客户端空闲10分钟后,Redis会主动断开连接。
     ​
     #注意:在实际运行中,为了提高性能,Redis不一定会精确地按照timeout的值规定的时间来断开符合条件的空闲连接,例如设置timeout为10s,但空闲连接可能在12s后,服务器中新增很多连接时才会被断开。

    2.2 设置redis自动碎片清理

     config set activedefrag yes    #自动碎片清理
     memory purge                   #手动碎片清理

    2.3设置redis最大内存阈值 

    内存阈值如果不设置,则没有限制,直到把服务器的内存干满、之后会使用交换分区。

    设置内存阈值后,不会使用swap交换分区。且如果设置了key回收策略,当内存使用达到设置的最大阈值时,系统会进行key回收。

    vim /etc/redis/6379.conf
     -----567行------
     567 # maxmemory
     568 maxmemory 1gb           #例如设置最大内存阈值为1gb

    三、redis雪崩、穿透、击穿的原因和解决方案

    (1) redis雪崩

    定义:缓存雪崩是指大量的应用请求无法在 Redis 缓存中进行处理,紧接着,应用将大量请求发送到数据库层,导致数据库层的压力激增。 

    一个简单的雪崩过程:

    1. Redis 集群产生了大面积故障;

    2. 缓存失败,此时仍有大量请求去访问 Redis 缓存服务器;

    3. 在大量 Redis 请求失败后,这些请求将会去访问数据库;

    4. 由于应用的设计依赖于数据库和 Redis 服务,很快就会造成服务器集群的雪崩,最终导致整个系统的瘫痪。

     产生的原因:

    1)缓存中有大量数据同时过期,导致大量请求无法得到处理。

    2)Redis 缓存实例发生故障宕机了

    解决方案: 

    • 【事前】高可用缓存࿱

  • 相关阅读:
    JavaScript includes() 方法的作用
    STM32--ADC
    Typora收费了, 还有哪些好用的markdown工具
    如何在机器学习中使用数据集编程
    电力安全事故安全培训3D仿真展馆绿色环保持久复用
    [Ynoi2016] 镜中的昆虫——浅谈区间种类数问题
    人工智能是否有风险
    rabbitMQ(消息堆积问题)
    Squid代理服务器应用
    总结的HTTP比较详细的知识
  • 原文地址:https://blog.csdn.net/weixin_48271370/article/details/127854771