redis 优化

  • 系统优化 echo "vm.overcommit_memory=1" > /etc/sysctl.conf  0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。 1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。 2, 表示内核允许分配超过所有物理内存和交换空间总和的内存 echo never > /sys/kernel/mm/transparent_hugepage/enabled 禁用NUMA优化机制提高性能 echo 1024 >/proc/sys/net/core/somaxconn 修改限制接收新 TCP 连接侦听队列的大小,默认128.
  • 文件句柄优化 修改linux系统参数。vim /etc/security/limits.conf 添加 *  soft  nofile  65535 *  hard nofile  65535
  • 内存优化 采用jemalloc内存分配器,降低内存碎片率
  • 配置优化  maxmemory 7g maxmemory-policy allkeys-lru maxclients 0

配置文件说明:

daemonize yes #是否以后台进程运行,默认为no,如果需要以后台进程运行则改为yes pidfile /var/run/redis.pid #如果以后台进程运行的话,就需要指定pid,你可以在此自定义redis.pid文件的位置. port 6379 #接受连接的端口号,如果端口是0则redis将不会监听TCP socket连接 maxmemory 7g #最大可使用内存. #警告:如果你想把Redis视为一个真正的DB的话,那不要设置<maxmemory>,只有你只想把Redis作为cache或者有状态的server('state' server)时才需要设置. maxmemory-policy allkeys-lru #内存清理策略:如果达到了maxmemory,你可以采取如下动作: # volatile-lru -> (默认策略)使用LRU算法来删除过期的set # allkeys-lru -> 删除任何遵循LRU算法的key # volatile-random ->随机地删除过期set中的key # allkeys->random -> 随机地删除一个key # volatile-ttl -> 删除最近即将过期的key(the nearest expire time (minor TTL)) # noeviction -> 根本不过期,写操作直接报错 maxmemory-samples 2 #对于处理redis内存来说,LRU和minor TTL算法不是精确的,而是近似的(估计的)算法.所以我们会检查某些样本#来达到内存检查的目的.默认的样本数是3. maxclients 0 #设置最大连接数.默认没有限制,'0'意味着不限制. tcp-backlog 511 #在高并发的环境中,为避免慢客户端的连接问题,需要设置一个高速后台日志. timeout 0 #连接超时时间,单位秒.0是不超时. tcp-keepalive 0 #在Linux上,指定值(秒)用于发送 ACKs 的时间.注意关闭连接需要双倍的时间.默认为0. loglevel notice #日志级别,默认是verbose(详细). logfile "./6379/6379.log" #指定log文件的名字,默认是stdout.stdout会让redis把日志输出到标准输出.但是如果使用stdout而又以后台进程的方式运行redis,则日志会输出到/dev/null. databases 16 #设置数据库数目.默认的数据库是DB 0.可以通过SELECT <dbid>来选择一个数据库,dbid是[0,'databases'-1]的数字. #save 900 1 #save 300 10 #save 60 10000 #以上面的例子来说明: #过了900秒并且有1个key发生了改变 就会触发save动作 #过了300秒并且有10个key发生了改变 就会触发save动作 #过了60秒并且至少有10000个key发生了改变 也会触发save动作 #注意:如果你不想让redis自动保存数据,那就把下面的配置注释掉! stop-writes-on-bgsave-error yes #后台存储错误停止写. rdbcompression yes #存储至本地数据库时(持久化到 rdb 文件)是否压缩数据,默认为 yes rdbchecksum yes #RDB文件的是否直接偶像chcksum. dbfilename dump.rdb #保存dump数据的文件名. dir ./6379 #数据存放目录. slave-serve-stale-data yes #当slave丢失与master的连接时,或者slave仍然在于master进行数据同步时(还没有与master保持一致),slave可以有两种方式来响应客户端请求: #如果slave-serve-stale-data 设置成 'yes' (the default) slave会仍然响应客户端请求,此时可能会有问题. #如果slave-serve-stale data设置成'no'slave会返回"SYNC with master in progress"这样的错误信息.但INFO和SLAVEOF命令除外. slave-read-only yes #配置slave实例是否接受写.写 slave 对存储短暂数据(在同 master 数据同步后可以很容易地被删除)是有用的,但未配置的情况下,客户端写可能会发送问题.从 Redis2.6 后,默认 slave 为 read-only. repl-diskless-sync no repl-diskless-sync-delay 5 repl-disable-tcp-nodelay no #"yes",Redis 将使用一个较小的数字 TCP 数据包和更少的带宽将数据发送到 slave , 但是这可能导致数据发送到 slave 端会有延迟 , 如果是 Linux kernel 的默认配置,会达到 40 毫秒. #"no",则发送数据到slave 端的延迟会降低,但将使用更多的带宽用于复制. slave-priority 100 #slave的优先级是一个整数展示在Redis的Info输出中.如果master不再正常工作了,哨兵将用它来选择一个slave提升为master. #优先级数字小的salve会优先考虑提升为master,所以例如有三个slave优先级分别为10,100,25,哨兵将挑选优先级最小数字为10的slave. #0作为一个特殊的优先级,标识这个slave不能作为master,所以一个优先级为0的slave永远不会被哨兵挑选提升为master. #默认优先级为100. appendonly no #默认情况下,Redis是异步的把数据导出到磁盘上.这种模式在很多应用里已经足够好,但Redis进程出问题或断电时可能造成一段时间的写操作丢失(这取决于配置的save指令). #AOF是一种提供了更可靠的替代持久化模式,例如使用默认的数据写入文件策略(参见后面的配置) #在遇到像服务器断电或单写情况下Redis自身进程出问题但操作系统仍正常运行等突发事件时,Redis能只丢失1秒的写操作. #AOF和RDB持久化能同时启动并且不会有问题. #如果AOF开启,那么在启动时Redis将加载AOF文件,它更能保证数据的可靠性. appendfilename "appendonly.aof" #纯累加文件名字(默认:"appendonly.aof") appendfsync everysec #调用fsync()函数通知操作系统立刻向硬盘写数据. #no:不fsync, 只是通知OS可以flush数据了,具体是否flush取决于OS.性能更好. #always: 每次写入append only 日志文件后都会fsync.性能差,但很安全. #everysec: 没间隔1秒进行一次fsync,折中. no-appendfsync-on-rewrite no #如果把这个设置成"yes"带来了延迟问题,就保持"no",这是保存持久数据的最安全的方式. auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb aof-load-truncated yes #自动重写AOF文件 #如果AOF日志文件增大到指定百分比,Redis能够通过 BGREWRITEAOF 自动重写AOF日志文件. #工作原理:Redis记住上次重写时AOF文件的大小(如果重启后还没有写操作,就直接用启动时的AOF大小) #这个基准大小和当前大小做比较.如果当前大小超过指定比例,就会触发重写操作.你还需要指定被重写日志的最小尺寸,这样避免了达到指定百分比但尺寸仍然很小的情况还要重写. #指定百分比为0会禁用AOF自动重写特性. lua-time-limit 5000 #Lua 脚本的最大执行时间,毫秒为单位 #如果达到了最大的执行时间,Redis将要记录在达到最大允许时间之后一个脚本仍然在执行,并且将开始对查询进行错误响应. # 当一个长时间运行的脚本超过了最大执行时间,只有 SCRIPT KILL 和 SHUTDOWN NOSAVE 两个命令可用.第一个可以用于停止一个还没有调用写命名的脚本.第二个是关闭服务器唯一方式,当写命令已经通过脚本开始执行,并且用户不想等到脚本的自然 终止. #设置成0或者负值表示不限制执行时间并且没有任何警告 slowlog-log-slower-than 10000 #上面的时间单位是微秒,所以1000000就是1秒.注意,负数时间会禁用慢查询日志,而0则会强制记录所有命令. slowlog-max-len 128 #这个长度没有限制.只是要主要会消耗内存.你可以通过 SLOWLOG RESET 来回收内存. latency-monitor-threshold 0 notify-keyspace-events "" #事件通知,默认空字符串意思是禁用通知. #当事件发生时, Redis 可以通知 Pub/Sub 客户端. #可以在下表中选择 Redis 要通知的事件类型.事件类型由单个字符来标识: # K   Keyspace 事件,以 _keyspace@<db>_ 的前缀方式发布 # E   Keyevent 事件,以 _keysevent@<db>_ 的前缀方式发布 # g   通用事件(不指定类型),像 DEL, EXPIRE, RENAME, … # $   String 命令 # s   Set 命令 # h   Hash 命令 # z   有序集合命令 # x   过期事件(每次 key 过期时生成) # e   清除事件(当 key 在内存被清除时生成) # A   g$lshzxe 的别称,因此 ”AKE” 意味着所有的事件 hash-max-ziplist-entries 512 hash-max-ziplist-value 64 #当 hash 中包含超过指定元素个数并且最大的元素没有超过临界时, #hash 将以一种特殊的编码方式(大大减少内存使用)来存储,这里可以设置这两个临界值 #Redis Hash 对应 Value 内部实际就是一个 HashMap ,实际这里会有 2 种不同实现, #这个 Hash 的成员比较少时 Redis 为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的 HashMap 结构,对应的 valueredisObject 的 encoding 为 zipmap, #当成员数量增大时会自动转成真正的 HashMap, 此时 encoding 为 ht . list-max-ziplist-entries 512 list-max-ziplist-value 64 #和 Hash一样,多个小的 list 以特定的方式编码来节省空间. #list数据类型节点值大小小于多少字节会采用紧凑存储格式. set-max-intset-entries 512 #set数据类型内部数据如果全部是数值型,且包含多少节点以下会采用紧凑格式存储. zset-max-ziplist-entries 128 zset-max-ziplist-value 64 #和hashe和list一样,排序的set在指定的长度内以指定编码方式存储以节省空间 #zsort数据类型节点值大小小于多少字节会采用紧凑存储格式. hll-sparse-max-bytes 3000 activerehashing yes #redis 将在每100毫秒时使用1毫秒的CPU时间来对redis的hash表进行重新hash,可以降低内存的使用.当你的使用场景中,有非常严格的实时性需 要,不能够接受Redis时不时的对请求有2毫秒的延迟的话,把这项配置为 no.如果没有这么严格的实时性要求,可以设置为 yes,以便能够尽可能快的释放内存. client-output-buffer-limit normal 0 0 0 client-output-buffer-limit slave 256mb 64mb 60 client-output-buffer-limit pubsub 32mb 8mb 60 #Redis 调用内部函数来执行许多后台任务,如关闭客户端超时的连接,清除过期的 Key ,等等. #不是所有的任务都以相同的频率执行,但 Redis 依照指定的“ hz ”值来执行检查任务. #默认情况下,"hz"的被设定为 10 . #提高该值将在 Redis 空闲时使用更多的 CPU 时,但同时当有多个 key 同时到期会使 Redis 的反应更灵敏,以及超时可以更精确地处理. #范围是 1 到 500 之间,但是值超过100通常不是一个好主意. #大多数用户应该使用 10 这个预设值,只有在非常低的延迟的情况下有必要提高最大到 100 . hz 10 aof-rewrite-incremental-fsync yes #当一个子节点重写AOF文件时,如果启用上面的选项,则文件每生成32M数据进行同步.

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏性能与架构

