说明:个人原创,本人在一线互联网大厂维护着几千套集群,关于redis使用的一些坑进行了经验总结,希望能给大家带来一些帮助

适用场景:并发量大、访问量大的业务

规范:介绍军规内容

解读:讲解军规设置原因,解读比军规内容更重要

写在前面的话:

总是在灾难发生后,才想起容灾的重要性;

总是在吃过亏后,才记得曾经有人提醒过。

一、基础规范【5条】

1. 必须配置访问密码

解读:裸奔的Redis除了方便被外部盗取数据外,内部管理上也极易出现误操作风险,如误连造成数据被覆盖、丢失!

2.必须以非root用户启动

解读:Redis的设计过于灵活,这直接让攻击者可以远程通过root运行的redis服务获取到操作系统root权限!

3.禁止将Redis当做持久化存储使用

解读:Redis虽然支持AOF、RDB持久化模式,但是并不会记录每条操作的详细时间戳(对比MySQL的binlog会详细记录执行时间),出现误操作时无法进行精确回滚!

4.禁止不同业务混合部署使用同一套Redis

解读:(1)Redis为单线程模型,不同业务的数据存储在一起,除了管理上混乱,单线程模型下只要有一个请求命令变慢,就会影响所有存储在同Redis中的所有请求!

(2)虽然redis支持多个db,但是请求并不会被隔离,比如请求0号库的一个慢操作,也一样样会阻塞其它1、2、3、4库的连接和请求!

5.选择相对较新的版本,强烈建议5.0以上版本

解读:除了5.0版本引入了更多新特性及bug修复外,5.0对Redis的内存碎片管理效率带来了极大的提升,而碎片绝对是Redis的一大性能杀手,但早期的2.x、3.x、4.x版本都没有很好的解决这一问题!

二、键值设计【4条】

1.建议以业务名为前缀,以冒号分割来构造一定规则的key名称

解读:好的Key名称可以提高可读性和可管理性

2.Key名称禁止包含特殊字符,比如空格、换行、单双引号及其他转义字符等

解读:带有特殊符号的Key,在读取或管理时会带来想不到的各种异常和不便

3.控制key名称长度,建议64字符以内,避免Key过多带来较大的内存开销

解读:内存是昂贵的,几千万或者上亿个的Key时,额外的内存开销不容忽视

4.控制Value大小,如果超过512字节必须进行压缩存储,最大不能超过1K

解读:(1)Redis的所有数据都存储在内存中!内存中!内存中!!【不管Redis开不开启持久化,所有数据都是存储在内存中】,而内存的成本是非常高的。

(2)除了成本外,这种大容量的数据存储在Redis中,在访问的QPS稍微高一些时,网卡的压力会非常大,大概率会发生网卡流量打满情况【瞬时吞吐量=QPS*单个请求对象大小】。这种情况建议走独立的图片存储服务、应用程序缓存或CDN等方式,对于过长的字符串【512个字节以上】建议进行序列化或压缩后再存储!

(3)较大的Value,写入速度也会受影响,整体影响写入的吞吐量

三、操作命令【4条】

1.禁止使用keys命令进行正则匹配

解读:Keys的正则匹配是阻塞式、全量扫描过滤的,对于单线程服务的Redis来说是致命的,几十万个Key的匹配查询在高并发访问下就有可能将Redis打崩溃!建议使用scan代替keys!

2.慎用复杂度O(N)的命令

解读:例如hgetall、smembers、lrange、zrange等并非不能使用,但是需要明确N的值。项目刚上线之初hash、set或者list存储的成员个数较少,但是随着业务发展成员数量极有可能会膨胀的非常大,如果仍然采用上述命令不加控制,会极大拖累整个Redis服务的响应时间,建议有遍历的需求可以使用hscan、sscan、zscan代替!

3.合理使用批处理命令提高效率

解读:(1)原生命令如mget、mset,非原生命令如pipeline,但要注意控制一次批量操作的元素个数(例如500以内,具体和元素大小有关)。

(2)Redis由于处理效率非常高效,基本上都是微秒级别,超过1毫秒就应该算是慢操作,使用批量处理命令核心优化点就是减少网络IO开销,特别是对于一些php短连接效果尤其明显。但是注意每次操作不易过多,否则会阻塞其它请求命令!

4.避免大批量Key集中过期

