redis

一张图搞定redis内存优化及配置

2019-12-11  本文已影响0人  心似南风
Redis内存优化及配置.png

Redis优化及配置

Redis所有的数据都在内存中,而内存又是非常宝贵的资源。常用的内存优化方案有如下几部分:
一、配置优化
二、缩减键值对象
三、命令处理
四、缓存淘汰方案

一、配置优化

Linux 配置优化

目前大部分公司都会将 Web 服务器、数据库服务器等部署在 Linux 操作系统上,Redis优化也需要考虑操作系统,所以接下来介绍 Linux 操作系统如何优化 Redis。

内存分配

THP

swappiness

ulimit设置

Redis配置优化

  1. 设置maxmemory。设置Redis使用的最大物理内存,即Redis在占用maxmemory大小的内存之后就开始拒绝后续的写入请求,该参数可以确保Redis因为使用 了大量内存严重影响速度或者发生OOM(out-of-memory,发现内存不足时,它会选择杀死一些进程(用户态进程,不是内核线程),以便释放内存)。此外, 可以使用info命令查看Redis占用的内存及其它信息。
  2. 让键名保持简短。键的长度越长,Redis需要存储的数据也就越多。
  3. 客户端timeout 设置一个超时时间,防止无用的连接占用资源。设置如下命令:
    timeout 150
    tcp-keepalive 150 (定时向client发送tcp_ack包来探测client是否存活的。默认不探测)
  4. 检查数据持久化策略
    数据落磁盘尽可能减少性能损坏,以空间换时间。设置如下命令:
  1. 优化AOF和RDB,减少占用CPU时间 主库可以不进行dump操作或者降低dump频率。 取消AOF持久化。命令如下:appendonly no
  2. 监控客户端的连接
  1. 限制客户端连接数 。在Redis-cli工具中输入info clients可以查看到当前实例的所有客户端连接信息

二、缩减键值对象

降低Redis内存使用最直接的方式就是缩减键(key)和值(value)的长度

常用压缩方法对比


常用压缩方法.png

三、命令处理

Redis基于C/S架构模式,基于Redis操作命令是解决响应延迟问题最关键的部分,因为Redis是个单线程模型,客户端过来的命令是按照顺序执行的。比较常见的 延迟是带宽,通过千兆网卡的延迟大约有200μs。倘若明显看到命令的响应时间变慢,延迟高于200μs,那可能是Redis命令队列里等待处理的命令数量比较多 要分析解决这个性能问题,需要跟踪命令处理数的数量和延迟时间。 比如可以写个脚本,定期记录total_commands_processed的值。当客户端明显发现响应时间过慢时,可以通过记录的total_commands_processed历史数据值来判 断命理处理总数是上升趋势还是下降趋势,以便排查问题 在info信息里的 total_commands_processed字段显示了Redis服务处理命令的总数。

命令处理.png
解决方案:
  1. 使用多参数命令:若是客户端在很短的时间内发送大量的命令过来,会发现响应时间明显变慢,这由于后面命令一直在等待队列中前面大量命令执行完毕。有 个方法可以改善延迟问题,就是通过单命令多参数的形式取代多命令单参数的形式。
  1. 管道命令:另一个减少多命令的方法是使用管道(pipeline),把几个命令合并一起执行,从而减少因网络开销引起的延迟问题。因为10个命令单独发送到服务端 会引起10次网络延迟开销,使用管道会一次性把执行结果返回,仅需要一次网络延迟开销。Redis本身支持管道命令,大多数客户端也支持,倘若当前实例延迟 很明显,那么使用管道去降低延迟是非常有效的。

缓存淘汰优化

redis 内存数据集大小上升到一定大小的时候,就会进行数据淘汰策略。如果不淘汰经常不用的缓存数据,那么正常的数据将不会存储到缓存当中。 我们通过配置redis.conf中的maxmemory这个值来开启内存淘汰功能。

动态改配置命令

  1. 设置最大内存
    config set maxmemory 100000
  2. 设置淘汰策略
    config set maxmemory-policy noeviction

内存淘汰策略

如何选择淘汰策略

下面看看几种策略的适用场景
allkeys-lru :如果我们的应用对缓存的访问符合幂律分布,也就是存在相对热点数据,或者我们不太清楚我们应用的缓存访问分布状况,我们可以选择 allkeys-lru策略。
allkeys-random :如果我们的应用对于缓存key的访问概率相等,则可以使用这个策略。
volatile-ttl:这种策略使得我们可以向Redis提示哪些key更适合被eviction。

另外,volatile-lru策略和volatile-random策略适合我们将一个Redis实例既应用于缓存和又应用于持久化存储的时候,然而我们也可以通过使用两个Redis实例来达 到相同的效果,值得一提的是将key设置过期时间实际上会消耗更多的内存,因此我们建议使用allkeys-lru策略从而更有效率的使用内存

上一篇 下一篇

猜你喜欢

热点阅读