banner

IT运维工程师学习笔记-Redis笔记(8):redis性能优化

redis-benchmark命令来查看常用的命令在1秒内可以执行的次数。如果不指定参数,默认使用50客户端进行性能测试。该性能不等于实际使用性能。

redis-benchmark -c 1 -q   (给-q 选项可以让程序简化输出结果,给-c 1选项让程序只使用一个客户端来进行测试)

2,短结构

redis为列表、集合、散列有序集合提供了一组配置选项,这些选项可以让redis以更节约空间的方式存储长度较短的结构(短结构)。

在列表、散列和有序集合的长度较短或者体积较小的时候,redis可以选择使用一种压缩列表的紧凑存储方式来存储这些结构。压缩列表是列表、散列和有序集合这3种不同类型对象的一种非结构胡表示;

redis通常使用双链表表示列表、使用散列表表示散列、使用散列表加上跳跃表表示有序集合、压缩列表会以序列化的方式存储数据,这些序列化数据每次被读取的是偶都要进行解码,每次被写入的时候也要进行局部的重新编码,并且可能需要对内存里面的数据进行移动。

压缩列表表示

在典型的双向链表里面,链表包含的每个值都会由一个节点表示,每个节点都会带有指向链表中前一个节点和后一个节点的指针,以及一个指向节点包含的字符值的指针。每个节点包含的字符串值都被分为3部分进行存储。

第一部分存储的是字符串串的长度。第二部分存储的是字符串值中剩余可用的字节数量。第三部分存储的则是以空字符结尾的字符串本身。

每存储一个这样的3字节常的字符串,需要付出大于21字节的额外开销(3个指针、1个字符串长度、一个字符串剩余可用空间、字符串本身、1个额外字节)

压缩列表是由节点组成的序列,每个节点都由两个长度值和一个字符串组成。

第一个长度值记录的是前一个节点的长度,用于对压缩列表进行从后向前的遍历。

第二个长度值记录了当前节点的长度。

第三个由存储的字符串值组成。

为了确保压缩列表只会在有需要降低内存占用的情况下使用,redis引入了如下选项

list-max-xiplist-entries 512

列表结构使用压缩列表表示的限制天剑

list-max-ziplist-value 64

  

hash-max-ziplist-entries 512

散列结构使用压缩列表表示显示条件

hash-max-ziplist-value 64

  

zset-max-ziplist-entrles 128

有序集合使用压缩列表限制条件

zset-max-ziplist-value 64

  

集合的整数集合编码

集合并没有使用压缩列表表示,如果整数包含的所有成员都可以被解释为十进制整数,而这些整数又处于平台的有符号范围内,并且集合成员的数量又足够少,redis就会以有序整数组的方式存储集合,这种方式又被称为整数集合。

有序整数组方式存储集合可以降低内存消耗、提升标准集合操作的执行速度。只要集合存储的整数没有超过设置大小,就会默认使用整数集合。

长压缩列表和大整数集合带来的性能问题

一个结构突破了用户为压缩列表或者整数集合设置的限制条件时,redis会自动将他转换为典型的底层结构类型。这样做的主要原因在于,随着紧凑结构的体积变得越来越大,操作这些结构的速度也会越来越慢。

注:

  

  

减少键长度,这里的键包含所有数据库键/散列的域,集合和有序集合的成员以及所有列表的节点。键的长度越长redistribution需要存储的数据越多。所以,减少键长度会节约大量空间。

   

3,分片结构

分片是一种广为人知的技术,许多数据库都使用这种技术来扩展存储空间并提高自己所能处理的负载量。分片的本质就是给予某些简单的规则将数据划分为更小的部分,然后根据数据所属的部分来决定将数据发送到哪个位置上。

分片式散列

散列的主要用途就是吧简单的键值对批量地存储起来。因为散列本身就存储着一些键,所以陈旭再对键进行划分的时候,可以吧salient存储的键用作其中一个信息员,并使用散列函数为键计算出一个数字散列值。然后程序会根据需要存储的键的总数量以及每个分片需要存储的键数量,计算出所需的分片数量,并使用这个分片数量和键的散列值来决定应该把键存储到哪个分片里面。

对于数字键,程序会假设他们再某种程度上是连续且密集地出现的,并且会基于键本身的数值来指派分片ID,从而使得数值上相似的键可以被存储到同一个分片里面。

提供redis性能的几个途径

1,确保压缩列表的最大长度不会太大以至于影响性能。

2,根据程序需要执行的查询的类型,选择能够为这种查询提供最好性能的结构。例如:不要把列表当当做集合使用;也不要获取整个散列然后再客户端里面对其进行排序,而是应该直接使用有序集合;

3,在将大体积的对象缓存到redis里面之前,考虑对它进行压缩以减少读取和写入对象时所需的网络带宽。对比压缩算法lz4、gzip和bzip2,看看哪个性能好效果好。

4,使用流水线(流水线是否启用事务性质由具体程序决定)以及连接池

扩展redis

1,跨地域的redis主从,最好使用主从链

2,使用ssh隧道进行连接可以明显降低带宽占用

注:

  

  

机密和压缩开销

使用ssh隧道加密不会给服务器造成大的负担,加密过程对现有CPU来说完全没有问题,可能会出问题的是在压缩,因为ssh默认使用的是gzip压缩算法,在ssh提供了配置选项,可以让用户选择压缩级别。压缩级别越高带宽占用越小,资源消耗越高。

 

编者说

陆陆续续,这个redis笔记,已经分享到末尾了。其中,相信很多人都知道我其实跳过了很多需要学习的东西。作为一个运维工程师,哪怕现在是一个技术支持工程师,接触到的最多的还是主从,性能优化的时候都几乎没有。因此,我也跳过了一些短时间内自己不会用得到的技能学习。

再有二期,这个笔记就会被分享完毕。一期,哨兵模式。一期,详解redis.conf配置文件。下一期,大家希望可以看到生保的哪个笔记呢?现在提供两个选择吧:tomcat笔记,这个笔记比较短,java部分略过。长的笔记是zabbix笔记。

推荐阅读:

红帽:Meltdown与Spectre:关于现代微处理器安全问题的说明

自动化运维软件设计实战PDF电子书下载

Linux下备份到腾讯云cos、阿里云oss、七牛云存储脚本工具

阅读: 858
在同意共创许可协议(CC BY-NC-SA-4.0)的前提下,您可以转载本文。
付生保个人博客
https://shengbao.org/716.html

相关阅读

留言评论

暂无留言