redis进阶笔记

云加社区 云加社区     2022-11-28     301

关键词:

Redis 大家用的不少,但是我们大多数人可能都只是关注业务本身,对于底层的细节则经常忽略,久而久之,对个人的成长帮助甚少。本文为大家总结了关于 Redis 常见用法的进阶指南,希望帮助大家加深对这门技术的理解。文章作者:何永康,腾讯 CSIG 后台研发工程师。

大于 1M 的话,则每次只会扩容 1M,直到达到 512M。

ture Redis value

命令通过 CRC16(key) & 16383 = 6789(假设结果),由于节点 2 负责 5000~9999 的槽位,则该命令的结果 6789 最终由节点 2 执行。当然如果在节点 2 执行一条命令时,假设通过 CRC 计算后得到的值为 567,则其应该由节点 1 执行,此时命令会进行转向操作,将要执行的命令流转到节点 1 上去执行。


集群节点同步:

集群中每个主节点都会定时发送信息到其他主节点进行同步,如果其他主节点在规定时间内响应了发送消息的主节点,则发送消息的主节点认为响应了消息的主节点正常,反之则认为响应消息的主节点疑似下线,则发送消息的主节点在其节点上将其标记“似下线”。

当集群中超过一半以上的节点认为某个主节点被标记为“疑似下线”,则其中某个主节点将疑似下线节点标记为下线状态,并向集群广播一条下线消息,当下线节点对应的从节点接收到该消息时,则从从节点中选举出一个节点作为主节点继续对外提供服务。


四、Redis为什么变慢了



