Redis的批处理优化

Redis的批处理优化

大量的数据要导入到Redis中,要怎么处理?

单个命令的执行流程

客户端 发送命令 到Redis服务端,服务端 执行命令 ,然后 返回结果 给客户端。

共需要 1次往返的网络传输耗时 + 1次Redis执行命令耗时

N条命令批量执行

由于redis服务端处理命令的速度是很快的,是在微秒级别的,而网络IO进行发送命令和返回结果的速度是很慢的,是在毫秒级别的,所以我们可以批量发送多条命令,减少网络IO的次数,提高性能。

Redis提供了很多Mxxx这样的命令,可以实现批量插入数据,就例如:mset、hmset。

10万条商品数据的插入,使用批处理优化(每1000条批量发送一次),比单个单个的插入速度快约177倍(44秒 -> 248毫秒)。大大减少了网络事件。

Pipeline

hmset、sadd等命令的key都不能改变,批处理只能处理同一个key下的元素,而mset也只能批处理String类型的key,使用redis服务端提供的原生的命令不太好做批处理,有很多限制,所以可以使用一些Redis客户端提供的Pipeline功能,更丰富。

可以往pipeline里面不断地添加命令,然后如果想要发送给客户端执行了,就可以使用sync()方法,批量发给客户端执行。代码示例如下:

@Test
void testPipeline() {
    // 创建管道
    Pipeline pipeline = jedis.pipelined();

    for (int i = 1; i <= 100000; i++) {
        // 放入命令到管道
        pipeline.set("testkey_" + i, "value_" + i);
        if (i % 1000 == 0) {
            // 每放入1000条命令,批量执行
            pipeline.sync();
        }
    }
}

集群模式下的批处理

在集群下,由于每个Redis实例都负责管各自的插槽部分,所以批处理的所有key都需要落在一个插槽中,不然的话就会导致执行失败,因为多条命令是一起传输的,只能一次网络IO到目标Redis,这些命令不能拆分,如果目的地是不同的Redis实例的话,他们也没办法拆开来路由。

所以可以在客户端可以提前计算出每个key对应的slot,然后根据slot一致分为一组。每组都各自用pipeline批处理。这里之后就可以选择 串行 或者 并行 执行了。因为不同的插槽是不同的redis实例,所以可以并行更加节省时间。

### Redis 参数配置优化最佳实践 #### 一、持久化策略调整 对于主要用于缓存场景的Redis实例,建议不开启持久化功能。如果确实需要持久化能力,推荐关闭RDB持久化而启用AOF(Append Only File)持久化方式[^4]。 为了降低AOF重写带来的性能影响,应合理设定`auto-aof-rewrite-min-size`和`auto-aof-rewrite-percentage`参数值,防止过早触发自动重写操作;同时设置`no-appendfsync-on-rewrite=yes`选项,在执行BGREWRITEAOF过程中暂停向磁盘同步日志文件的操作,从而减轻可能造成的阻塞现象。 #### 二、内存管理调优 确保每台承载Redis服务的服务器都留有足够的剩余RAM空间用于处理FORK操作及后续的数据复制工作。单个Redis进程分配的最大内存量不宜过高,通常不超过8GB较为合适,这样既能加速分叉过程又能减小主从节点间的同步压力以及跨机器迁移数据时的风险。 针对存在大量大尺寸键的情况,应当考虑采用更合适的存储结构替代哈希表等默认形式,并尽可能拆分成多个较小规模的对象保存于不同位置之中。另外,自Redis 4.0起引入了UNLINK指令支持后台线程渐进式释放资源,可有效缓解即时销毁巨型条目所引发的时间延迟问题[^1]^5]。 #### 三、部署环境规划 避免在同一硬件平台上共置其他消耗大量计算力的应用程序比如Web服务器或是批处理作业调度器之类,以免相互争夺有限的处理器周期造成响应时间延长甚至超时错误的发生。同样道理,也最好不要让Redis与那些频繁读写的数据库引擎或者消息中间件共享同一套I/O设备以防带宽争抢导致整体吞吐量下降。 ```bash # 设置最大使用的内存大小为4G maxmemory 4gb # 当达到最大内存限制时采用LRU算法驱逐部分旧数据腾出地方给新的请求 maxmemory-policy allkeys-lru # 开启AOF并指定增量更新模式提高效率 appendonly yes appendfsync everysec # 控制何时启动AOF重写机制 auto-aof-rewrite-min-size 64mb auto-aof-rewrite-percentage 100 # 停止在重写期间追加记录到现有日志里边去 no-appendfsync-on-rewrite yes ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值