解读:集中大批量Key过期会短时间抢占大量的CPU资源,并有可能阻塞主线程响应。Key集中过期常见在大数据计算结果使用了同样的过期命令,建议分批写入设置不同的过期时间!

四、内存优化【4条】

1.Redis节点内存上限不能超过20G

解读:(1)4.0版本之前的Redis主从架构下master主节点发生故障,切换到新主节点后,其它从节点挂载到新主需要进行一次全量数据重传,如果Slave节点提供只读服务,则构建完成前会一直处于阻塞状态,而过大的内存数据会极大延长新集群的构建时长。大容量内存使用建议使用RedisCluster,通过多分片来降低单节点的内存使用量。

(2)Redis新版本通过记录同步点位一定程度上缓解了新主切换时的全量复制重传问题,但实际也要依赖业务写入情况和主从复制预留buffer大小,按照经验高吞吐情况下大概率仍会发生全量复制重传情况,所以强烈建议单节点尽量控制内存使用上限在20G以内。

2.合理设计Key过期时间,满足业务情况下越小越好

解读:内存是昂贵的!根据业务合理设置Key的过期时间,满足业务需求就好,严禁不设置或者设置过久的过期时间策略!注意expire和expireat使用区别!

3.不要将所有数据全部都放到Redis中

解读:内存是昂贵的!只存储高频访问的数据,严禁将流水日志等只访问一次的数据存入Redis中!

4.必须设置内存最大值,且必须可用内存不小于10%

解读:(1)服务器内存是有限的,不设限的内存使用会造成服务器内存失控。

(2)保持Redis服务有充足的可用内存,虽然数据使用内存达到最大上限后会触发自动清理,但是这种清理有严重的滞后性,在高频写入时已经严重影响新的请求写入了!

五、集群架构【4条】

1.禁止私自将线下节点挂载到线上集群

解读:redis的权限管理较弱,仅仅通过地址和密码即可连接到线上集群,但这种操作会对线上服务的稳定性带来极大隐患,比如高可用的选主切换,给运维人员带来极大的干扰!

2.禁止线上业务使用级联复制架构

解读:级联复制架构在网络不稳定的环境下,如果上游复制节点出现问题,会造成下游Slave节点的数据全量复制重传,对下游的服务请求带来很大的安全隐患。

3.读写分离集群架构,Redis版本必须在3.2以上

解读:由于Redis过期Key的清理采用惰性删除策略,即主节点的Key过期后不是立马被清理,而是逐批扫描清理或者被访问时主动清理,且从节点Key的清理只能依赖主节点的同步删除,Slave自己是不能主动发起清理的。这种模式下如果Slave提供读请求,在清理不及时时就可能读到脏数据。3.2之后的版本解决了这种问题,不再给请求返回数据。

4.主从集群架构下,如果需要持久化下建议主库关闭从库开启

解读:(1)之前有人认为Redis的持久化都是追加写,SAS的磁盘就可以。但是实际上在Redis高并发写入情况下,SAS盘的吞吐是远远跟不上的,特别在单机部署多套Redis服务的情况下,强烈建议使用SSD。磁盘的刷新如果过慢,会直接阻塞Redis主线程写入。

(2)在主从集群模式下,建议主节点关闭持久化,从节点开启,当然如果数据只是用作临时缓存也可以都关闭持久化,具体取决于你的业务场景对缓存的依赖程度。

最后说明:

上述21条军规是在互联网大厂经历大规模Redis运维的经验总结,希望能给大家带来一些启发和帮助!

今日微语:

成长是一场和自身的赛事,不必担忧他人会做得比您好,你只需要每日都做得比前一天好就行了。

看完本文有收获?请转发分享给更多人

关注「数据库架构师」,提升数据库技能

最新一线大厂Redis使用21条军规及详细解读的更多相关文章

  1. 推荐书籍 -《移动App测试的22条军规》

    在今天的博文中,博主希望给大家分享一本博主同事黄勇的最新利作:<移动App测试的22条军规>.黄勇是ThoughtWorks资深敏捷QA和咨询师.对于我来说,和黄勇在一起的工作的这个项目, ...

  2. 【MySql】赶集网mysql开发36条军规

    [MySql]赶集网mysql开发36条军规 2012-05-14 14:02:33 分类: Linux   写在前面的话: 总是在灾难发生后,才想起容灾的重要性: 总是在吃过亏后,才记得曾经有人提醒 ...

  3. NASA关于如何写出安全代码的10条军规

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:NASA关于如何写出安全代码的10条军规.

  4. MySQL 数据库开发的 36 条军规

    MySQL 数据库开发的 36 条军规 写在前面的话: 总是在灾难发生后,才想起容灾的重要性: 总是在吃过亏后,才记得曾经有人提醒过. (一)核心军规 (1)不在数据库做运算:cpu计算务必移至业务层 ...

  5. [赶集网] 【MySql】赶集网mysql开发36条军规

    [赶集网] [MySql]赶集网mysql开发36条军规 (一)核心军规(1)不在数据库做运算   cpu计算务必移至业务层:(2)控制单表数据量   int型不超过1000w,含char则不超过50 ...

  6. SaaS公司融资的「22条军规 」(转)

    编者按:本文是SaaS教父Jason Lemkin的一篇分享.他在文章中分享了他不投资一家公司的22条理由,希望对打算融资和正在融资的你有所启发. 为何有的早期创业公司能成功融资,而有的公司融资却屡遭 ...

  7. 用尽洪荒之力整理的Mysql数据库32条军规(转)

    今天上午吐血整理了Oracle SQL性能优化的40条军规,其中很多规则也是适用于Mysql的,结果今晚发现这一篇文章——用尽洪荒之力整理的Mysql数据库32条军规,和我的竟有异曲同工之妙,当然不同 ...

  8. Yahoo前端优化的35条军规

    摘要:无论是在工作中,还是在面试中,web前端性能的优化都是很重要的,那么我们进行优化需要从哪些方面入手呢?可以遵循雅虎的前端优化34条军规,不过现在已经是35条了,所以可以说是雅虎前端优化的35条军 ...

  9. Mysql数据库调优和性能优化的21条最佳实践

    Mysql数据库调优和性能优化的21条最佳实践 1. 简介 在Web应用程序体系架构中,数据持久层(通常是一个关系数据库)是关键的核心部分,它对系统的性能有非常重要的影响.MySQL是目前使用最多的开 ...

随机推荐

  1. BigDecimal加减乘除及setScale的用法小结

    Bigdecimal初始化: BigDecimal num = new BigDecimal(2.225667);//这种写法不允许,会造成精度损失. BigDecimal num = new Big ...

  2. JDBC:Statement问题

    1.Statement问题  2.解决办法:通过PreparedStatement代替  实践: package com.dgd.test; import java.io.FileInputStrea ...

  3. labview从入门到出家6(进阶篇)--移位寄存器的使用

    前面介绍了如何熟悉和使用Labview自带的库函数以及调试方式,大家后期基本可以凭借这两个方式从入门到出家了,哈哈,后面就靠各位同仁99%的努力了.这篇为啥要讲移位寄存器呢,主要是之前做的项目和经验告 ...

  4. Mac平台下git命令自动补全

    一.安装bash-completion 安装Homebrew /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com ...

  5. 沙漠世界1.0 c++小游戏

    #include<bits/stdc++.h> #include<time.h> #include<windows.h> #include<stdlib.h& ...

  6. MPI简谈

    MPI简谈 MPI是分布式内存系统,区别于OpenMP和Pthreads的共享内存系统.MPI是一种基于消息传递的并行编程技术,是如今最为广泛的并行程序开发方法. MPI前世今生 MPI(Messag ...

  7. 在Ubuntu下编译安装GreatSQL

    在Ubuntu下编译安装GreatSQL 本次介绍如何利用Docker构建Ubuntu环境,并将GreatSQL源码编译成二进制文件. 1.准备工作 先创建本次Docker的workdir为 /dat ...

  8. Kafka部署安装

    一.环境准备 1.jdk 8+ 2.zookeeper 3.kafka 说明:在kafka较新版本中已经集成了zookeeper,所以不用单独安装zookeeper,只需要在kafka文件目录中启动z ...

  9. 使用.NET简单实现一个Redis的高性能克隆版(四、五)

    译者注 该原文是Ayende Rahien大佬业余自己在使用C# 和 .NET构建一个简单.高性能兼容Redis协议的数据库的经历. 首先这个"Redis"是非常简单的实现,但是他 ...

  10. 完整代码:AgileFontSet迅捷字体设置程序

    AgileFontSet用于快捷设置Windows系统字体和桌面图标间距,介绍参见:https://www.cnblogs.com/ybmj/p/11340105.html .这里提供AgileFon ...