Redis性能优化13条规则攻克!史上最全
1。减少键值对的存储长度
键值对的长度与性能成反比。例如,我们做一组写入数据的性能测试。执行结果如下:
其中,O(1)表示可以安全使用,O(N)则需谨慎。 N表示不确定。数据越大,查询速度越低。越慢。由于Redis只使用一个线程来查询数据,这些指令如果耗时较长,就会阻塞Redis并造成很大的延迟。为了避免 O(N) 命令对 Redis 的影响,可以从以下几个方面入手:
- 您决定禁用按键命令;
- 避免一次向所有成员发出请求,使用 scan 命令进行批量处理。游标式遍历;
- 通过机制严格控制hash、set、sorted set等结构数据量;
- 在客户端进行排序、合并、交叉等操作,减少Redis服务器的工作负载;
- 删除大量数据(del)可能需要很长时间,因此建议使用异步删除来断开链接,该方式会启动一个新线程来删除目标数据,而不会阻塞Redis主线程。
5。使用slowlog优化耗时命令
我们可以利用slowlog功能找出最耗时的Redis命令并进行相关优化,以提高Redis的运行速度。慢查询有两个重要的配置项:
slowlog-log-slower-than
:用于设置慢查询的评估时间。这意味着超过此配置元素的命令将在慢速请求日志中记录为慢速操作。它的执行单元是微。秒(1 秒等于 1000000 微秒);slowlog-max-len
:用于配置慢查询日志的最大条目数。
我们可以根据实际业务情况进行配置。慢日志按照慢查询进入日志的相反顺序记录。我们可以使用函数slowlog get n
来获取慢查询的相关日志,然后找到与这些慢查询匹配的公司并进行相关优化。
6。使用Pipeline批量数据
Pipeline(管道技术)是一种客户端提供的批处理技术,用于同时处理多个Redis命令,从而提高所有通信的性能。 ? :
public class PipelineExample {
public static void main(String[] args) {
Jedis jedis = new Jedis("127.0.0.1", 6379);
// 记录执行开始时间
long beginTime = System.currentTimeMillis();
for (int i = 0; i < 100; i++) {
jedis.set("key" + i, "val" + i);
jedis.del("key"+i);
}
// 记录执行结束时间
long endTime = System.currentTimeMillis();
System.out.println("执行耗时:" + (endTime - beginTime) + "毫秒");
}
}
复制代码
上述程序的执行结果为:
执行时间:17276毫秒
从上面的结果可以看出,管道的执行时间为297毫秒,而管道的执行时间为:是297毫秒,正常指令是17276毫秒。管道技术要求比传统灌装速度快约 58 倍。
7。避免大量数据同时失败
Redis 使用贪婪策略删除过时的键值。它每秒执行 10 次过期扫描。该配置可以在redis.conf文件中配置。默认值为 hz 10
,Redis 随机选择 20 个值,并从这 20 个键中删除过期的键。如果过期key的比例超过25%,则重复这个过程,如下图所示:
配置完成后必须重启Redis服务器才能使配置生效,但可以修改配置文件,这样每次Redis服务重启后显示的配置信息都不会丢失。需要注意的是,在不需要持久化的企业中,可以关闭持久化,这样可以有效提高Redis的运行速度,而不会造成间歇性延迟。
12。禁用THP功能
Linux内核在2.6.38内核中添加了透明大页(THP)功能,支持分配2MB的大内存页,默认开启。
当THP打开时,货叉速度会减慢。 fork后,每页内存从最初的4KB变为2MB,这大大增加了主进程重写时的内存消耗。同时,每个写命令引起的内存页复制数量增加了512倍,这减慢了写操作的执行时间,导致许多写操作的请求变慢。例如,简单的 incr 命令也会出现在慢查询中,因此 Redis 建议禁用此功能。禁用方法如下:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
为了让THP配置在重启机器后生效,可以添加 ysecho never > / /etc/rc.local 中的 sys /kernel/mm/transparent_hugepage/enabled
。 ?对于同步功能,我们可以将写入放在主库中,并将读取功能传递给子服务。因此单位时间内可以处理更多的请求,从而提高Redis的整体速度。
Guard模式是主从功能的延伸,但如果主节点崩溃,可以自动恢复Redis的正常使用,无需人工干预。
Redis 3.0正式上线Redis集群。 Redis集群通过将数据库分布在多个节点上存储来平衡各个节点的负载压力。
Redis Cluster 采用虚拟哈希套接字分区。根据哈希函数,所有键都映射到 0-16383 整数槽。计算公式为:slot = CRC16(key) & 16383。每个节点负责维护slot部分和slot位置。键值数据映射。这样Redis就可以将一台服务器的读写压力分散到多台服务器上,因此性能得到很大的提升。
我们只需要使用这三个函数之一即可。毫无疑问,Redis Cluster应该是首选的实现方案。可自动与多台服务器分担读写压力,并具有自动容灾功能。我们可以。
作者:老王_Java中文社区
链接:https://juejin.im/post/5e79702af265da570c75580a♶作者拥有版权s来源:♶。商业转载请联系作者授权。非商业转载请注明出处。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。