- 浏览: 624565 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (819)
- java开发 (110)
- 数据库 (56)
- javascript (30)
- 生活、哲理 (17)
- jquery (36)
- 杂谈 (15)
- linux (62)
- spring (52)
- kafka (11)
- http协议 (22)
- 架构 (18)
- ZooKeeper (18)
- eclipse (13)
- ngork (2)
- dubbo框架 (6)
- Mybatis (9)
- 缓存 (28)
- maven (20)
- MongoDB (3)
- 设计模式 (3)
- shiro (10)
- taokeeper (1)
- 锁和多线程 (3)
- Tomcat7集群 (12)
- Nginx (34)
- nodejs (1)
- MDC (1)
- Netty (7)
- solr (15)
- JSON (8)
- rabbitmq (32)
- disconf (7)
- PowerDesigne (0)
- Spring Boot (31)
- 日志系统 (6)
- erlang (2)
- Swagger (3)
- 测试工具 (3)
- docker (17)
- ELK (2)
- TCC分布式事务 (2)
- marathon (12)
- phpMyAdmin (12)
- git (3)
- Atomix (1)
- Calico (1)
- Lua (7)
- 泛解析 (2)
- OpenResty (2)
- spring mvc (19)
- 前端 (3)
- spring cloud (15)
- Netflix (1)
- zipkin (3)
- JVM 内存模型 (5)
- websocket (1)
- Eureka (4)
- apollo (2)
- idea (2)
- go (1)
- 业务 (0)
- idea开发工具 (1)
最新评论
-
sichunli_030:
对于频繁调用的话,建议采用连接池机制
配置TOMCAT及httpClient的keepalive以高效利用长连接 -
11想念99不见:
你好,我看不太懂。假如我的项目中会频繁调用rest接口,是要用 ...
配置TOMCAT及httpClient的keepalive以高效利用长连接
redis的管道(Pipelining)操作是一种异步的访问模式,一次发送多个指令,不同步等待其返回结果。这样可以取得非常好的执行效率。这就是管道,调用方法如下:
redis是一个cs模式的tcp server,使用和http类似的请求响应协议。一个client可以通过一个socket连接发起多个请求命令。每个请求命令发出后client通常会阻塞并等待redis服务处理,redis处理完后请求命令后会将结果通过响应报文返回给client。基本的通信过程如下:
基本上四个命令需要8个tcp报文才能完成。由于通信会有网络延迟,假如从client和server之间的包传输时间需要0.125秒。那么上面的四个命令8个报文至少会需要1秒才能完成。这样即使redis每秒能处理100个命令,而我们的client也只能一秒钟发出四个命令。这显示没有充分利用 redis的处理能力。除了可以利用mget,mset 之类的单条命令处理多个key的命令外我们还可以利用pipeline的方式从client打包多条命令一起发出,不需要等待单条命令的响应返回,而redis服务端会处理完多条命令后会将多条命令的处理结果打包到一起返回给客户端。通信过程如下:
假设不会因为tcp报文过长而被拆分。可能两个tcp报文就能完成四条命令,client可以将四个incr命令放到一个tcp报文一起发送,server则可以将四条命令的处理结果放到一个tcp报文返回。通过pipeline方式当有大批量的操作时候。我们可以节省很多原来浪费在网络延迟的时间。需要注意到是用 pipeline方式打包命令发送,redis必须在处理完所有命令前先缓存起所有命令的处理结果。打包的命令越多,缓存消耗内存也越多。所以并是不是打包的命令越多越好。具体多少合适需要根据具体情况测试。下面是个jedis客户端使用pipeline的测试:
输出:
测试结果还是很明显有较大的差距,所以多次操作用pipeline还是有明显的优势。我用的是Win7中的Jedis Java客户端程序连接局域网的Linux虚拟机上的Redis Server。
参考:http://blog.csdn.net/freebird_lb/article/details/7778919
@Test public void test3Pipelined() { Jedis jedis = new Jedis("localhost"); Pipeline pipeline = jedis.pipelined(); long start = System.currentTimeMillis(); for (int i = 0; i < 100000; i++) { pipeline.set("p" + i, "p" + i); } List<Object> results = pipeline.syncAndReturnAll(); long end = System.currentTimeMillis(); System.out.println("Pipelined SET: " + ((end - start)/1000.0) + " seconds"); jedis.disconnect(); }
redis是一个cs模式的tcp server,使用和http类似的请求响应协议。一个client可以通过一个socket连接发起多个请求命令。每个请求命令发出后client通常会阻塞并等待redis服务处理,redis处理完后请求命令后会将结果通过响应报文返回给client。基本的通信过程如下:
引用
Client: INCR X
Server: 1
Client: INCR X
Server: 2
Client: INCR X
Server: 3
Client: INCR X
Server: 4
Server: 1
Client: INCR X
Server: 2
Client: INCR X
Server: 3
Client: INCR X
Server: 4
基本上四个命令需要8个tcp报文才能完成。由于通信会有网络延迟,假如从client和server之间的包传输时间需要0.125秒。那么上面的四个命令8个报文至少会需要1秒才能完成。这样即使redis每秒能处理100个命令,而我们的client也只能一秒钟发出四个命令。这显示没有充分利用 redis的处理能力。除了可以利用mget,mset 之类的单条命令处理多个key的命令外我们还可以利用pipeline的方式从client打包多条命令一起发出,不需要等待单条命令的响应返回,而redis服务端会处理完多条命令后会将多条命令的处理结果打包到一起返回给客户端。通信过程如下:
引用
Client: INCR X
Client: INCR X
Client: INCR X
Client: INCR X
Server: 1
Server: 2
Server: 3
Server: 4
Client: INCR X
Client: INCR X
Client: INCR X
Server: 1
Server: 2
Server: 3
Server: 4
假设不会因为tcp报文过长而被拆分。可能两个tcp报文就能完成四条命令,client可以将四个incr命令放到一个tcp报文一起发送,server则可以将四条命令的处理结果放到一个tcp报文返回。通过pipeline方式当有大批量的操作时候。我们可以节省很多原来浪费在网络延迟的时间。需要注意到是用 pipeline方式打包命令发送,redis必须在处理完所有命令前先缓存起所有命令的处理结果。打包的命令越多,缓存消耗内存也越多。所以并是不是打包的命令越多越好。具体多少合适需要根据具体情况测试。下面是个jedis客户端使用pipeline的测试:
package com.jd.redis.client; import redis.clients.jedis.Jedis; import redis.clients.jedis.Pipeline; publicclass PipelineTest { /** * @param args */ publicstaticvoid main(String[] args) { int count = 1000; long start = System.currentTimeMillis(); withoutPipeline(count); long end = System.currentTimeMillis(); System.out.println("withoutPipeline: " + (end-start)); start = System.currentTimeMillis(); usePipeline(count); end = System.currentTimeMillis(); System.out.println("usePipeline: " + (end-start)); } privatestaticvoid withoutPipeline(int count){ Jedis jr = null; try { jr = new Jedis("10.10.224.44", 6379); for(int i =0; i<count; i++){ jr.incr("testKey1"); } } catch (Exception e) { e.printStackTrace(); } finally{ if(jr!=null){ jr.disconnect(); } } } privatestaticvoid usePipeline(int count){ Jedis jr = null; try { jr = new Jedis("10.10.224.44", 6379); Pipeline pl = jr.pipelined(); for(int i =0; i<count; i++){ pl.incr("testKey2"); } pl.sync(); } catch (Exception e) { e.printStackTrace(); } finally{ if(jr!=null){ jr.disconnect(); } } } }
输出:
引用
withoutPipeline: 11341
usePipeline: 344
usePipeline: 344
测试结果还是很明显有较大的差距,所以多次操作用pipeline还是有明显的优势。我用的是Win7中的Jedis Java客户端程序连接局域网的Linux虚拟机上的Redis Server。
参考:http://blog.csdn.net/freebird_lb/article/details/7778919
发表评论
-
缓存穿透、缓存击穿、缓存雪崩区别和解决方案
2022-03-28 00:07 188缓存穿透、缓存击穿、缓存雪崩区别和解决方案 缓存穿透,缓存 ... -
SpringBoot系列教程之Redis集群环境配置
2022-02-28 00:37 251SpringBoot系列教程之Redis集群环境配置 Co ... -
Redis 分布式锁的实现
2021-05-23 18:53 268Redisson实现分布式锁(1)---原理 https:// ... -
Redis面试题
2021-05-23 16:30 298redis布隆过滤器的使用 布隆过滤器可以看成是一个不是很准确 ... -
Redis性能问题排查解决手册
2019-08-07 10:31 400Redis性能问题排查解决手册(七) https://www. ... -
linux下安装redis及其中遇到的问题的解决方法
2017-11-29 16:46 527https://www.cnblogs.com/wyy123/ ... -
Redis scan命令的一次坑
2017-11-16 12:07 1104http://www.jianshu.com/p/d9f0a5 ... -
redis命中率计算
2017-09-29 21:29 1628redis提供了INFO这个命令,能够随时监控服务器的状态,只 ... -
redis分片
2017-07-10 18:41 479http://www.cnblogs.com/liucongl ... -
Redis_conf配置文件说明
2017-05-22 13:58 465Redis_conf配置文件说明 http://blog.cs ... -
redis 数据持久化
2017-05-22 10:16 6391、快照(snapshots) 缺省情况情况下,Redi ... -
overcommit_memory
2017-05-17 09:29 563/etc/sysctl.conf ... -
批量删除Redis数据库中的Key
2017-05-16 10:58 459Redis 中有删除单个 Key 的指令 DEL,但好像没有批 ... -
redis配置认证密码
2017-04-14 19:34 497http://blog.csdn.net/zyz5119197 ... -
redis-cluster研究和使用
2016-12-16 10:09 435参考:http://hot66hot.iteye.com/bl ... -
Redis 3.2.1集群搭建
2016-10-27 10:25 428http://www.cnblogs.com/yuanerme ... -
redis从2.1.0升级到2.6.0报错:java.lang.NoSuchMethodError
2016-10-14 13:05 1653项目中使用了jedis-2.1.0.jar,现在升级为jedi ... -
redis-cli 如何重写服务器的主机名和端口
2016-08-17 16:08 1193windows 环境下,启动多个redis服务,使用不同的端口 ... -
《Redis官方文档》用Redis构建分布式锁
2016-08-08 13:37 682redis深度讲解 http://edu.csdn.net/c ... -
Jedis returnResource使用注意事项
2016-08-07 12:50 1675http://my.oschina.net/zhuguowei ...
相关推荐
一、 redis 环境搭建 2 二、 redis学习笔记之...五、 redis学习笔记之pipeline 20 六、 redis学习笔记之发布订阅 23 七、 redis学习笔记之持久化 28 八、 redis学习笔记之主从复制 30 九、 redis学习笔记之虚拟内存 31
Redis学习笔记 Redis是一个开源的基于键值对(Key-Value)NoSQL数据库,使用ANSI C语言编写、支持网络、基于内存但支持持久化。性能优秀,并提供多种语言的API。Redis可以被称为KV数据库,键值对数据库,内部存储...
redis学习笔记整理 ...五、 redis学习笔记之pipeline 20 六、 redis学习笔记之发布订阅 23 七、 redis学习笔记之持久化 28 八、 redis学习笔记之主从复制 30 九、 redis学习笔记之虚拟内存 31
这只是 Redis 学习的基础,深入使用还需要掌握更多的高级特性和最佳实践,例如集群搭建、主从复制、Lua 脚本、Pipeline 使用等。随着对 Redis 的了解加深,你可以将其应用到更复杂的系统设计中,优化性能和提高系统...
- **管道**:通过发送多条命令一次性处理,提高效率,如 StackExchange.Redis 提供的 `Pipeline` 类。 - **发布订阅**:`PUBLISH channel message` 发布消息,`SUBSCRIBE channel` 订阅消息。 - **持久化**:RDB ...
Redis 是一个高性能的键值数据库,它以数据结构服务器著称,支持多种数据类型,如字符串、列表、集合、...此外,Redis 还有许多高级特性,如 Lua 脚本、Geo 空间索引和 HyperLogLog 等,可以根据实际需求进一步学习。
Redis 是一个开源的高性能键值对存储服务系统,它基于内存但同时也支持持久化,确保在断电情况下数据不会丢失。Redis 使用C语言编写,采用单线程模型,因此能够达到每秒数十万次的读写操作,这主要得益于其数据存储...
4.pipeline 14 五.测试服务器 16 六.密码验证服务器 16 七.Log 16 八.DB数 17 九. Redis原理 17 1.数据结构 17 2.存储结构和存储格式 19 3.性能 20 4.网络IO模型 20 5.内存管理方面 20 6.数据一致性问题 20 7....
Redis 是一款开源的 NoSQL 数据库,以键值对存储数据,同时也被称作数据结构服务器,因为它提供了丰富的数据类型,如字符串、列表、集合、有序集合和哈希表等。Redis 支持多种原子性操作,如字符串的追加、数值的...
Redis 是一款高性能的键值数据库,...在学习 Redis 时,了解其数据类型、操作命令、持久化机制以及复制和发布订阅等功能是至关重要的。通过不断实践和探索,可以深入掌握 Redis 的精髓,并将其有效地应用到实际项目中。
在Redis的中级篇学习中,我们将深入探讨其核心特性、数据类型、持久化机制、集群搭建以及性能优化策略。 1. **核心特性**: - Redis支持多种数据结构,如字符串(String)、哈希(Hash)、列表(List)、集合(Set...
6. 管道与批量操作:通过管道(Pipeline)提高客户端与服务器之间的通信效率,批量操作可以减少网络延迟。 7. 发布订阅:如何实现简单的消息传递,以及在聊天室、实时通知等场景中的应用。 8. Lua脚本:利用Lua脚本...
在学习Redis时,除了阅读文档和笔记,还可以参考官方文档、社区论坛、在线课程等资源,加深理解和掌握实际操作技能。同时,实践是检验理论的最好方式,可以通过搭建Redis环境,动手操作,解决实际问题来提升技能水平...
笔记.zip包含了学习Redis6.2.1过程中整理的详细笔记,这些笔记涵盖了Redis的基本概念、数据类型(如字符串、哈希、列表、集合、有序集合)、持久化机制(RDB和AOF)、事务、复制、Sentinel哨兵系统、Cluster集群以及...
本学习笔记旨在深入理解 Redis 的核心概念、特性和使用方法,并结合Java客户端进行实践操作。 一、Redis基本概念 1. 数据类型:Redis 支持五种主要的数据类型:字符串(String)、哈希(Hash)、列表(List)、集合(Set)...
具体事务和监听请参考文章:redis学习笔记之事务 暂时找到三种实现方式: 1. 通过jedis.setnx(key,value)实现 import java.util.Random; import org.apache.commons.pool.impl.GenericObjectPool.Config; import ...