前言

Redis在Java’中的客户端在GitHub上start最高的是Jedis和Redisson。Jedis提供了完整的Redis命令,而Redisson有更多分布式的容器实现

如何使用Jedis

1.导入依赖

首先通过Maven引入Jedis的依赖

<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.8.0</version>
</dependency>
2.创建Jedis对象
 Jedis jedis = new Jedis("localhost", 6379);jedis.set("singleJedis", "hello jedis!");System.out.println(jedis.get("singleJedis"));jedis.close();

Jedis对象不是线程安全的,在多线程下使用同一个Jedis对象会出现并发问题,为了避免每次使用Jedis对象时都需要重新创建,Jedis提供了JedisPool。Jedis是线程安全的连接池

3.配置属性文件
#redis config start
redis.ip=127.0.0.1
redis.port=6379#最大连接数
redis.max.total=20#最大空闲数
redis.max.idle=10#最小空闲数
redis.min.idle=2#从jedis连接池获取连接时,校验并返回可用的连接
redis.test.borrow=true#把连接放回jedis连接池时,校验并返回可用的连接
redis.test.return=true
4.JedisPool
public class RedisPool {private static JedisPool pool;//jedis连接池private static Integer maxTotal = Integer.parseInt(PropertiesUtil.getProperty("redis.max.total","20")); //最大连接数private static Integer maxIdle = Integer.parseInt(PropertiesUtil.getProperty("redis.max.idle","20"));//在jedispool中最大的idle状态(空闲的)的jedis实例的个数private static Integer minIdle = Integer.parseInt(PropertiesUtil.getProperty("redis.min.idle","20"));//在jedispool中最小的idle状态(空闲的)的jedis实例的个数private static Boolean testOnBorrow = Boolean.parseBoolean(PropertiesUtil.getProperty("redis.test.borrow","true"));//在borrow一个jedis实例的时候,是否要进行验证操作,如果赋值true。则得到的jedis实例肯定是可以用的。private static Boolean testOnReturn = Boolean.parseBoolean(PropertiesUtil.getProperty("redis.test.return","true"));//在return一个jedis实例的时候,是否要进行验证操作,如果赋值true。则放回jedispool的jedis实例肯定是可以用的。private static String redisIp = PropertiesUtil.getProperty("redis.ip");private static Integer redisPort = Integer.parseInt(PropertiesUtil.getProperty("redis.port"));private static void initPool(){JedisPoolConfig config = new JedisPoolConfig();config.setMaxTotal(maxTotal);config.setMaxIdle(maxIdle);config.setMinIdle(minIdle);config.setTestOnBorrow(testOnBorrow);config.setTestOnReturn(testOnReturn);config.setBlockWhenExhausted(true);//连接耗尽的时候,是否阻塞,false会抛出异常,true阻塞直到超时。默认为true。pool = new JedisPool(config,redisIp,redisPort,1000*2);}//静态代码块,初始化Redis池static{initPool();}public static Jedis getJedis(){return pool.getResource();}public static void returnBrokenResource(Jedis jedis){pool.returnBrokenResource(jedis);}public static void returnResource(Jedis jedis){pool.returnResource(jedis);}}
5.封装Jedis
@Slf4j
public class RedisPoolUtil {/*** 设置key的有效期,单位是秒* @param key* @param exTime* @return*/public static Long expire(String key,int exTime){Jedis jedis = null;Long result = null;try {//从Redis连接池中获得Jedis对象jedis = RedisPool.getJedis();//设置成功则返回Jedis对象result = jedis.expire(key,exTime);} catch (Exception e) {log.error("expire key:{} error",key,e);RedisPool.returnBrokenResource(jedis);return result;}RedisPool.returnResource(jedis);return result;}//exTime的单位是秒//设置key-value并且设置超时时间public static String setEx(String key,String value,int exTime){Jedis jedis = null;String result = null;try {jedis = RedisPool.getJedis();result = jedis.setex(key,exTime,value);} catch (Exception e) {log.error("setex key:{} value:{} error",key,value,e);RedisPool.returnBrokenResource(jedis);return result;}RedisPool.returnResource(jedis);return result;}public static String set(String key,String value){Jedis jedis = null;String result = null;try {jedis = RedisPool.getJedis();result = jedis.set(key,value);} catch (Exception e) {log.error("set key:{} value:{} error",key,value,e);RedisPool.returnBrokenResource(jedis);return result;}RedisPool.returnResource(jedis);return result;}public static String get(String key){Jedis jedis = null;String result = null;try {jedis = RedisPool.getJedis();result = jedis.get(key);} catch (Exception e) {log.error("get key:{} error",key,e);RedisPool.returnBrokenResource(jedis);return result;}RedisPool.returnResource(jedis);return result;}public static Long del(String key){Jedis jedis = null;Long result = null;try {jedis = RedisPool.getJedis();result = jedis.del(key);} catch (Exception e) {log.error("del key:{} error",key,e);RedisPool.returnBrokenResource(jedis);return result;}RedisPool.returnResource(jedis);return result;}

SharedJedis

为了提高应用的性能,我们通常不止使用一台Redis做缓存服务,而在Redis2.x版本中并没有支持集群,Redis从3.x版本才开始支持集群。Redis2.x版本下实现Redis服务器的扩展需要通过横向扩展的方式,即多个相互独立的主从服务器群,使用SharedJedis实现分布式缓存,SharedJedis通过一致性哈希来实现分布式缓存,即实现一定的策略将不同的key分配到不同的Redis Server上,达到横向扩展的目的

1.RedisSharedPool
public class RedisShardedPool {private static ShardedJedisPool pool;//sharded jedis连接池private static Integer maxTotal = Integer.parseInt(PropertiesUtil.getProperty("redis.max.total","20")); //最大连接数private static Integer maxIdle = Integer.parseInt(PropertiesUtil.getProperty("redis.max.idle","20"));//在jedispool中最大的idle状态(空闲的)的jedis实例的个数private static Integer minIdle = Integer.parseInt(PropertiesUtil.getProperty("redis.min.idle","20"));//在jedispool中最小的idle状态(空闲的)的jedis实例的个数private static Boolean testOnBorrow = Boolean.parseBoolean(PropertiesUtil.getProperty("redis.test.borrow","true"));//在borrow一个jedis实例的时候,是否要进行验证操作,如果赋值true。则得到的jedis实例肯定是可以用的。private static Boolean testOnReturn = Boolean.parseBoolean(PropertiesUtil.getProperty("redis.test.return","true"));//在return一个jedis实例的时候,是否要进行验证操作,如果赋值true。则放回jedispool的jedis实例肯定是可以用的。//获取Redis1相关信息private static String redis1Ip = PropertiesUtil.getProperty("redis1.ip");private static Integer redis1Port = Integer.parseInt(PropertiesUtil.getProperty("redis1.port"));//获取Redis2的相关信息private static String redis2Ip = PropertiesUtil.getProperty("redis2.ip");private static Integer redis2Port = Integer.parseInt(PropertiesUtil.getProperty("redis2.port"));private static void initPool(){JedisPoolConfig config = new JedisPoolConfig();config.setMaxTotal(maxTotal);config.setMaxIdle(maxIdle);config.setMinIdle(minIdle);config.setTestOnBorrow(testOnBorrow);config.setTestOnReturn(testOnReturn);config.setBlockWhenExhausted(true);//连接耗尽的时候,是否阻塞,false会抛出异常,true阻塞直到超时。默认为true。JedisShardInfo info1 = new JedisShardInfo(redis1Ip,redis1Port,1000*2);JedisShardInfo info2 = new JedisShardInfo(redis2Ip,redis2Port,1000*2);//创建一个JedisListList<JedisShardInfo> jedisShardInfoList = new ArrayList<JedisShardInfo>(2);jedisShardInfoList.add(info1);jedisShardInfoList.add(info2);//RedisSharedPool传入JedisListpool = new ShardedJedisPool(config,jedisShardInfoList, Hashing.MURMUR_HASH, Sharded.DEFAULT_KEY_TAG_PATTERN);}static{initPool();}public static ShardedJedis getJedis(){return pool.getResource();}public static void returnBrokenResource(ShardedJedis jedis){pool.returnBrokenResource(jedis);}public static void returnResource(ShardedJedis jedis){pool.returnResource(jedis);}}
2.封装ShraedJedis
@Slf4j
public class RedisShardedPoolUtil {/*** 设置key的有效期,单位是秒* @param key* @param exTime* @return*/public static Long expire(String key,int exTime){ShardedJedis jedis = null;Long result = null;try {//根据SharedJedis的一致性哈希策略从对应的Redis Server获取值或设置值jedis = RedisShardedPool.getJedis();result = jedis.expire(key,exTime);} catch (Exception e) {log.error("expire key:{} error",key,e);RedisShardedPool.returnBrokenResource(jedis);return result;}RedisShardedPool.returnResource(jedis);return result;}//exTime的单位是秒public static String setEx(String key,String value,int exTime){ShardedJedis jedis = null;String result = null;try {jedis = RedisShardedPool.getJedis();result = jedis.setex(key,exTime,value);} catch (Exception e) {log.error("setex key:{} value:{} error",key,value,e);RedisShardedPool.returnBrokenResource(jedis);return result;}RedisShardedPool.returnResource(jedis);return result;}public static String set(String key,String value){ShardedJedis jedis = null;String result = null;try {jedis = RedisShardedPool.getJedis();result = jedis.set(key,value);} catch (Exception e) {log.error("set key:{} value:{} error",key,value,e);RedisShardedPool.returnBrokenResource(jedis);return result;}RedisShardedPool.returnResource(jedis);return result;}public static String getSet(String key,String value){ShardedJedis jedis = null;String result = null;try {jedis = RedisShardedPool.getJedis();result = jedis.getSet(key,value);} catch (Exception e) {log.error("getset key:{} value:{} error",key,value,e);RedisShardedPool.returnBrokenResource(jedis);return result;}RedisShardedPool.returnResource(jedis);return result;}public static String get(String key){ShardedJedis jedis = null;String result = null;try {jedis = RedisShardedPool.getJedis();result = jedis.get(key);} catch (Exception e) {log.error("get key:{} error",key,e);RedisShardedPool.returnBrokenResource(jedis);return result;}RedisShardedPool.returnResource(jedis);return result;}public static Long del(String key){ShardedJedis jedis = null;Long result = null;try {jedis = RedisShardedPool.getJedis();result = jedis.del(key);} catch (Exception e) {log.error("del key:{} error",key,e);RedisShardedPool.returnBrokenResource(jedis);return result;}RedisShardedPool.returnResource(jedis);return result;}public static Long setnx(String key,String value){ShardedJedis jedis = null;Long result = null;try {jedis = RedisShardedPool.getJedis();result = jedis.setnx(key,value);} catch (Exception e) {log.error("setnx key:{} value:{} error",key,value,e);RedisShardedPool.returnBrokenResource(jedis);return result;}RedisShardedPool.returnResource(jedis);return result;}
}

除了初始化SharedJedisPool时需要加入多个Redis服务器信息外,其他和Jedis差不多

Shared一致性哈希实现

shared一致性哈希实现采用以下方案:
Redis服务器节点划分:将每台服务器节点采用hash算法划分为160个虚拟节点(可以配置划分权重)

