Jedis即redis java客户端,源码地址:https://github.com/xetorthio/jedis

pom配置:

<dependency>
   <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.0.1</version>
    <type>jar</type>
    <scope>compile</scope>
</dependency>
 
 
1)连接单机版
     public void testJedis() throws Exception {
// 第一步:创建一个Jedis对象。需要指定服务端的ip及端口。
Jedis jedis = new Jedis("192.168.**.**", 6379);
// 第二步:使用Jedis对象操作数据库,每个redis命令对应一个方法。
String result = jedis.get("hello");
// 第三步:打印结果。
System.out.println(result);
// 第四步:关闭Jedis
jedis.close();
}

2) 连接单机版使用连接池

     public void testJedisPool() throws Exception {
// 第一步:创建一个JedisPool对象。需要指定服务端的ip及端口。
JedisPool jedisPool = new JedisPool("192.168.**.**", 6379);
// 第二步:从JedisPool中获得Jedis对象。
Jedis jedis = jedisPool.getResource();
// 第三步:使用Jedis操作redis服务器。
jedis.set("jedis", "test");
String result = jedis.get("jedis");
System.out.println(result);
// 第四步:操作完毕后关闭jedis对象,连接池回收资源。
jedis.close();
// 第五步:关闭JedisPool对象。
jedisPool.close();
}
3) 连接集群版
     public void testJedisCluster() throws Exception {
// 第一步:使用JedisCluster对象。需要一个Set<HostAndPort>参数。Redis节点的列表。
Set<HostAndPort> nodes = new HashSet<>();
nodes.add(new HostAndPort("192.168.**.**", 7001));
nodes.add(new HostAndPort("192.168.**.**", 7002));
nodes.add(new HostAndPort("192.168.**.**", 7003));
nodes.add(new HostAndPort("192.168.**.**", 7004));
nodes.add(new HostAndPort("192.168.**.**", 7005));
nodes.add(new HostAndPort("192.168.**.**", 7006));
JedisCluster jedisCluster = new JedisCluster(nodes);
// 第二步:直接使用JedisCluster对象操作redis。在系统中单例存在。
jedisCluster.set("hello", "100");
String result = jedisCluster.get("hello");
// 第三步:打印结果
System.out.println(result);
// 第四步:系统关闭前,关闭JedisCluster对象。
jedisCluster.close();
}
 
4)JedisPool初始化配置:
private static final int taskCount = 50; // 并发任务
private static final int batchSize = 10; // pipeline大小
private static final int cmdCount = 1000;// 每个任务处理命令数
private static final boolean usePipeline = true; JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxActive(200);
poolConfig.setMaxIdle(100);
poolConfig.setMaxWait(2000);
poolConfig.setTestOnBorrow(false);
poolConfig.setTestOnReturn(false);
jedisPool = new JedisPool(poolConfig, host, port);

5)Jedis 消息发布与订阅API

5.1)消息订阅

   

   public void subscribeChannal(){
//从jedisPool中获取一个jedis对象
Jedis jds = RedisInsUtil.getJedis();
// 方式1 订阅得到信息在lister的onPMessage(...)方法中进行处理
jds.psubscribe(this, new String[]{"channal01","channal02"});
   // 方式2 订阅得到信息在lister的onMessage(...)方法中进行处理 (普通订阅方式)
   //jedis.subscribe(listener, "foo", "watson");
} // 初始化订阅时候的处理
@Override
public void onSubscribe(String channel, int subscribedChannels) {
} // 初始化按表达式的方式订阅时候的处理
@Override
public void onPSubscribe(String pattern, int subscribedChannels) {
} @Override
// 取得按表达式的方式订阅的消息后的处理
public void onPMessage(String pattern, String channel, String message) {
LOG.info("onPMessage()," + pattern + "=" + channel + ",msg="+ message);
} // 取得订阅的消息后的处理
public void onMessage(String channel, String message) {
}

5.2)消息发布

发布消息只用调用Jedis的publish(...)方法即可。

    Jedis jedis = ru.getConnection(); //获取一个jedis对象,自行封装工具类
jedis.publish("hello_foo", "bar123");

6) 管道

原理:
    Redis客户端与Redis服务器之间使用TCP协议进行连接,管道(pipeline)可以一次性发送多条命令并在执行完后一次性将结果返回,pipeline通过减少客户端与redis的通信次数来实现降低往返延时时间,而且Pipeline 实现的原理是队列,而队列的原理是时先进先出,这样就保证数据的顺序性。 
    缺陷:需要注意到是用 pipeline方式打包命令发送,redis必须在处理完所有命令前先缓存起所有命令的处理结果。打包的命令越多,缓存消耗内存也越多。所以并不是打包的命令越多越好。具体多少合适需要根据具体情况测试。
   备注:Pipeline 的默认的同步的个数为53个,也就是说arges中累加到53条数据时会把数据提交;
  
7)扩展:
    由于redis-cluster的hash分片,JedisCluster对象原生并不支持Pipline管道和keys方法。然而,实际项目中在追求性能以及考虑到Redis集群版和单机版兼容或切换问题,往往需要支持这些方法,通过整理网上的部分资料,现给出以下思路,具体方法可参考gitHub示例
   
  管道Pipline实现思路:
 
  Redis集群规范: Redis 集群的键空间被分割为 16384 个槽(slot), 集群的最大节点数量也是 16384 个。每个主节点都负责处理 16384 个哈希槽的其中一部分。当一个集群处于“稳定”(stable)状态时(群没有在执行重配置(reconfiguration)操作), 每个哈希槽都只由一个节点进行处理(hash Slot的分配是由CRC16算法计算)。
 故, 

