当前位置: 首页 > news >正文

福建漳州网站建设公司专业做app软件开发公司

福建漳州网站建设公司,专业做app软件开发公司,宝安网站制作公司,如果在浏览器上做一网站广告大约需要多少钱文章目录 【README】【1】redis流水线Pipeline【1.1】redis流水线概念【1.2】redis流水线性能测试【1.2.1】使用流水线与未使用流水线的性能对比【1.2.2】使用流水线与redis原生批量命令的性能对比【1.2.3】流水线缺点 【1.3】Jedis客户端执行流水线【1.3.1】Jedis客户端执行流…

文章目录

  • 【README】
  • 【1】redis流水线Pipeline
    • 【1.1】redis流水线概念
    • 【1.2】redis流水线性能测试
      • 【1.2.1】使用流水线与未使用流水线的性能对比
      • 【1.2.2】使用流水线与redis原生批量命令的性能对比
      • 【1.2.3】流水线缺点
    • 【1.3】Jedis客户端执行流水线
      • 【1.3.1】Jedis客户端执行流水线实现批量删除代码实践
      • 【1.3.2】Jedis客户端执行流水线并获取执行结果代码实践

【README】

本文总结自《redis开发与运维》,作者付磊,张益军,墙裂推荐;

  • 本文使用的redis版本是 7.0.15 ;
  • 本文主要介绍redis流水线概念及jedis操作流水线代码实践;
  • 代码参见: https://github.com/TomJourney/redisDiscover/tree/master


【1】redis流水线Pipeline

1)redis客户端执行一条命令分为4个步骤:

  1. 发送命令;
  2. 命令排队;
  3. 命令执行;
  4. 返回结果;

2)RTT往返时间:发送命令与返回结果的执行耗时(RTT-Round Trip Time)

3)问题与解决方法:

  • 问题:redis的批量操作命令能够有效节约RTT,如mget,mset。但问题是大部分命令不支持批量操作,如hgetall,即批量业务场景只能执行单条命令,网络IO高,导致RTT高。

    • 【例】: redis客户端在北京,服务器在上海,两地直线距离为1300公里,1次RTT时间=1300*2/(300000 * 2/3) = 13ms(光在真空中的速度为每秒30w公里,假设光纤传播速度为光速的2/3,即每秒20w公里)
    • 若批量业务场景需要执行10次hgetall,则需要130ms,单单操作redis的网络io就有130ms,还不算正常的业务逻辑耗时,显然操作redis的耗时是不合理的(补充: 一般一次请求响应的网络耗时不超过200ms );
  • 解决方法:使用redis流水线技术;

4)其他补充: redis命令真正执行的耗时是微秒级别(1s=1000000 microsecond);所以才会有redis性能瓶颈在网络开销的说法



【1.1】redis流水线概念

1)redis流水线:能够将一组redis命令进行组装, 通过一次RTT传输给redis,再将这组执行结果一次性返回给客户端;即使用pipeline执行n次命令,耗时1个RTT;

在这里插入图片描述



【1.2】redis流水线性能测试

【1.2.1】使用流水线与未使用流水线的性能对比

1)在不同网络环境下, 10000条set未使用流水线命令 与 使用流水线命令执行耗时如下。

在这里插入图片描述

2)redis流水线性能对比结论:

  • 流水线执行速度一般比逐条执行要快;
  • 客户端与服务器的网络延时越大,,则流水线的效果越明显;


【1.2.2】使用流水线与redis原生批量命令的性能对比

1)流水线与原生批量命令区别:

  • 流水线执行命令不是原子的,而原生批量命令是原子的;
  • 流水线支持多个命令,而原生批量命令是一个命令操作多个key,如mset;
  • 流水线需要客户端与服务器同时提供支持,而原生批量命令是redis服务器提供支持;


【1.2.3】流水线缺点

1)每次流水线封装的命令不能太多,流水线组装的命令过多可能导致阻塞;

  • 一方面:一次流水线可能增加客户端的等待时间;
  • 另一方面:造成一定的网络阻塞;

2)解决方法: 可以将包含大量命令的流水线拆分为多个小流水线;



【1.3】Jedis客户端执行流水线

【1.3.1】Jedis客户端执行流水线实现批量删除代码实践

【PooledJedisBatchDelViaPipeline】池化jedis操作流水线