  1. 将划分的虚拟节点采用TreeMap存储
  2. 对每个Redis服务器的物理连接采用LinkedHashMap存储
  3. 对Key or KeyTag 采用同样的hash算法,然后从TreeMap获取大于等于键hash值得节点,取最邻近节点存储;当key的hash值大于虚拟节点hash值得最大值时,存入第一个虚拟节点

sharded采用的hash算法:MD5 和 MurmurHash两种;默认采用64位的MurmurHash算法;MurmurHash是一种高效,低碰撞的hash算法

Jedis的基本使用相关推荐

  1. Jedis无法远程连接阿里云服务器的redis问题

    Jedis无法远程连接阿里云服务器的redis问题 查了很多资料才最终解决了这个问题,现在对上述问题进行总结. CentOS7版本解决办法: 1.停止并屏蔽firewalld服务 systemctl ...

  2. jedis操作set_在Java中使用jedis操作Set类型

    Apache Kafka® 是 一个分布式流处理平台. Apache Kafka 是 一个分布式流处理平台. 1. 可以让你发布和订阅流式的记录. 2. 这一方面与消息队列或者企业消息系统类似. 3. ...

  3. jedis使用_网易架构师心得:Springboot下使用redis踩过的坑

    点击?蓝色" 深入原理",关注并"设为星标" 技术干货,第一时间推送 首先总结了redis服务端单线程工作模型,redis四种部署方式及使用场景,然后从源码的角 ...