nginx 缓存机制

Nginx缓存的基本思路 利用请求的局部性原理,将请求过的内容在本地建立一个副本,下次访问时不再连接到后端服务器,直接响应本地内容 Nginx服务器启动后,会对...

4016
来自专栏阿杜的世界

JVM、GC和常用命令

这是11月份的一个分享,借着组内分享的机会,重新梳理了一遍JVM的一些基本概念和学习资料。在这个PPT中,关于G1的部分比较粗略,最近正在恶补G1的知识,后面可...

603
来自专栏北京马哥教育

linux系统性能监控与优化(4)–IO

IO子系统一般是linux系统中最慢的部分。一个原因是它距离CPU的距离,另一个原因是它的物理结构。访问磁盘的时间与访问内存的时间是7天与7分钟的区别。linu...

34715
来自专栏抠抠空间

python中的Redis键空间通知(过期回调)

Redis是一个内存数据结构存储库,用于缓存,高速数据摄取,处理消息队列,分布式锁定等等。

1825
来自专栏存储

spring boot redis分布式锁

随着现在分布式架构越来越盛行,在很多场景下需要使用到分布式锁。分布式锁的实现有很多种,比如基于数据库、zookeeper等,本文主要介绍使用Redis做分布式锁...

4135
来自专栏Golang语言社区

