redis-cluster体验之初步功能测试

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 联动帖:http://blog.itpub.net/29510932/viewspace-1788524/ 这是一篇很简短的博文 ----------------------------------------------------------------...
联动帖:http://blog.itpub.net/29510932/viewspace-1788524/

这是一篇很简短的博文

----------------------------------------------------------- ----- -------- --------- --------- -------正文 ------ ---------- ---------- ------- ------- ---------- ---------- ---------- ------- ---------- ---------- --------

目的:联动帖已经搭建好了cluster的环境,写一个cluster的测试示例来简单验证一下cluster的功能

结果:等待详细评估以后,再考虑在简单的业务上进行生产使用

过程:

使用jedis-2.7.3和commons-pool2,尽量使用最新版

代码

点击(此处)折叠或打开

  1. import java.util.HashSet;
  2. import java.util.Set;
  3. import redis.clients.jedis.HostAndPort;
  4. import redis.clients.jedis.JedisCluster;
  5. public class jedis
  6. {
  7.     public static void main( String[] args )
  8.     {
  9.         Set<HostAndPort> clusterNodes = new HashSet<HostAndPort>();
  10.         // 这里只需要列出集群中的一个节点
  11.         // JedisCluster 会自行通过cluster nodes来获取其他的集群节点
  12.         clusterNodes.add(new HostAndPort("10.16.68.183", 7000));
  13.         /*
  14.         clusterNodes.add(new HostAndPort("10.16.68.183", 7001));
  15.         clusterNodes.add(new HostAndPort("10.16.68.183", 7002));
  16.         clusterNodes.add(new HostAndPort("10.16.68.183", 7003));
  17.         clusterNodes.add(new HostAndPort("10.16.68.183", 7004));
  18.         clusterNodes.add(new HostAndPort("10.16.68.183", 7005));
  19.         clusterNodes.add(new HostAndPort("10.16.68.183", 7006));
  20.         clusterNodes.add(new HostAndPort("10.16.68.183", 7007));
  21.         */
  22.         JedisCluster cluster = new JedisCluster(clusterNodes,3000,1000);//cluster节点,超时时间,最大重定向数
  23.         // set/get试验
  24.         /*
  25.         cluster.set("cluster test", "hello jedis cluster!");
  26.         String value = cluster.get("foo");
  27.         System.out.println("foo = " + value);
  28.         */
  29.         cluster.incr("counter");
  30.         System.out.println("counter = " + cluster.get("counter"));
  31.         cluster.incr("counter");
  32.         System.out.println("counter = " + cluster.get("counter"));
  33.         // get cluster nodes
  34.         System.out.println("------- cluster nodes --------");
  35.         /*
  36.         Map<String, JedisPool> nodes = cluster.getClusterNodes();
  37.         Iterator<Map.Entry<String, JedisPool>> iterNodes = nodes.entrySet().iterator();
  38.         while (iterNodes.hasNext()) 
  39.         {
  40.             Map.Entry<String, JedisPool> entry = iterNodes.next();
  41.             Jedis jedis = entry.getValue().getResource();
  42.             System.out.println("============");
  43.             System.out.println(entry.getKey() + "\n" + jedis.info());
  44.         }
  45.         // 循环结束
  46.         System.out.println("------- end --------");
  47.         */
  48.         cluster.close();
  49.     }
  50. }


红色字体标出了与普通redis不同的地方,一部分特性也在代码中已注释标明,简单看了一下cluster的函数列表,基本上单点redis的命令都支持了,接下来记录一部分redis-cluster使用过程已经发现的问题

1.创建cluster Node的时候,或者是操作cluster Node的时候,出现如下错误

redis.clients.jedis.exceptions.JedisClusterMaxRedirectionsException: Too many Cluster redirections?
解决办法:
a. 在创建cluster的时候,带上超时时间和最大重定向数;
b. 检查cluster Node的状态,如果某个cluster node在加入集群的时候,使用的是127.0.0.1:port的形式,那么客户端 在连接这个Node,在 -MOVE转移request的时候会出现问题,其实是连接超时(但是抛出的异常却是一个坑爹的连接数太多,而且还是个疑问句....), 所以集群在配置的时候务必带上详细的IP

