网站做漏洞扫描费用,专业做政法ppt的网站,手游网站怎么做的,做网站引用没有版权的歌曲Redis 管道
关键词#xff1a;Pipeline
Pipeline 简介
Redis 是一种基于 C/S 模型以及请求/响应协议的 TCP 服务。通常情况下#xff0c;一个 Redis 命令的请求、响应遵循以下步骤#xff1a;
客户端向服务端发送一个查询请求#xff0c;并监听 Socket 返回#xff08…Redis 管道
关键词Pipeline
Pipeline 简介
Redis 是一种基于 C/S 模型以及请求/响应协议的 TCP 服务。通常情况下一个 Redis 命令的请求、响应遵循以下步骤
客户端向服务端发送一个查询请求并监听 Socket 返回通常是以阻塞模式等待服务端响应。服务端处理命令并将结果返回给客户端。
显然如果每个 Redis 命令都发起一次请求、响应会很低效。因此Redis 客户端提供了一种批量处理技术即管道技术Pipeline。Pipeline 的工作原理就是将多个 Redis 命令一次性发送给服务端服务端处理后统一返回给客户端。由于减少了通信次数自然提升了处理效率。
Pipeline 限制
在使用 Redis 管道技术时要注意一些限制避免踩坑
Pipeline 不能保证原子性 - Pipeline 只是将客户端发送命令的方式改为批量发送而服务端在接收到 Pipeline 发来的命令后将其拆解为一条条命令然后依然是串行执行。执行过程中服务端有可能执行其他客户端的命令所以无法保证原子性。如需保证原子性可以考虑使用事务或 Lua 脚本。Pipeline 不支持回滚 - Pipeline 没有事务的特性如果待执行命令的前后存在依赖关系请勿使用 Pipeline。Pipeline 命令不宜过大 - 使用管道发送命令时Redis Server 会将部分请求放到缓存队列中占用内存执行完毕后一次性发送结果。如果需要发送大量的命令会占用大量的内存因此应该按照合理数量分批次的处理。Pipeline 不支持跨 slot 访问 - 由于 Pipeline 不支持跨 slot 访问因此在 Redis 集群模式下使用 Pipeline 时要确保访问的 key 都在同一 slot 中。
Pipeline 案例
主流的 Redis 客户端一般都会支持管道技术。
【示例】Jedis 管道使用示例
public class Demo {public static void main(String[] args) {String host localhost;int port 6379;Jedis jedis new Jedis(host, port);String key pipeline:test;jedis.del(key);// -------- 方法1method1(jedis, key);//-------- 方法2method2(jedis, key);}private static void method2(Jedis jedis, String key) {System.out.println(-----方法2-----);jedis.del(key);//初始化Pipeline pipeline jedis.pipelined();//需要先声明ResponseResponseLong r1 pipeline.incr(key);System.out.println(Pipeline发送请求);ResponseLong r2 pipeline.incr(key);System.out.println(Pipeline发送请求);ResponseLong r3 pipeline.incr(key);System.out.println(Pipeline发送请求);ResponseLong r4 pipeline.incr(key);System.out.println(Pipeline发送请求);ResponseLong r5 pipeline.incr(key);System.out.println(Pipeline发送请求);try {// 此时还未开始接收响应所以此操作会出错r1.get();} catch (Exception e) {System.out.println( Pipeline error还未开始接收响应 );}// 发送请求完成开始接收响应System.out.println(发送请求完成开始接收响应);pipeline.sync();System.out.println(Pipeline 接收响应 Response: r1.get());System.out.println(Pipeline 接收响应 Response: r2.get());System.out.println(Pipeline 接收响应 Response: r3.get());System.out.println(Pipeline 接收响应 Response: r4.get());System.out.println(Pipeline 接收响应 Response: r5.get());jedis.close();}private static void method1(Jedis jedis, String key) {Pipeline pipeline jedis.pipelined();System.out.println(-----方法1-----);for (int i 0; i 5; i) {pipeline.incr(key);System.out.println(Pipeline 发送请求);}// 发送请求完成开始接收响应System.out.println(发送请求完成开始接收响应);ListObject responses pipeline.syncAndReturnAll();if (responses null || responses.isEmpty()) {jedis.close();throw new RuntimeException(Pipeline error: 没有接收到响应);}for (Object resp : responses) {System.out.println(Pipeline 接收响应 Response: resp.toString());}System.out.println();}}