public class PooledJedisBatchDelViaPipeline {public static void main(String[] args) {BusiJedisFactoryUsingPool busiJedisFactoryUsingPool = BusiJedisFactoryUsingPool.build();// 从jedis连接池获取jedis对象Jedis jedis = busiJedisFactoryUsingPool.getJedis();try {System.out.println(jedis.get("user01"));System.out.println(jedis.get("user02"));batchDelete(jedis, Arrays.asList("user01", "user02"));} catch (Exception e) {throw new IllegalStateException(e.getMessage(), e);} finally {if (Objects.nonNull(jedis)) {jedis.close();}}// 删除键之后获取键// 从jedis连接池获取jedis对象System.out.println("========== 删除键之后获取键 ========== ");jedis = busiJedisFactoryUsingPool.getJedis();try {System.out.println(jedis.get("user01"));System.out.println(jedis.get("user02"));} catch (Exception e) {throw new IllegalStateException(e.getMessage(), e);} finally {if (Objects.nonNull(jedis)) {jedis.close();}}}private static void batchDelete(Jedis jedis, List<String> keys) {// 生成pipeline对象Pipeline pipeline = jedis.pipelined();for (String key : keys) {pipeline.del(key);}// 提交命令到redispipeline.sync();}
}

【日志】

zhagnsan01
zhagnsan02
========== 删除键之后获取键 ========== 
null
null

【代码解说】

  • jedis.pipelined() :创建流水线对象;
  • pipeline.del(String key) 与 jedis.del(String key) 的写法是一致的,只不过pipeline.del(String key) 不会立即执行命令;
  • pipeline.sync() 执行流水线组装的多个命令(发送组装多个命令的流水线到redis服务器)


【1.3.2】Jedis客户端执行流水线并获取执行结果代码实践

1)syncAndReturnAll(): 执行流水线命令并获取执行结果

【PooledJedisSetAndGetResultViaPipeline】

public class PooledJedisSetAndGetResultViaPipeline {public static void main(String[] args) {BusiJedisFactoryUsingPool busiJedisFactoryUsingPool = BusiJedisFactoryUsingPool.build();// 从jedis连接池获取jedis对象Jedis jedis = busiJedisFactoryUsingPool.getJedis();try {setAndGetReulst(jedis);} catch (Exception e) {throw new IllegalStateException(e.getMessage(), e);} finally {if (Objects.nonNull(jedis)) {jedis.close();}}}private static void setAndGetReulst(Jedis jedis) {// 生成pipeline对象Pipeline pipeline = jedis.pipelined();pipeline.set("user03", "zhangsan03");pipeline.incr("age");// syncAndReturnAll 执行流水线命令并返回结果List<Object> resultList = pipeline.syncAndReturnAll();for (Object result : resultList) {System.out.println(result);}}
}

【日志】

OK
2


http://www.hkea.cn/news/679170/

相关文章:

  • 凡科建网关键词优化公司哪家好
  • seo排名推广工具seo公司多少钱
  • 做视频网站赚钱怎么在百度上推广自己的公司信息
  • 网站建设凡科厦门网站建设平台
  • 互联网行业pest分析福州百度快速优化排名
  • 做网站的接私活犯法吗如何对网站进行推广
  • 身高差效果图网站优化师和运营区别
  • 谷歌wordpress建站搜索引擎算法
  • .net 购物网站开发源代码发布信息的免费平台
  • 自己做一网站大学生网络营销策划书
  • 关于网站建设的文章百度域名收录提交入口
  • 国人在线做网站推广图片大全
  • 郑州网站建设七彩科技四年级说新闻2023
  • 在什么网站上做自媒体seo整站怎么优化
  • 网站开发要注意安全性公司优化是什么意思
  • 河北邢台做移动网站开通网站需要多少钱
  • 天河网站建设多少钱淘宝关键词优化
  • 中型网站 收益关键词排名查询官网
  • 网站的弹窗是怎么做的谈谈对seo的理解
  • 广州网站制作费用宁波seo外包哪个品牌好
  • 河南高端网站建设广州网站优化页面
  • 企业可以备案几个网站南昌seo实用技巧
  • 网站用什么布局专业网站建设公司
  • 公司网站怎么做分录it培训机构学费一般多少
  • 如何将自己做的网页做成网站绍兴seo
  • 河南省住房与城乡建设厅网站首页怎么做属于自己的网站
  • 移动端网站开发推广效果最好的平台
  • 用二级页面做网站的源代码自助建站系统破解版
  • 网站上怎么做动画广告推广策略包括哪些内容
  • 广州网站优化公司大亚湾发布