业务场景中,不知道大家是否碰到过 Redis 变慢的情况:

  • 执行 SET、DEL 命令耗时也很久;
  • 偶现卡顿,之后又恢复正常了;
  • 在某个时间点,突然开始变慢了。


  • 原因分析


    查看慢查询,由于笔者本身机器没有慢查询,所以这里看到是空(实在尴尬,这里没有可用的例子~~)


  • 由于 Redis 在 IO 操作和对键值对的操作是单线程的,所以直接在客户端 Redis-cli 上执行的 Redis 命令有可能会导致操作延迟变大;
  • 使用复杂的命令会让 Redis的处理变慢,以及CPU过高,例如 SORT、SUNION、ZUNIONSTORE 聚合类命令(时间负责度O(N) );
  • 查询的数据量过大,使得更多时间花费在数据协议的组装和网络传输过程中;
  • 大 key 查询,比如对于一个很大的 hash、zset 等,这样的对象对 Redis 的集群数据迁移带来了很大的问题,因为在集群环境下,如果某个 key 太大,会导致数据迁移卡顿;
  • 另外在内存分配上,如果一个 key 太大,那么当它需要扩容时,会一次性申请更大的一块内存,这也会导致卡顿。如果这个大 key 被删除,内存会一次性回收,卡顿现象会再一次产生。
  • 集中过期,变慢的时间统一,所以业务中的 Key 过期时间尽量在统一的一个时间点加上一个随机数时间;
  • 内存使用达到上限,当内存达到内存上限的时候,就不许淘汰一些数据,这个时候也可能导致 Redis 查询效率低;
  • 碎片整理,Redis 在 4.0 版本后会自动整理碎片(由于内存回收过程中存在大量的碎片空间,不整理会导致 Redis 的空间少量浪费),而在整理碎片的过程中会消耗 CPU 的资源,从而影响了请求得到性能;
  • 网络带宽,Redis 集群和业务混部,或者并发量过大以及每次返回的数据也很大,网卡带宽跑满的情况容易导致网络阻塞;
  • AOF 的频率过高,由于 AOF 需要将全部的写命令同步,如果同步的间隔比较短,也会影响到 Redis 的性能;
  • Redis 提供了 flushdb 和 flushall 指令,用来清空数据库,这也是导致 Redis 缓慢的操作。


  • 五、Redis安全


    默认会监听 6379 端口,最好在 Redis 的配置文件中指定监听的 IP 地址,更进一步还可以增加 Redis 的 ACL 访问控制,对客户指定群组,并限限制用户对数据的读写权限。

    访问 Redis 尽量走公司代理,由于 Redis 本身不支持 SSL 的链接,所以走公司代理可以保证安全。客户端登陆 Redis 必须设置 Auth 秘密登陆。

    测试开发进阶——redis——redis阻塞简单了解

    查看详情

    redis高级进阶

    一、redis中的事务在关系型数据库中事务是必不可少的一个核心功能,生活中也是处处可见,比如我们去银行转账,首先需要将A账户的钱划走,然后存到B账户上,这两个步骤必须在同一事务中,要么都执行,要么都不执行,不... 查看详情

    测试开发进阶——redis——redis常用数据类型命令和使用场景总结

      查看详情

    redis进阶学习01---基础回顾(代码片段)

    Redis进阶学习01---基础回顾redis使用docker安装常用命令常用通用命令String类型常用命令key的层级表示Hash类型常用命令List类型set类型sortedSet类型Redis客户端JedisJedis连接池SpringDataRedis快速入门序列化问题+源码追踪分析替换序列化... 查看详情

    hvie进阶笔记

    --mysql方式createtableaccount_channel(account_String,channel_String)asselecta.account,b.channelfromregisterajoin`install`bona.device=b.device--hive方式createtableaccount_channelROWFORMATDELIMITEDFIELDSTER 查看详情

    laravel进阶任务笔记

    在任务开始,我们会扩展一下新建的数据库表移植文件。刚建立的移植文件只有两列,手动添加如下:publicfunctionup(){Schema::create(‘tasks‘,function(Blueprint$table){$table->increments(‘id‘);$table->integer(‘user_id‘)->index();$table->stri... 查看详情

    javascript进阶学习笔记笔记

    基础知识:1)函数的声明方式:普通的声明方式;functionmyFun(m,n)alert(m+n);使用变量初始化函数;VarmyFun=function(m,n)alert(m+n);使用构造函数;varmyFun=newfunction(‘m’,’n’,’alert(m 查看详情

    #笔记#javascript进阶篇一

     #JavaScript进阶篇http://www.imooc.com/learn/10 #认识DOM #window对象  浏览器窗口可视区域监测—— 在不同浏览器(PC)都实用的JavaScript方案:varw=document.documentElement.clientWidth||document.body.clientW 查看详情

    redis进阶例子(代码片段)

    工作中用到的RabbitMQ例子,但是最后没有用,用的CMQ,顺便说下CMQ社区真的少,并且功能少.一、消息体packagecom.bootdo.common.rabbitmq.batchsendsms;importcom.alibaba.fastjson.JSON;importcom.bootdo.common.utils.UUIDGenerator;importjava.io.Serializ 查看详情

    学习笔记:javascript-进阶篇

    1.二维数组 二维数组的表示:myarray[][]varmyarr=newArray(); //先声明一维for(vari=0;i<2;i++){ //一维长度为2 myarr[i]=newArray(); //再声明二维 for(varj=0;j<3;j++){ //二维长度为3 myarr[i][j] 查看详情

    linux进阶ubuntu14.04安装redis

    环境搭建Ubuntu14.04.5LTS安装下载Redis包,从http://download.redis.io/releases选择一个版本进行下载wgethttp://download.redis.io/releases/redis-2.8.7.tar.gz将redis解压到/usr/local/redistar-xzvfredis-2.8.7.tar.gz-C/usr/loca 查看详情

    javascript进阶--慕课网学习笔记

    ...p;          JAVASCRIPT—进阶篇给变量取个名字(变量命名)变量名字可以任意取,只不过取名字要遵循一些规则:1.必须以字母、下划线或美元符号开头,后面可以跟字母、下划线、美元符号和数字... 查看详情

    c语言进阶笔记深入了解进阶指针(代码片段)

    目录前言指针进阶字符指针指向常量字符串的指针指针数组指针数组打印数组内容数组指针对数组指针的理解&数组名和数组名数组指针的使用数组参数、指针参数一维数组传参二维数组传参一级指针传参二级指针传参函数指... 查看详情

    c语言进阶笔记深入了解进阶指针(代码片段)

    目录前言指针进阶字符指针指向常量字符串的指针指针数组指针数组打印数组内容数组指针对数组指针的理解&数组名和数组名数组指针的使用数组参数、指针参数一维数组传参二维数组传参一级指针传参二级指针传参函数指... 查看详情

    javascript进阶笔记

    js是一门函数式语言,因为js的强大威力依赖于是否将其作为函数式语言进行使用。在js中,我们通常要大量使用函数式编程风格。函数式编程专注于:少而精、通常无副作用、将函数作为程序代码的基础构件块。在函数式编程中... 查看详情

    qt学习_qgraphics进阶学习笔记(代码片段)

    QGraphics进阶学习1.保存图片函数QPixmapQWidget::grab(constQRect&rectangle=QRect(QPoint(0,0),QSize(-1,-1)))Rendersthewidgetintoapixmaprestrictedbythegivenrectangle.Ifthewidgethasanychildren,thentheyareals 查看详情

    redis进阶实践之十八使用管道模式提高redis查询的速度(代码片段)

    原文:Redis进阶实践之十八使用管道模式提高Redis查询的速度一、引言            学习redis也有一段时间了,该接触的也差不多了。后来有一天,以为同事问我,如何向redis中批量的增加数... 查看详情

    javascript进阶笔记

    本篇文章我们来学习和讨论一下js中的闭包。闭包是纯函数式编程的一个特性,因为它们能够大大简化复杂的操作。在js中,闭包的重要性不言而喻!简单的说,闭包(closure)是一个函数在创建时允许该自身函数访问并操作该自身... 查看详情