2.redis-cluster没有pipeline

无解,因为redis-cluster的数据是垂直切分的,这意味着不同的key按照不同的策略被分配到了不同的Node上, 所以pipeline里面的request[A,B,C,D,E,F ]经过转发以后,可能[A,B]发往了Node1,[C ]在Node2上面处理, [D,E,F]转发到Node3,最终的response无法保证为[A,B,C,E,D,F]的顺序。cluster干脆就不让用pipeline了

3.redis-benchmark目前不能对cluster进行压力测试

所以没办法进行严密的对比测试,如果采用比较小的数据量,可以跑跑试试看效果, 但是结论必定是不严谨的,仅仅看看就好,所以不贴测试结果了,
从原理来看,在轻负载和中等负载下, 使用cluster会少量的增加延迟,但是会有更高的operation/s的上限

4.redis-cluster会丢失分片的数据

联动帖里面阐述过redis-cluster丢失数据的一种可能性, 在这里要写的就是redis-cluster有可能会丢失整个分片的数据的一种情况,一般来说,如果某个Master挂掉了,对应的s lave会变成新的Master处理request,但是如果这个Master对应的所有的slave都挂了的话,这一组分片保存的数据在这些Node恢复之前是不可访问和操作的,所以在初始化redis-cluster的时候,replica的数量需要好好斟酌,MS的分布也需要尽量规划好,避免某个分片所有的Node 全部挂掉



-----------------------------------------------------------------------------------------------简短的小尾巴~-------------------------------------------------------------------------------------------------------
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
6月前
|
存储 缓存 NoSQL
Redis性能测试实操记录与分析
通过对Redis性能测试的实操记录和分析,我们对Redis的性能表现有了更深入的了解。这种性能测试可以帮助我们评估Redis在不同负载下的表现,并根据测试结果采取相应的优化策略,以确保Redis在实际应用中能够满足性能需求,并提供高速的数据存储和缓存解决方案。
130 0
|
9月前
|
NoSQL Linux Redis
Linux系列——Redis的安装、测试
Linux系列——Redis的安装、测试
|
10月前
|
缓存 NoSQL 前端开发
redis单机版安装+测试+项目运用
Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
|
10月前
|
NoSQL Redis 数据中心
Redis 集群偶数节点跨地域部署之高可用测试
你搭建过偶数节点的 Redis 集群吗?有没有想过它是否具备高可用的能力?会不会脑裂呢?实践出真知!现在 docker 太方便了,搭一个集群模拟一下……
127 4
|
11月前
|
NoSQL Java Redis
Redis 从入门到精通之Redis操作测试指定key是否存在
在Redis中,可以使用`EXISTS`命令来测试指定的key是否存在。 `EXISTS`命令的基本语法如下: ``` EXISTS key ``` 其中,`key`是要测试的key的名称。如果指定的key存在,命令返回1;如果指定的key不存在,命令返回0。jedis.exists("foo");RedisTemplate的操作,包括测试指定key是否存在。使用该类可以方便地进行Redis操作,而无需关注底层细节。`exists`方法使用`hasKey`方法测试指定key是否存在,如果存在,则返回true;如果不存在,则返回false。
1106 1
|
12月前
|
NoSQL Java Linux
|
缓存 NoSQL API
分布式服务器框架之Servers.Common中使用CSRedis测试操作Redis中的string、hash_table、list、set、zset
在Servers.Common类库总创建了一个TestRedis.cs文件,我是在Servers.GameServer中去初始化的。主要是测试了Redis中常用的数据类型和常用的API,有一些不常用的可能没有写。需要详细了解API的话可以安装上CSRedis之后F12追进去查看,上面有详细的API说明。
分布式服务器框架之Servers.Common中使用CSRedis测试操作Redis中的string、hash_table、list、set、zset
|
缓存 NoSQL Redis
微擎 Redis开启,高并发测试
微擎 Redis开启,高并发测试
163 0
|
NoSQL Linux Redis
Docker | redis安装及测试
Docker | redis安装及测试
200 0
Docker | redis安装及测试
|
NoSQL 网络安全 Redis
flink测试redis sink报错
flink测试redis sink报错