  4. Redis (二)_ jedis的使用

    Jedis 是 Redis 官方首选的 Java 客户端开发包 虚拟机设置 查看虚拟机的ip ifconfig 将虚拟机的6379端口打开 #运行下面的命令 如果是新建的一个新的 文件,你需要先安装 ...

  5. Spring集成Redis方案(spring-data-redis)(基于Jedis的单机模式)(待实践)

    说明:请注意Spring Data Redis的版本以及Spring的版本!最新版本的Spring Data Redis已经去除Jedis的依赖包,需要自行引入,这个是个坑点.并且会与一些低版本的Sp ...

  6. _00021 尼娜抹微笑伊拉克_谁的的最离奇的异常第二阶段 Jedis pool.returnResource(jedis)...

    笔者博文:妳那伊抹微笑 博客地址:http://blog.csdn.net/u012185296 博文标题:_00021 妳那伊抹微笑_谁的异常最诡异第二期之 Jedis pool.returnRes ...

  7. Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式…)介绍(转)

    [-] 一普通同步方式 二事务方式Transactions 三管道Pipelining 四管道中调用事务 五分布式直连同步调用 六分布式直连异步调用 七分布式连接池同步调用 八分布式连接池异步调用 九 ...

  8. jedis操作set_Java中使用Jedis操作Redis的示例代码

