- 浏览: 624993 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (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以高效利用长连接
一. 原理:
1. Jedis是redis的java版本的客户端实现。
1.1 以下是jedis代码测试,使用了两个redis服务:
Codis 是一个分布式 Redis 解决方案,对于上层的应用来说, 连接到 Codis Proxy 和连接原生的 Redis Server 没有明显的区别 ,上层应用可以像使用单机的 Redis 一样使用, Codis 底层会处理请求的转发, 不停机的数据迁移等工作, 所有后边的一切事情, 对于前面的客户端来说是透明的, 可以简单的认为后边连接的是一个内存无限大的 Redis 服务.
下图可以看到redis客户端连接是是codis的代理。代理连接很多的分组,一个组包括一个master和0到多个slave。
2.1 codis代码测试:先配置codis,codis的安装配置就不讲了,我测试在集成在spring中了。
spring中的配置:
redis配置文件:
封装的redis方法,用的是redisTemplate:
用junit测试:
二. 性能对比
两者的性能比较,如下图:
三. 动态扩容
1. codis动态扩容
下图是整个codis的界面
转自:http://blog.csdn.net/dayibagou/article/details/43937039
1. Jedis是redis的java版本的客户端实现。
1.1 以下是jedis代码测试,使用了两个redis服务:
public class RedisShardPoolTest { static ShardedJedisPool pool;//切片连接池 static{ JedisPoolConfig config =new JedisPoolConfig();//Jedis池配置 config.setMaxActive(300);//最大活动的对象个数 config.setMaxIdle(1000 * 60);//对象最大空闲时间 config.setMaxWait(1000 * 10);//获取对象时最大等待时间 config.setTestOnBorrow(true);//;如果为true,则得到的jedis实例均是可用的; String hostA = "127.0.0.1";//服务器地址 int portA = 6379;//redis端口号 String hostB = "127.0.0.1"; int portB = 6378; List<JedisShardInfo> jdsInfoList =new ArrayList<JedisShardInfo>(2); JedisShardInfo infoA = new JedisShardInfo(hostA, portA); JedisShardInfo infoB = new JedisShardInfo(hostB, portB); jdsInfoList.add(infoA); jdsInfoList.add(infoB); pool =new ShardedJedisPool(config, jdsInfoList); } public static void main(String[] args) { long s1=System.currentTimeMillis(); Map<String, String> map=new HashMap<String, String>(); for(int i=0; i<1000; i++){ ShardedJedis jds = null;//切片客户端连接 jds = pool.getResource(); try { map.put("s"+i, "s"+i); jds.hmset("s"+i, map); } catch (Exception e) { e.printStackTrace(); } finally { pool.returnResource(jds); } } long s2=System.currentTimeMillis(); System.out.println(testTime(s2-s1)); } public static String testTime(long ss){ String aa=null; long zongmiaoshu = ss / 1000; long dangqianmiaoshu = zongmiaoshu % 60; long zongfenshu = zongmiaoshu /60; long dangqianfenshu = zongfenshu % 60; long zongshishu = zongfenshu / 60; long dangqianshishu = zongshishu % 24; aa="当前时间:" + dangqianshishu + ":" + dangqianfenshu + ":" + dangqianmiaoshu; return aa; } }
Codis 是一个分布式 Redis 解决方案,对于上层的应用来说, 连接到 Codis Proxy 和连接原生的 Redis Server 没有明显的区别 ,上层应用可以像使用单机的 Redis 一样使用, Codis 底层会处理请求的转发, 不停机的数据迁移等工作, 所有后边的一切事情, 对于前面的客户端来说是透明的, 可以简单的认为后边连接的是一个内存无限大的 Redis 服务.
下图可以看到redis客户端连接是是codis的代理。代理连接很多的分组,一个组包括一个master和0到多个slave。
2.1 codis代码测试:先配置codis,codis的安装配置就不讲了,我测试在集成在spring中了。
spring中的配置:
<bean id="ehcacheService" class="net.okdi.core.common.redis.RedisServiceImpl"/> <context:property-placeholder location="classpath:/redis.properties" ignore-unresolvable="true" /> <bean id="jedisConfig" class="redis.clients.jedis.JedisPoolConfig"> <property name="maxActive" value="${redis_max_active}"></property> <property name="maxIdle" value="${redis_max_idle}"></property> <property name="maxWait" value="${redis_max_wait}"></property> <property name="testOnBorrow" value="${redis_test_on_borrow}"></property> </bean> <bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"> <property name="hostName" value="${redis_addr}"></property> <property name="port" value="${redis_port}"></property> <property name="password" value="${redis_auth}"></property> <property name="poolConfig" ref="jedisConfig"></property> </bean> <bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate"> <property name="connectionFactory" ref="connectionFactory" /> 如果不配置Serializer,那么存储的时候智能使用String,如果用User类型存储,那么会提示错误User can't cast to String!!! <property name="keySerializer"> <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" /> </property> <property name="valueSerializer"> <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" /> </property> </bean>
redis配置文件:
redis_addr=192.168.31.204 redis_port=19000 (codis代理服务器端口) redis_auth=okdi redis_max_active=1024 redis_max_idle=200 redis_max_wait=10000 redis_timeout=10000 redis_test_on_borrow=true
封装的redis方法,用的是redisTemplate:
public class RedisServiceImpl implements EhcacheService { private static Logger logger = Logger.getLogger(EhcacheServiceImpl.class); @Autowired private StringRedisTemplate redisTemplate; @Autowired private RedisConstant redisConstant; @Override public void put(String cacheName, String key, String value) { // boolean bool = redisTemplate.hasKey(cacheName); if (cacheName==null || "".equals(cacheName) || key==null || "".equals(key)) { return; } //放入redis redisTemplate.opsForHash().put(cacheName, key, value); long expireTime = redisConstant.getExpireTime(cacheName); //如果不等于-1,则该cacheName配置有过期时间 if(expireTime != -1){ redisTemplate.expire(cacheName, expireTime, TimeUnit.SECONDS); } } @Override public void put(String cacheName, String key, Object value) { if (cacheName==null || "".equals(cacheName) || key==null || "".equals(key)) { return; } //放入redis redisTemplate.opsForHash().put(cacheName, key, JSON.toJSONString(value)); long expireTime = redisConstant.getExpireTime(cacheName); //如果不等于-1,则该cacheName配置有过期时间 if(expireTime != -1){ redisTemplate.expire(cacheName, expireTime, TimeUnit.SECONDS); } } }
用junit测试:
public class test11 extends BaseTest{ @Autowired private EhcacheService redisService; @SuppressWarnings("rawtypes") @Test public void test1(){ long s1=System.currentTimeMillis(); for(int i=0;i<10000;i++){ redisService.put("a"+i, "a"+i,"a"+i); redisService.remove("a"+i, "a"+i); } long s2=System.currentTimeMillis(); System.out.println(testTime(s2-s1)); System.out.println(redisService.getValueByKey("eeee9", "e9")); }
二. 性能对比
两者的性能比较,如下图:
三. 动态扩容
1. codis动态扩容
下图是整个codis的界面
转自:http://blog.csdn.net/dayibagou/article/details/43937039
发表评论
-
缓存穿透、缓存击穿、缓存雪崩区别和解决方案
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 301redis布隆过滤器的使用 布隆过滤器可以看成是一个不是很准确 ... -
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 460Redis 中有删除单个 Key 的指令 DEL,但好像没有批 ... -
redis配置认证密码
2017-04-14 19:34 498http://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 1654项目中使用了jedis-2.1.0.jar,现在升级为jedi ... -
redis-cli 如何重写服务器的主机名和端口
2016-08-17 16:08 1193windows 环境下,启动多个redis服务,使用不同的端口 ... -
《Redis官方文档》用Redis构建分布式锁
2016-08-08 13:37 683redis深度讲解 http://edu.csdn.net/c ... -
Jedis returnResource使用注意事项
2016-08-07 12:50 1675http://my.oschina.net/zhuguowei ...
相关推荐
Jupyter-Notebook
Jupyter-Notebook
高效甘特图模板下载-精心整理.zip
lstm Summary Framework: z = U>x, x u Uz Criteria for choosing U: • PCA: maximize projected variance • CCA: maximize projected correlation • FDA: maximize projected intraclass variance
OpenGL调试工具,适合图形开发者,包括视频开发,播放器开始以及游戏开发者。
全国行政区划shp最新图.zip
全国研究生招生与在校数据+国家线-最新.zip
Jupyter-Notebook
直播电商交流平台 SSM毕业设计 附带论文 启动教程:https://www.bilibili.com/video/BV1GK1iYyE2B
《林黛玉进贾府》课本剧剧本
2000-2020年沪深A股上市公司融资约束程度SA指数-最新数据发布.zip
PPT模版资料,PPT模版资料
CPA注会考试最新教材资料-最新发布.zip
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
内容概要:本文提供了一个完整的职工管理系统的C++源代码。通过面向对象的编程方法,实现了包括创建新职工、查询、增加、修改、删除、排序、统计以及存储和恢复职工数据在内的多个基本操作功能。该系统支持不同的用户角色(如管理员与老板),并通过菜单驱动方式让用户方便地进行相关操作。此外,还包括了错误检测机制,确保操作过程中的异常得到及时处理。 适合人群:有一定C++语言基础,特别是面向对象编程经验的程序员;企业管理人员和技术开发人员。 使用场景及目标:适用于中小型企业内部的人力资源管理部门或IT部门,用于维护员工基本信息数据库,提高工作效率。通过本项目的学习可以加深对链表、类和对象的理解。 阅读建议:建议先熟悉C++的基本语法和面向对象概念,再深入学习代码的具体实现细节。对于关键函数,比如exchange、creatilist等,应当重点关注并动手实践以加强理解。
Jupyter-Notebook
考研公共课历年真题集-最新发布.zip
Huawei-HKUST Joint Workshop on Theory for Future Wireless 15-16 September 2022 华为-香港科技大学未来无线理论联合研讨会 Speaker:Jingwen Tong
演出人员与观众疫情信息管理系统 SSM毕业设计 附带论文 启动教程:https://www.bilibili.com/video/BV1GK1iYyE2B
《林黛玉进贾府》课本剧剧本.pdf