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)连接单机版
  1. public void testJedis() throws Exception {
  2. // 第一步:创建一个Jedis对象。需要指定服务端的ip及端口。
  3. Jedis jedis = new Jedis("192.168.**.**", 6379);
  4. // 第二步:使用Jedis对象操作数据库,每个redis命令对应一个方法。
  5. String result = jedis.get("hello");
  6. // 第三步:打印结果。
  7. System.out.println(result);
  8. // 第四步:关闭Jedis
  9. jedis.close();
  10. }

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

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

5)Jedis 消息发布与订阅API

5.1)消息订阅

   

  1. public void subscribeChannal(){
    //从jedisPool中获取一个jedis对象
  2. Jedis jds = RedisInsUtil.getJedis();
  3. // 方式1 订阅得到信息在lister的onPMessage(...)方法中进行处理
  4. jds.psubscribe(this, new String[]{"channal01","channal02"});
  5.    // 方式2 订阅得到信息在lister的onMessage(...)方法中进行处理 (普通订阅方式)
  6.    //jedis.subscribe(listener, "foo", "watson");
    }
  7.  
  8. // 初始化订阅时候的处理
  9. @Override
  10. public void onSubscribe(String channel, int subscribedChannels) {
  11. }
  12.  
  13. // 初始化按表达式的方式订阅时候的处理
  14. @Override
  15. public void onPSubscribe(String pattern, int subscribedChannels) {
  16. }
  17.  
  18. @Override
  19. // 取得按表达式的方式订阅的消息后的处理
  20. public void onPMessage(String pattern, String channel, String message) {
  21. LOG.info("onPMessage()," + pattern + "=" + channel + ",msg="+ message);
  22. }
  23.  
  24. // 取得订阅的消息后的处理
  25. public void onMessage(String channel, String message) {
  26. }

5.2)消息发布

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

  1. Jedis jedis = ru.getConnection(); //获取一个jedis对象,自行封装工具类
  2. 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. vue补充

    一.安装vue-cli脚手架 1.淘宝镜像下载 用淘宝的国内服务器来向国外的服务器请求,我们向淘宝请求,而不是由我们直接向国外的服务器请求,会大大提升请求速度,使用时,将所有的npm命令换成cnpm即 ...

  2. Java的String类字符串的拆分

    在java编程中,有时候我们需要把一个字符串按照某个特定字符.字母等作为截点分割这个字符串, 这样我们就可以使用这个字符串的一部分或者把所有截取的内容保存到数组里等操作. public class S ...

  3. Dubbo详解-说明(一)

    Dubbo 是什么? Dubble是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理的方案. Dubbo 有啥特点? 远程通讯:提供透明化的远程方法的调用,提供 ...

  4. sql server使用公用表表达式CTE通过递归方式编写通用函数自动生成连续数字和日期

    问题:在数据库脚本开发中,有时需要生成一堆连续数字或者日期,例如yearly report就需要连续数字做年份,例如daily report就需要生成一定时间范围内的每一天日期.而自带的系统表mast ...

  5. vsphere网络

    物理网络 物理机间建立的网络,VMware ESXi运行于物理机之上 虚拟网络 单台物理机上运行的虚拟机之间通信形成的逻辑网络. 一.网络概述 1. 物理以太网交换机 2.vSphere标准交换机 虚 ...

  6. 【设计模式】结构型04桥接模式(Bridge Pattern)

    学习地址:http://www.runoob.com/design-pattern/bridge-pattern.html 桥接模式(Bridge Pattern) 桥接模式(Bridge patte ...

  7. 22 | 从0到1:API测试怎么做?常用API测试工具简介

  8. Visual Studio中View页面与Js页面用快捷键互相跳转

    现在已经将源码放到GitHub中了 地址是 https://github.com/liningit/ViewJsLN 公司开发的项目使用的是Mvc框架,且Js与View页面是分开在两个文件夹下的,所以 ...

  9. HDU 4462:Scaring the Birds(暴力枚举+状态压缩)

    http://acm.hdu.edu.cn/showproblem.php?pid=4462 题意:有一个n*n的地图,有k个空地可以放稻草人,给出每个空地可以放的稻草人属性,属性中有个R代表这个位置 ...

  10. RT-Thread定时器以及结构体指针的一些思考

    定时器分为软件定时器和硬件定时器.顾名思义,软件定时器就是有操作系统提供的软件定时器,硬件定时器就是用硬件芯片提供的定时器. 而在RT-Thread操作系统提供的定时器是软件定时器,但是为了便于管理, ...