Redis优化及配置(二)

Redis所有的数据都在内存中,而内存优势非常宝贵的资源。常用的内存优化方案有如下几个部分:

1. 配置优化
2. 缩减健值对象
3. 命令处理
4. 缓存淘汰方案

二 缩减健值对象

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

  • key长度;如在设置键时,在完整描述业务情况下,键值越短越好。
  • value长度,值对象缩减比较复杂,常见需求是把业务对象序列化二进制数组放入redis。首先应该在业务上精简业务对象,在存到redis之前
    先把你的数据压缩下

常用的压缩方法对比:

压缩方法解压方法压缩时间压缩效果
bzcompress()bzdecompress()耗时多压缩效果好
gzcompress()gzuncompress()耗时少压缩效果差

三 命令处理

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

查看方式:

127.0.0.1:6379> info stats
# Stats
total_connections_received:1
total_commands_processed:8
instantaneous_ops_per_sec:0
total_net_input_bytes:238
total_net_output_bytes:14127
instantaneous_input_kbps:0.00
instantaneous_output_kbps:0.00
rejected_connections:0
sync_full:0
sync_partial_ok:0
sync_partial_err:0
expired_keys:0
expired_stale_perc:0.00
expired_time_cap_reached_count:0
evicted_keys:0
keyspace_hits:0
keyspace_misses:0
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:18701
migrate_cached_sockets:0
slave_expires_tracked_keys:0
active_defrag_hits:0
active_defrag_misses:0
active_defrag_key_hits:0
active_defrag_key_misses:0

解决方案:

  1. 使用多参数命令:若是客户端在很短的时间内发送大量的命令过来,会发现响应时间明显变慢,者由于后面的命令一直在等待队列中前面大量明亮执行完毕。有个方法可以改善延迟问题,就是通过单命令多参数的形式取代多命令单参数形式。

    举例来说:
    循环使用lset命令去添加1000个元素到list结构中,是性能比较差的一种方式,更好的做法是在客户端创建一个1000个元素的列表,用单个命令lpush或rpush,通过多参数的构造形式一次性把1000个元素发送到redis服务上。下面是redis一些操作命令,有单个参数命令和支持多个参数的命令,通过这些命令可以尽量减少多命令次数。

  2. 管道命令:另一个减少多命令的方式是使用管道(pipeline),把几个命令合并一起执行,从而减少因网络开销引起的延迟问题。因为10个命令单独发送到服务器端会引起10次网络延迟开销,使用管道会一次性把执行结果返回,仅需要一次网络开销。redis本身支持管道命令,多数客户端也支持,尚若当前实例延迟很明显,那多使用管道去降低延迟非常有效。
    管道查阅地址:https://www.runoob.com/redis/redis-pipelining.html

四 缓存淘汰优化

redis 内存数据集大小上升到一定大小的时候,就会进行数据淘汰策略。如果不淘汰经常不用的缓存数据,那么正常的数据将不会存储到缓存当中。

通过配置redis.conf中的maxmemory这个值来开启内存淘汰功能

  • maxmemory
    值得注意的是,maxmemory为0的时候表示我们对Redis的内存使用没有限制

根据应用场景,选择淘汰策略

  • maxmemory-policy noeviction

    内存淘汰的过程 :
    
    首先,客户端发起了需要申请更多内存的命令(如set)。
    
     然后,Redis检查内存使用情况,如果已使用的内存大于maxmemory则开始根据用户配置的不同淘汰策略来淘汰内存(key),从而换取一定的内存。
      
     最后,如果上面都没问题,则这个命令执行成功
    

截图(redis.conf):
在这里插入图片描述

动态改配置命令【也可以在配置文件修改】
(此外,redis支持动态改配置,无需重启)

设置最大内存
config set maxmemory 100000

设置内存淘汰策略
config set maxmemory-policy noeviction

内存淘汰策略:

策略说明
volatile-lru从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
allkeys-lru从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
volatile-lfu从设置了过期时间的数据集(server.db[i].expires)中选择某段时间之内使用频次最小的键值对清除掉
allkeys-lfu从所有的数据集(server.db[i].dict)中挑选某段时间之内使用频次最小简直对清除掉
volatile-ttl从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
volatile-random从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
allkeys-random从数据集(server.db[i].dict)中任意选择数据淘汰
no-enviction当内存达到限制的时候,不淘汰任何数据,不可写入任何数据集,所有引起申请内存的命令会报错。

如何选择淘汰策略:

几种策略的适用场景:

  • allkeys-lru :如果我们的应用对缓存的访问符合幂律分布,也就是存在相对热点数据,或者我们不太清楚我们应用的缓存访问分布状况,我们可以选择 allkeys-lru策略

  • allkeys-random :如果我们的应用对于缓存key的访问概率相等,则可以使用这个策略。

  • volatile-ttl:这种策略使得我们可以向Redis提示哪些key更适合被eviction。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值