1.根据要插入的key知道这个key所对应的槽的号码(JedisClusterCRC16.getSlot(key)), 再通过这个槽的号码从集群中找到对应Jedis(通过每个节点的slot分布,就知道了哪些key应该在哪些节点上)。

2.相同槽位的key,使用同一个jedis.pipeline去执行命令。

3.合并此次pipeline所有的response返回。

keys实现思路:

循环集群中所有的节点(分别获取j对应的client对象),然后每个节点做keys,最后再加到一块返回。

备注:每次执行前需要刷新以获取最新的slot分布。

Redis项目实战---应用及理论(三)---Jedis使用的更多相关文章

  1. Redis项目实战---应用及理论(二)---Redis集群原理

    一. Redis官方推荐集群方案:Redis Cluster 适用于redis3.0以后版本,        redis cluster 是redis官方提供的分布式解决方案,在3.0版本后推出的,有 ...

  2. Redis项目实战---应用及理论(上)---redis基础知识介绍

    redis(Remote Dictionary Server)   一.原理及特性层面:     1.优势:        1)数据加载在内存中,执行速度快, 数据结构类似于HashMap,HashM ...

  3. Redis项目实战 .net StackExchange.Redis

    StackExchange.Redis 免费.支持异步.用的最多 常用对象 源码地址:https://github.com/StackExchange/StackExchange.Redis    用 ...

  4. Redis项目实战

    1.显示最新的项目列表 下面这个语句常用来显示最新项目,随着数据多了,查询毫无疑问会越来越慢. SELECT * FROM foo WHERE ... ORDER BY time DESC LIMIT ...

  5. Redis项目实战,一些经验总结

    来源:https://my.oschina.net/u/920698/blog/3031587 背景 Redis 是一个开源的内存数据结构存储系统. 可以作为数据库.缓存和消息中间件使用. 支持多种类 ...

  6. 【无私分享:ASP.NET CORE 项目实战(第十一章)】Asp.net Core 缓存 MemoryCache 和 Redis

    目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 经过 N 久反复的尝试,翻阅了网上无数的资料,GitHub上下载了十几个源码参考, Memory 和 Redis 终于写出一个 ...

  7. 15套java架构师、集群、高可用、高可扩展、高性能、高并发、性能优化、Spring boot、Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分布式项目实战视频教程

    * { font-family: "Microsoft YaHei" !important } h1 { color: #FF0 } 15套java架构师.集群.高可用.高可扩展. ...

  8. java架构师负载均衡、高并发、nginx优化、tomcat集群、异步性能优化、Dubbo分布式、Redis持久化、ActiveMQ中间件、Netty互联网、spring大型分布式项目实战视频教程百度网盘

    15套Java架构师详情 * { font-family: "Microsoft YaHei" !important } h1 { background-color: #006; ...

  9. 15套java架构师、集群、高可用、高可扩 展、高性能、高并发、性能优化Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分布式项目实战视频教程

    * { font-family: "Microsoft YaHei" !important } h1 { color: #FF0 } 15套java架构师.集群.高可用.高可扩 展 ...

随机推荐

  1. linux如何直接运行python文件

    1.首先创建好py文件 touch GetCiscoCpu.py 2. 编写GetCiscoCpu.py vi GetCiscoCpu.py /********************** *本文是用 ...

  2. SYN5104型 时间综合测试仪

    SYN5104型  时间综合测试仪 gps时钟测试仪时间/频率测量仪器使用说明视频链接: http://www.syn029.com/h-pd-73-0_310_6_-1.html 请将此链接复制到浏 ...

  3. java泛型方法返回泛型结果

    public class Test { static HashMap<String, String> sMap = new HashMap<String, String>(); ...

  4. hadoop之hive&hbase互操作

    大家都知道,hive的SQL操作非常方便,但是查询过程中需要启动MapReduce,无法做到实时响应. hbase是hadoop家族中的分布式数据库,与传统关系数据库不同,它底层采用列存储格式,扩展性 ...

  5. UI-grid 表格内容可编辑(enableCellEdit可指定列编辑)

    在网上搜索了很多关于UI-Grid的问题 很遗憾好少啊啊啊 不过有API还是比较欣慰的 官方API:UI Grid 还有一位大佬的翻译的中文API:angularjs ui-grid中文api 行编辑 ...

  6. Django 强大的ORM之增删改查

    Django orm         Django——orm进阶 测试Django中的orm 表结构: models.py class User(models.Model): name = model ...

  7. 关于CORS 应该注意的几点

    前言 对于跨域,随着w3c的CORS的出现,相比较于有些年头的jsonp,CORS以其简单安全,支持post的优势越来越收到大家的欢迎.具体如何CORS的原理和实现,直接推荐阮老师的文章,十分详细.本 ...

  8. NET中级开发工程师职责要求

    NET中级开发工程师岗位职责1.熟练掌握 WebApi, ASP.NET MVC, Entity Framework,.NET CORE等技术,精通JQuery.Vue.Bootstrap等前端开发框 ...

  9. CCPC2019江西省赛-Problem G.Traffic

    题目描述: /*纯手打题面*/ Avin is observing the cars at a crossroads.He finds that there are n cars running in ...

  10. 高效 MacBook 工作环境配置,超实用!

    作者:正鹏 & 隃墨 http://www.xialeizhou.com/?p=71 前言 工欲善其事,必先利其器,工具永远都是用来解决问题的,没必要为了工具而工具,一切工具都是为了能快速准确 ...