吊打面试官系列:Redis 性能优化的 13 条军规大全
如果在大型系统中有大量缓存在同一时间同时过期,那么会导致 Redis 循环多次持续扫描删除过期字典,直到过期字典中过期键值被删除的比较稀疏为止,而在整个执行过程会导致 Redis 的读写出现明显的卡顿,卡顿的另一种原因是内存管理器需要频繁回收内存页,因此也会消耗一定的 CPU。 为了避免这种卡顿现象的产生,需要预防大量的缓存在同一时刻一起过期,就简单的解决方案就是在过期时间的基础上添加一个指定范围的随机数。 8.客户端使用优化在客户端的使用上我们除了要尽量使用 Pipeline 的技术外,还需要注意要尽量使用 Redis 连接池,而不是频繁创建销毁 Redis 连接,这样就可以减少网络传输次数和减少了非必要调用指令。 9.限制 Redis 内存大小在 64 位操作系统中 Redis 的内存大小是没有限制的,也就是配置项 maxmemory <bytes> 是被注释掉的,这样就会导致在物理内存不足时,使用 swap 空间既交换空间,而当操心系统将 Redis 所用的内存分页移至 swap 空间时,将会阻塞 Redis 进程,导致 Redis 出现延迟,从而影响 Redis 的整体性能。因此我们需要限制 Redis 的内存大小为一个固定的值,当 Redis 的运行到达此值时会触发内存淘汰策略,内存淘汰策略在 Redis 4.0 之后有 8 种: 1.?noeviction:不淘汰任何数据,当内存不足时,新增操作会报错,Redis 默认内存淘汰策略; 2.?allkeys-lru:淘汰整个键值中最久未使用的键值; 3.?allkeys-random:随机淘汰任意键值; 1.?volatile-lru:淘汰所有设置了过期时间的键值中最久未使用的键值; 2.?volatile-random:随机淘汰设置了过期时间的任意键值; 3.?volatile-ttl:优先淘汰更早过期的键值。 在 Redis 4.0 版本中又新增了 2 种淘汰策略:1.?volatile-lfu:淘汰所有设置了过期时间的键值中,最少使用的键值; 2.?allkeys-lfu:淘汰整个键值中最少使用的键值。 其中 allkeys-xxx 表示从所有的键值中淘汰数据,而 volatile-xxx 表示从设置了过期键的键值中淘汰数据。 我们可以根据实际的业务情况进行设置,默认的淘汰策略不淘汰任何数据,在新增时会报错。 10.使用物理机而非虚拟机在虚拟机中运行 Redis 服务器,因为和物理机共享一个物理网口,并且一台物理机可能有多个虚拟机在运行,因此在内存占用上和网络延迟方面都会有很糟糕的表现,我们可以通过 ./redis-cli --intrinsic-latency 100 命令查看延迟时间,如果对 Redis 的性能有较高要求的话,应尽可能在物理机上直接部署 Redis 服务器。 11.检查数据持久化策略Redis 的持久化策略是将内存数据复制到硬盘上,这样才可以进行容灾恢复或者数据迁移,但维护此持久化的功能,需要很大的性能开销。 在 Redis 4.0 之后,Redis 有 3 种持久化的方式: · RDB(Redis DataBase,快照方式)将某一个时刻的内存数据,以二进制的方式写入磁盘; · AOF(Append Only File,文件追加方式),记录所有的操作命令,并以文本的形式追加到文件中; (编辑:网站开发网_马鞍山站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |