- 浏览: 633184 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (820)
- 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 (10)
- 缓存 (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 191缓存穿透、缓存击穿、缓存雪崩区别和解决方案 缓存穿透,缓存 ... -
SpringBoot系列教程之Redis集群环境配置
2022-02-28 00:37 257SpringBoot系列教程之Redis集群环境配置 Co ... -
Redis 分布式锁的实现
2021-05-23 18:53 271Redisson实现分布式锁(1)---原理 https:// ... -
Redis面试题
2021-05-23 16:30 306redis布隆过滤器的使用 布隆过滤器可以看成是一个不是很准确 ... -
Redis性能问题排查解决手册
2019-08-07 10:31 405Redis性能问题排查解决手册(七) https://www. ... -
linux下安装redis及其中遇到的问题的解决方法
2017-11-29 16:46 530https://www.cnblogs.com/wyy123/ ... -
Redis scan命令的一次坑
2017-11-16 12:07 1108http://www.jianshu.com/p/d9f0a5 ... -
redis命中率计算
2017-09-29 21:29 1632redis提供了INFO这个命令,能够随时监控服务器的状态,只 ... -
redis分片
2017-07-10 18:41 486http://www.cnblogs.com/liucongl ... -
Redis_conf配置文件说明
2017-05-22 13:58 472Redis_conf配置文件说明 http://blog.cs ... -
redis 数据持久化
2017-05-22 10:16 6401、快照(snapshots) 缺省情况情况下,Redi ... -
overcommit_memory
2017-05-17 09:29 574/etc/sysctl.conf ... -
批量删除Redis数据库中的Key
2017-05-16 10:58 463Redis 中有删除单个 Key 的指令 DEL,但好像没有批 ... -
redis配置认证密码
2017-04-14 19:34 505http://blog.csdn.net/zyz5119197 ... -
redis-cluster研究和使用
2016-12-16 10:09 438参考:http://hot66hot.iteye.com/bl ... -
Redis 3.2.1集群搭建
2016-10-27 10:25 430http://www.cnblogs.com/yuanerme ... -
redis从2.1.0升级到2.6.0报错:java.lang.NoSuchMethodError
2016-10-14 13:05 1665项目中使用了jedis-2.1.0.jar,现在升级为jedi ... -
redis-cli 如何重写服务器的主机名和端口
2016-08-17 16:08 1195windows 环境下,启动多个redis服务,使用不同的端口 ... -
《Redis官方文档》用Redis构建分布式锁
2016-08-08 13:37 688redis深度讲解 http://edu.csdn.net/c ... -
Jedis returnResource使用注意事项
2016-08-07 12:50 1685http://my.oschina.net/zhuguowei ...
相关推荐
### Codis数据迁移性能优化 #### 什么是Codis? Codis是一个分布式缓存系统,它主要基于Redis构建,旨在提供高性能、高可用性的缓存服务。Codis通过将多个Redis实例组织成一个集群来实现这一目标,使得应用程序...
总结起来,"codis性能测试"项目着重于评估CODIS在高并发环境下的性能,包括多线程入库的效率和随机查询的响应速度。测试过程中,需关注资源利用率的平衡,以实现系统性能的最大化。通过这样的测试,我们可以发现并...
美团和阿里巴巴等大型企业已经在生产环境中成功应用了Codis 3.0的集群功能,这足以证明其稳定性和性能。 Codis的设计理念是将数据库的管理和业务逻辑分离,通过Proxy层透明地对客户端提供服务,使得业务方无需关心...
Codis 是一个分布式的Redis解决方案,由Go语言编写,可以水平扩展,提供高性能和高可用性的Redis服务。下面是Codis3.1集群搭建的详细步骤和相关知识点: 一、Codis集群架构 Codis集群架构主要包括四个组件:Codis ...
它主要解决了单个Redis实例在处理大规模数据和高并发请求时的性能瓶颈问题。通过Codis,你可以将多个Redis实例组合成一个逻辑上的集群,实现数据的自动分片、故障转移以及平滑扩容。 **Redis基础知识** Redis是一个...
**Go-Codis:高性能Redis集群的Go语言实现** Go-Codis是一个使用Go语言编写的高性能、基于代理的Redis集群解决方案。它旨在提供一种灵活且可扩展的方式,以处理大规模的数据存储和检索需求,特别是在那些对数据一致...
需要注意的是,实际生产环境中,为了提高可用性和性能,通常会部署多个 Codis-Proxy 和 Codis-Redis 节点,并使用 keepalived 或其他方式实现负载均衡和故障切换。同时,根据业务需求,可能还需要对 Codis 进行扩容...
在文件中,可能分析了各种方案的优缺点,如数据一致性、容错能力、操作复杂度和性能等方面,帮助读者更好地理解为什么选择Codis。 现在,让我们详细了解一下Codis的核心特点和使用方法: 1. **分片策略**:Codis...
Codis Ansible Playbook 是一个自动化部署工具,用于简化 Codis 的集群安装和管理过程。Codis 是一个分布式 Redis 解决方案,它允许你水平扩展 Redis 集群,提高数据存储和处理能力。Ansible 是一个强大的 IT 自动化...
在3.2.2这个版本中,Codis提供了稳定性和性能上的优化,使得它成为大规模Redis集群的可靠选择。下面我们将深入探讨Codis的设计原理、功能特点以及3.2.2版本中的关键改进。 1. Codis设计原理: Codis采用了Proxy...
Codis 是一个分布式 Redis 解决方案, 对于上层的应用来说, 连接到 Codis Proxy 和连接原生的 Redis Server 没有明显的区别 (不支持的命令列表), 上层应用可以像使用单机的 Redis 一样使用, Codis 底层会处理请求的...
Codis是开源的、基于代理的高性能Redis集群解决方案,由淘宝内部开发并维护,主要用于解决单个Redis实例内存不足或者为了提高服务的可用性和扩展性而引入的分布式解决方案。 Codis采用Go语言编写,这使得它在性能...
**CODIS 安装详解** CODIS(Cluster Of Distributed Internet Services)是阿里巴巴开源的一个分布式数据库中间件,...记得在实际操作过程中,根据自己的服务器配置和业务需求调整相关参数,确保系统的稳定性和性能。
CODIS(Cluster Of Distributed Internet Services)是阿里巴巴开源的一款分布式Redis解决方案,主要针对单机Redis在大规模数据场景下存储和访问性能的局限性。CODIS通过代理层实现了对多个Redis实例的透明化管理,...
4. **Dashboard管理**:CODIS Dashboard提供了直观的Web界面,用户可以通过它查看集群状态、添加/删除Proxy和Redis实例、执行数据迁移操作、监控性能指标等。这对于日常运维工作非常便利。 5. **数据迁移机制**:...
**CODIS for PIKA 二进制包详解** CODIS(Cluster Of Distributed Internet Services)是阿里巴巴开源的一个分布式Redis解决方案,它允许用户在不修改...同时,要注意监控集群的性能和健康状态,及时进行维护和优化。
2. **高性能Redis集群解决方案**: Codis设计的目标是提供高性能的集群解决方案,通过优化的数据分片策略和智能的流量调度,确保在大规模数据和高并发场景下,系统仍能保持良好的响应速度和吞吐量。 3. **Redis集群...
### Codis集群搭建知识点 ...通过以上步骤,可以完成Codis集群的基本搭建,包括Go语言环境配置、Zookeeper集群搭建以及Codis服务的启动和关闭。此外,还应注意监控服务运行状态,并在出现问题时能够及时处理。
在分布式系统中,Redis和Codis都是常见的缓存解决方案。然而,随着业务的发展,有时我们需要将数据从一个系统迁移到另一个系统,例如从Codis迁移到Redis Cluster,或者反之。为了解决这个问题,特定的迁移工具...