12:Redis的性能优化

1.使用管道(Pipeline)

Redis的底层通讯协议对管道提供了支持,通过管道,可以一次性发送多条命令给Redis,在执行完后一次性将结果取回。使用管道,可以减少客户端和Redis的通信次数,降低网络延时,从而提供性能。Redis的管道功能在命令行中没有,但Redis是支持管道的,而且在各个语言版的client中都有相应的实现。

2.精简键名和键值

3.合理设计存储的数据结构和数据关系,尽量减少数据冗余

4. 尽量使用mset来赋值,比set效率高一个数量级;类似的还有lpush、zadd等都可以一次输入多个指令

5.如果可能,尽量使用Lua脚本来辅助获取或操作数据

6. 尽量使用hash结构来存储对象将一个对象存储在hash类型中会占用更少的内存,并且可以更方便的存取整个对象,省内存的原因是新建一个hash对象时开始是用zipmap来存储的。

7.使用hash结构时,应尽量保证每个key下面的的数目不超过限制(默认值为64),否则插入效率下降十分明显,同样,内存开销也会显著增加

配置使用ziplist以优化list

1.如果list的元素个数小于配置值list-max-ziplist-entries且元素值字符串的长度小于配置值list-max-ziplist-value,则可以编码成ziplist类型存储,否则采用 Dict 来存储,Dict实际是Hash Table的一种实现。

2.配置使用intset以优化set

3.当set集合中的元素为整数且元素个数小于配置set-max-intset-entries值时,使用intset数据结构存储,否则转化为Dict结构

4. 配置使用ziplist以优化sorted set当sorted set的元素个数及元素大小小于一定限制时,它是用ziplist来存储。这个限制的配置如下:zset-max-ziplist-entries、zset-max-ziplist-value

5. 配置使用zipmap以优化hash当entry数量没有超过hash-max-ziplist-entries指定的限制,并且值的最大长度没有超过hash-max-ziplist-value指定的限制时,会用zipmap来编码。

注意:HashMap的优势就是查找和操作的时间复杂度都是O(1)的,而放弃Hash采用一维存储则是O(n)的时间复杂度,如果成员数量很少,则影响不大,否则会严重影响性能,所以要权衡好些个值的设置,在时间成本和空间成本上进行权衡

一定要设置maxmemory

设置Redis使用的最大物理内存,也就是使用了这么多物理内存后就开始拒绝后续的写入请求,该参数能保护Redis不会因为使用了过多的物理内存而严重影响性能甚至崩溃。

 对排序的优化

1:尽量让要排序的Key存放在一个Server上如果采用客户端分片,那么具体决定哪个key存在哪个服务器上,是由client端采用一定算法来决定的,因此可以通过只对key的部分进行hash。

比如:client如果发现key中包含{},那么只对key中{}包含的内容进行hash。如果采用服务端分片,也可以通过控制key的有效部分,来让这些数据分配到同一个插槽中。

2:尽量减少Sort的集合大小如果要排序的集合非常大, 会消耗很长时间,Redis单线程的,长时间的排序操作会阻塞其它client的请求。解决办法是通过主从复制,将数据复制到多个slave上,然后只在slave上做排序操作,并尽可能的对排序结果缓存

1.考虑采用复制+RDB的方式

1.使用复制机制来实现高可用,数据采用RDB的方式进行持久化备份,建议只在Slave上持久化RDB文件,而且只要在一个相对较长的时间备份一次就够了,比如只保留save 900 1这条规则,大致就是15分钟保存一次。

这样的方式避免了AOF带来的持续的IO,也避免AOF Rewrite最后将rewrite过程中产生的新数据写到新文件所造成的阻塞。代价是如果Master/Slave同时倒掉,可能会丢失15分钟的数据。

2.考虑在一台服务器启动多个Redis实例

由于Redis使用单线程,为了提高CPU利用率,可以在同一台服务器上启动多个Redis实例,但这可能会带来严重的IO争用,除非Redis不需要持久化,或者有某种方式保证多个实例不会在同一个时间重写AOF。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,284评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,115评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,614评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,671评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,699评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,562评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,309评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,223评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,668评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,859评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,981评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,705评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,310评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,904评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,023评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,146评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,933评论 2 355

推荐阅读更多精彩内容

  • Redis的内存优化 声明:本文内容来自《Redis开发与运维》一书第八章,如转载请声明。 Redis所有的数据都...
    meng_philip123阅读 18,888评论 2 29
  • 转载地址:http://gnucto.blog.51cto.com/3391516/998509 Redis与Me...
    Ddaidai阅读 21,452评论 0 82
  • 本文将从Redis的基本特性入手,通过讲述Redis的数据结构和主要命令对Redis的基本能力进行直观介绍。之后概...
    kelgon阅读 61,166评论 23 625
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,657评论 18 139
  • 什么是正能量? 度娘给的答案是:以真空能量为零,能量大于真空的物质为正,能量小于真空的物质为负。这是从科学的角度阐...
    亦诺1阅读 465评论 3 12