    使用java操作Redis需要jedis-2.1.0.jar,下载地址:jedis-2.1.0.jar 如果需要使用Redis连接池的话,还需commons-pool-1.5.4.jar,下载地址:c ...

  9. (七)使用jedis连接单机和集群(一步一个坑踩出来的辛酸泪)

    环境准备: redis-4.0.9,最新版了 ruby:redis-x.x.x.gem    这个gem什么版本都行,我redis4用3.0.0的gem正常跑 jedis-2.9.0.jar,最新版 ...

  10. 基于Jedis实现Redis分片的理解

    2019独角兽企业重金招聘Python工程师标准>>> 基于Jedis实现Redis分片的理解 博客分类: 缓存 一 理解前提 分片是为了把鸡蛋放到几个篮子里,而Dynamo型的分片 ...

最新文章

  1. asp.net提交危险字符处理方法之一
  2. 先写API文档还是先写代码?你需要这款神器Apifox!
  3. Spring集成web环境步骤
  4. JAVASCRIPT 提示信息 主要是使用了获取控件的位置进行定位
  5. slqite3库查询数据处理方式_SQLite3命令操作大全
  6. nginx ssl加密_如何通过让我们加密SSL证书来保护Nginx
  7. SQLyog备份数据库
  8. 试用版的和正式版的软件有什么区别
  9. Ubuntu18.04安装CAJViewer
  10. 网件刷breed_小白爱折腾 篇二:矿渣小娱C1刷breed以安装固件(适用其他路由器)...
  11. 单独计算机械台班费套什么定额,机械台班费用定额
  12. 怎样将PDF作为矢量图插入PPT中
  13. android 图片尺寸修改工具,图片尺寸修改器手机版下载_图片尺寸修改器安卓下载v 6.3...
  14. josn 格式 解析
  15. 职场新人注意事项:抖包袱可以,抖机灵不要
  16. IPSec IKEV2
  17. 三菱FX5U多冲一切追剪程序。 无需40SSC运动模块,通过软件电子凸轮算法实现追剪功能
  18. 一句关于爱情的话...
  19. android动态mac地址,Android 版本兼容 — Android 6.0 和 7.0后获取Mac地址
  20. 一键定位电脑弹出垃圾广告,屏蔽删除终止,windows神器!

热门文章

  1. 线性代数(2)行列式6种运算性质
  2. Anaconda下安装Tensorflow和Keras的安装教程
  3. Mac下查找支持的字体
  4. csgo删除机器人_csgo1v1去除机器人 | 手游网游页游攻略大全
  5. 2021常见user_agent大全 用户浏览器ua(互联网项目自己整理)
  6. 四个有关文件传输的CTF WEB题(深育杯FakeWget、极客大挑战where_is_my_FUMO、2021陇原战疫CheckIN、N1CTF-curl trick)
  7. 技嘉服务器主板型号,服务器配件 全面认识技嘉服务器主板
  8. 【element-plus】el-dialog距离顶部的高度
  9. 爱之树(二叉树建树+搜索)
  10. project Structure中的Artifacts是什么