`
youyu4
  • 浏览: 440266 次
社区版块
存档分类
最新评论

Redis优化

 
阅读更多

Redis优化

 

精简键名和键值

键名:尽量精简,但是也不能单纯为了节约空间而使用不易理解的键名。

键值:对于键值的数量固定的话可以使用0和1这样的数字来表示,(例如:male/female、right/wrong)

 

 

是否需要持久化

当业务场景不需要数据持久化时,关闭所有的持久化方式可以获得最佳的性能,不过一般都要持久化比较安全,而且是快照和aof同时使用比较安全

 

 

showlog

如果发现redis性能低下,可以通过showlog查看是由于那些语句导致的

slowlog-log-slower-than  //它决定要对执行时间大于多少微秒(microsecond,1秒 = 1,000,000 微秒)的命令进行记录  

slowlog-max-len   //它决定 slowlog 最多能保存多少条日志  

 

 

修改Linux内核内存分配策略

 

原因:

redis在运行过程中可能会出现下面问题

错误日志:

WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to 



 

redis备份原理

redis在备份数据的时候,会fork出一个子进程,理论上child进程所占用的内存和parent是一样的,比如parent占用的内存为8G,这个时候也要同样分配8G的内存给child,如果内存无法负担,往往会造成redis服务器的down机或者IO负载过高,效率下降。所以内存分配策略应该设置为 1(表示内核允许分配所有的物理内存,而不管当前的内存状态如何)。

 

内存分配策略有三种(0、1、2)

0. 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。

1. 不管需要多少内存,都允许申请。

2. 只允许分配物理内存和交换内存的大小。(交换内存一般是物理内存的一半)

 

修改方法

1. 向/etc/sysctl.conf添加

vm.overcommit_memory = 1    //然后重启服务器

2. 执行修改命令

sysctl vm.overcommit_memory=1   //立即生效 

 

 

修改linux中TCP 监听的最大容纳数量

在高并发环境下你需要一个高backlog值来避免慢客户端连接问题。注意Linux内核默默地将这个值减小到/proc/sys/net/core/somaxconn的值,所以需要确认增大somaxconn和tcp_max_syn_backlog两个值来达到想要的效果。

echo 511 > /proc/sys/net/core/somaxconn 



 

注意:这个参数并不是限制redis的最大链接数。如果想限制redis的最大连接数需要修改maxclients,默认最大连接数为10000。

 

 

限制redis的内存大小和数据淘汰策略

 

通过redis的info命令查看内存使用情况

如果不设置maxmemory或者设置为0,64位系统不限制内存,32位系统最多使用3GB内存。

1. maxmemory:最大内存  

2. maxmemory-policy:内存不足时,数据清除策略  

3. 设置数据的超时时间,expire,expireat, pexpire, pexpireat

 

maxmemory应设置多大

1. 如果使用了快照方式,应该设置为服务器内存的45%,由于快照也要用45%,(45 + 45 + 5 = 90),5%是预留的消耗

2. 如果没有设置快照,可以设置为服务器内存的95%

 

如何选择maxmemory-policy

1. 如果设置了超时时间,“volatile-ttl”比较合适

2. 如果没有这是超时时间,“allkeys-lru”比较合适

淘汰策略如下:

1. volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用 的数据淘汰
2. volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数 据淘汰
3. volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据 淘汰
4. allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
5. allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
6. no-enviction(驱逐):禁止驱逐数据 

 

如何选择

1. 如果可以确定数据总量不大,并且内存足够的情况下不需要限制redis使用的内存大小。

2. 如果数据量不可预估,并且内存也有限的话,尽量限制下redis使用的内存大小,这样可以避免redis使用swap分区或者出现OOM错误。

 

注意:如果不限制内存,当物理内存使用完之后,会使用swap分区,这样性能较低,如果限制了内存,当到达指定内存之后就不能添加数据了,否则会报OOM错误。可以设置maxmemory-policy,内存不足时删除数据。

 

 

使用管道技术

Redis是个单线程模型,客户端过来的命令是按照顺序执行的,所以想要一次添加多条数据的时候可以使用管道,或者使用一次可以添加多条数据的命令,例如:



 

 

 

关闭Redis的VM选项

这个本来是作为Redis存储超出物理内存数据的一种数据在内存与磁盘换入换出的一个持久化策略,但是其内存管理成本也非常的高,并且我们后续会分析此种持久化策略并不成熟,所以要关闭VM功能,请检查你的redis.conf文件中 vm-enabled 为 no。

 

 

redis的紧凑存储格式

Redis Hash是value内部为一个HashMap,如果该Map的成员数比较少,则会采用类似一维线性的紧凑格式来存储该Map, 即省去了大量指针的内存开销。如果数据比较多或比较大的情况下,就会用回HashMap。

 

hash-max-zipmap-entries 64 

含义是当value这个Map内部不超过多少个成员时会采用线性紧凑格式存储,默认是64,即value内部有64个以下的成员就是使用线性紧凑存储,超过该值自动转成真正的HashMap。

hash-max-zipmap-value 512 

含义是当 value这个Map内部的每个成员值长度不超过多少字节就会采用线性紧凑存储来节省空间。

hash-max-zipmap-entries

 

注意:

 

前面两条任意一条不满足,就会使用HashMap

 

其他数据结构也有同样的紧凑存储格式

list-max-ziplist-value 64 

list-max-ziplist-entries 512

 

set-max-intset-entries 512 

 

 

redis shared integer

 

Redis内部实现没有对内存分配方面做过多的优化,在一定程度上会存在内存碎片,不过大多数情况下这个不会成为Redis的性能瓶颈,不过如果在Redis内部存储的大部分数据是数值型的话,Redis内部采用了一个shared integer的方式来省去分配内存的开销,即在系统启动时先分配一个从1~n 那么多个数值对象放在一个池子中,如果存储的数据恰好是这个数值范围内的数据,则直接从池子里取出该对象,并且通过引用计数的方式来共享,这样在系统存储了大量数值下,也能一定程度上节省内存并且提高性能,这个参数值n的设置需要修改源代码中的一行宏定义REDIS_SHARED_INTEGERS,该值默认是10000,可以根据自己的需要进行修改,修改后重新编译就可以了。

 

 

参考

http://blog.csdn.net/u011204847/article/details/51302109#

http://www.infoq.com/cn/articles/tq-redis-memory-usage-optimization-storage/

 

  • 大小: 59.9 KB
  • 大小: 72.1 KB
  • 大小: 13.1 KB
分享到:
评论

相关推荐

    redis优化配置

    完整详细的redis优化配置,目前已经在生产环境使用

    redis集群, tomcat优化以及 MySQL5.6优化

    以上是关于 Redis 集群、Tomcat 优化及 MySQL 5.6 优化的核心知识点和优化策略,这些内容对于提升系统的稳定性和性能具有重要作用。在实际应用中,需要根据具体环境和业务需求进行针对性的调整。

    Redis硬核性能优化

    二、Redis优化策略: 1. 慢查询优化:通过`slowlog`追踪并优化耗时命令,避免使用复杂操作。 2. 集中过期优化:分散过期时间,减少瞬间压力。 3. 内存上限优化:合理设置最大内存限制,避免全盘淘汰策略。 4. fork...

    Redis优化经验总结(必看篇)

    内存管理优化 Redis Hash是value内部为一个HashMap,如果该Map的成员数比较少,则会采用类似一维线性的紧凑格式来存储该Map, 即省去了大量指针的内存开销,这个参数控制对应在redis.conf配置文件中下面2项: hash-...

    redis-windows-Redis7.0.0.zip

    Redis,全称Remote Dictionary Server,是一款开源的、高性能的键值存储系统,广泛应用于...通过理解其数据类型、命令操作、持久化机制以及复制与高可用性策略,开发者可以充分利用Redis优化应用程序,提升系统性能。

    redism秒杀系统优化

    综上,利用Redis优化秒杀系统,结合Java实现分布式Session和用户登录功能,能够有效提升系统性能,应对高并发场景。在实际应用中,还需结合业务需求和服务器资源进行调整和优化,以达到最佳效果。

    Redis基本原理、优化和应用示例.pdf

    2. Redis优化 - **内存优化**:Redis的内存管理很重要,可以通过设置最大内存限制、使用LRU(Least Recently Used)或LFU(Least Frequently Used)策略淘汰不常用数据,以及合理设计数据结构减少内存占用。另外,...

    CentOS7安装redis

    **Redis在CentOS7上的安装指南** Redis是一个高性能的键值数据库,广泛应用于缓存、消息中间件等领域。...了解Redis的数据类型、事务、持久化机制以及主从复制等特性,可以帮助你更好地利用Redis优化应用程序。

    windows下redis操作

    Redis是一款高性能的键值对...理解Redis的基本概念和命令,以及如何在Windows上配置和管理Redis服务,对于在Windows环境中利用Redis优化应用性能至关重要。通过实践和学习,你可以熟练掌握这一强大的内存数据存储系统。

    Redis配置详解.pdf

    本文将详细讲解 Redis 配置,包括官方配置分类、常用的 Redis 配置、如何优化 Redis 配置等内容。 官方配置分类 ---------------- Redis 的官方配置可以分为多个类别,包括 GENERAL、NETWORK、SNAPSHOTTING、...

    Node + Redis 接口性能优化实战

    为什么要使用Redis优化接口性能? -----?原因很简单,快!非常快! 如果遇到大并发,高负载的网站中你是必须要考虑redis的,redis数据库中的所有数据都存储在内存中。由于内存的读写速度远快于硬盘,因此Redis的的的...

    详谈redis优化配置和redis.conf说明(推荐)

    Redis是一款高性能的键值存储...此外,针对大key小value的情况,使用VM可能更有效,但通常建议保持键和值的大小均衡,以优化Redis的性能。在实际使用中,应根据具体应用场景调整这些配置参数,以达到最佳性能和稳定性。

    redis各个版本.rar

    综上所述,这个压缩包提供了Redis在Linux和Windows平台的不同版本,用户可以根据系统环境和需求选择合适的版本进行安装和配置,同时了解Redis的核心特性和应用场景,有助于更好地利用Redis优化系统性能和设计分布式...

    高并发的优化lua + openresty+redis (实现多级缓存)+限流(掌握)

    高并发的优化lua + openresty+redis (实现多级缓存)+限流(掌握)

    redis-6.2.6编译版本

    首先,Redis 6.2.6 是 Redis 的一个稳定版本,它在前一个版本的基础上进行了性能优化和功能增强。这个编译好的版本省去了用户自行下载源码、配置环境和编译的过程,使得部署更加便捷。以下是一些关键的Redis特性: ...

    redis的windows安装包及可视化工具

    **Redis在Windows环境下的安装与可视化管理** Redis是一款开源、高性能、无模式的键值对存储数据库,常用于缓存、...通过深入理解Redis的数据结构和命令,配合可视化工具,我们可以更好地利用Redis优化应用程序性能。

    springMVC注解+ security + redis 实例

    通过这个实例,你可以了解到如何在Spring MVC应用中使用注解简化开发,如何配置和使用Spring Security进行权限控制,以及如何利用Redis优化数据访问和会话管理。这样的实践对于提升个人技能和理解现代企业级应用的...

Global site tag (gtag.js) - Google Analytics