NSQ的golang客户端简单使用

NSQ 是由国外的一个短链服务商bitly使用golang开发的一个消息队列系统,正好使用到了这个东西,在这里简单的记录下。 获取客户端 nsq的golang客...

3707
来自专栏Java架构沉思录

如何优雅地用Redis实现分布式锁

在学习Java多线程编程的时候,锁是一个很重要也很基础的概念,锁可以看做是多线程情况下访问共享资源的一种线程同步机制。这是对于单进程应用而言的,即所有线程都在同...

361
来自专栏Web 开发

深入Sever-Sent Events

Server-Sent Events(SSE)实现了服务器向浏览器单向推送消息的能力,前面文章有提到过,今天这里来详细讲解下。

580
来自专栏张善友的专栏

Enterprise Library 4 缓存应用程序块的设计

缓存应用程序为以下目的而设计: 提供一个大小可管理的 API 集合。 允许开发人员添加标准的缓存操作到他们的应用程序中,而不用学习应用程序块的内部工作。 ...

1796
来自专栏散尽浮华

Python-操作Memcache、Redis、RabbitMQ、

Memcache 简述:      Memcache是一套分布式的高速缓存系统,由LiveJournal的Brad Fitzpatrick开发,但目前被许多网站...

2397

扫码关注云+社区