jedis客户端操作redis主要三种模式:单台模式、分片模式(ShardedJedis)、集群模式(BinaryJedisCluster)

ShardedJedis是通过一致性哈希来实现分布式缓存的,通过一定的策略把不同的key分配到不同的redis server上,达到横向扩展的目的。

一、简介

1、jedis

redis是内存数据库,常被用作缓存。jedis是java语言的redis客户端。本文将基于原生的jedis,对spring与redis集成开发进行介绍。

2、ShardedJedisPool

ShardedJedisPool是基于一致性哈希算法实现的分布式jedis池。

这里的一致性哈希算法,简单的说,就是将部署的redis-server(一个或多个)和存数据的key映射到同一地此空间,

这样redisServer可动态添加或减少。

二、开发步骤

1、添加java的redis驱动器jedis,以及连接池,maven依赖如下:

<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.6.2</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.4.2</version>
</dependency>

2、配置jedis控制参数,redis.clients.jedis.JedisPoolConfig,其中的参数有:

a)maxTotal,池中最多可以有多少个jedis实例,默认值是8

b)maxIdle,池中最多有多少个空闲的jedis实例,默认值是8

c)minIdle,池中最小有多少个空闲的jedis实例,默认值是0

d)maxWaitMillis,获取jedis实例的最大等待毫秒数,默认值是-1

配置可如:

<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"
p:maxTotal="6000"
p:maxIdle="300"
p:minIdle="100"
p:maxWaitMillis="1000"
/>

3、配置jedis池,redis.clients.jedis.ShardedJedisPool,其有多个构造函数,最主要的是:

public ShardedJedisPool(GenericObjectPoolConfig poolConfig, List<JedisShardInfo> shards) {
this(poolConfig, shards, Hashing.MURMUR_HASH);
}

即是:

a)添加控制参数,也就是上一步配置的JedisPoolConfig。

b)添加redis分片,每一个分片在redis.clients.jedis.JedisShardInfo中配置,

内部参数包括部署地址、端口、超时时间、权重等信息,原码如下:

public class JedisShardInfo extends ShardInfo<Jedis> {
private int timeout;
private String host;
private int port;
private String password;
private String name;
public abstract class ShardInfo<T> {
private int weight;
}

完整配置如:

<bean id="shardedJedisPool" class="redis.clients.jedis.ShardedJedisPool">
<constructor-arg index="0" ref="jedisPoolConfig" />
<constructor-arg index="1">
<list>
<bean class="redis.clients.jedis.JedisShardInfo">
<constructor-arg name="host" value="127.0.0.1" />
<constructor-arg name="port" value="6379" />
</bean>
<bean class="redis.clients.jedis.JedisShardInfo">
<constructor-arg name="host" value="127.0.0.1" />
<constructor-arg name="port" value="6380" />
</bean>
</list>
</constructor-arg>
</bean>

4、通过ShardedJedisPool获取jedis实例

ShardedJedis shardedJedis = shardedJedisPool.getResource();

5、使用jedis进行数据存取

如:

shardedJedis.set(name,value);
shardedJedis.get(name);

6、使用完后,将jedis实例还给池


shardedJedisPool.returnResource(shardedJedis);  //正常使用完后,将jedis实例返回到池中
shardedJedisPool.returnBrokenResource(shardedJedis); //无法正常使用,将jedis实例返回到池中,标识该jedis实例不能使用

三、代码实例

1、添加maven依赖


<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.6.2</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.4.2</version>
</dependency>

2、添加spring配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"
p:maxTotal="6000"
p:maxIdle="300"
p:minIdle="100"
p:maxWaitMillis="1000"
/> <bean id="shardedJedisPool" class="redis.clients.jedis.ShardedJedisPool">
<constructor-arg index="0" ref="jedisPoolConfig" />
<constructor-arg index="1">
<list>
<bean class="redis.clients.jedis.JedisShardInfo">
<constructor-arg name="host" value="127.0.0.1" />
<constructor-arg name="port" value="6379" />
</bean>
<!--<bean class="redis.clients.jedis.JedisShardInfo">-->
<!--<constructor-arg name="host" value="127.0.0.1" />-->
<!--<constructor-arg name="port" value="6380" />-->
<!--</bean>-->
</list>
</constructor-arg>
</bean>
</beans>

3、使用jedis进行数据存取

public class ShardedJedisPoolMain {
public static void main(String[] args) {
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("classpath:spring/spring-redis.xml");
ShardedJedisPool shardedJedisPool = (ShardedJedisPool) ac.getBean("shardedJedisPool");
boolean broken = false; //jedis实例是否已不能使用
ShardedJedis shardedJedis = null;
try{
shardedJedis = shardedJedisPool.getResource(); //从池中获取jedis实例
shardedJedis.set("key1","value1");
String val = shardedJedis.get("key1");
System.out.println(val);
}catch (Exception e){
broken=true;
}finally {
if(broken){
shardedJedisPool.returnBrokenResource(shardedJedis); //无法正常使用,将jedis实例返回到池中,标识该jedis实例不能使用
}else{
shardedJedisPool.returnResource(shardedJedis); //正常使用完后,将jedis实例返回到池中 }
}
}
}

Jedis下的ShardedJedis的更多相关文章

  1. Jedis下的ShardedJedis(分布式)使用方法(一)

    原来项目中有用到Redis用作缓存服务,刚开始时只用一台Redis就能够满足服务,随着项目的慢慢进行,发现一台满足不了现有的项目需求,因为Redis操作都是原子性这样的特性,造成有时同时读写缓存造成查 ...

  2. Jedis下的ShardedJedis(分布式)使用方法(二)

    上一篇中介绍了ShardedJedis的基本使用方法以及演示了一个简单的例子,在这一篇中我们来介绍了ShardedJedis的原理. 1.ShardedJedis内部实现 首先我们来看一下Sharde ...

  3. IntelliJ IDEA 乱码解决方案 (项目代码、控制台等)

    IntelliJ IDEA 乱码解决方案 (项目代码.控制台等) 最近IDE从eclipse改成IntelliJ IDEA 了,原因是公司大部分人都在用这个IDE,而且一直推荐用,所以尝尝鲜.换的第一 ...

  4. Redis客户端之Spring整合Jedis,ShardedJedisPool集群配置

    Jedis设计 Jedis作为推荐的java语言redis客户端,其抽象封装为三部分: 对象池设计:Pool,JedisPool,GenericObjectPool,BasePoolableObjec ...

  5. Redis客户端API操作 Jedis详解

    redis是一个著名的key-value存储系统,也是nosql中的最常见的一种.其实,个人认为,redis最强大的地方不在于其存储,而在于其强大的缓存作用. 我们可以把它想象成一个巨大的(多借点集群 ...

  6. windows下Redis安装及利用java操作Redis

    一.windows下Redis安装 1.Redis下载 下载地址:https://github.com/MicrosoftArchive/redis 打开下载地址后,选择版本 然后选择压缩包 下载 R ...

  7. spring集成jedis简单实例

    jedis是redis的java客户端,spring将redis连接池作为一个bean配置. redis连接池分为两种,一种是“redis.clients.jedis.ShardedJedisPool ...

  8. Spring集成Jedis(不依赖spring-data-redis)(单机/集群模式)(待实践)

    Jedis是Redis的Java客户端,Spring将Jedis连接池作为一个Bean来配置.如果在Spring Data的官网上可以发现,Spring Data Redis已经将Jedis集成进去了 ...

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

    jedis是一个著名的key-value存储系统,而作为其官方推荐的java版客户端jedis也非常强大和稳定,支持事务.管道及有jedis自身实现的分布式. 在这里对jedis关于事务.管道和分布式 ...

随机推荐

  1. Solrcloud+tomcat+zookeeper

    准备两台服务器,目录结构如下 主机名 IP地址 tomcat安装路径 zookeeper安装路径 solr安装路径 java安装路径 sht-sgmhadoopnn-01 172.16.101.55 ...

  2. 如何实现Java线程的 阻塞/唤醒(和暂停/继续 类似)

    以下为线程 阻塞/唤醒  主要代码 public class MyThread extends Thread { //无意义 private final Object lock = new Objec ...

  3. P1115 最大子段和(简单DP)

    题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入格式 第一行是一个正整数NN,表示了序列的长度. 第二行包含NN个绝对值不大于1000010000的整数A_iAi​,描述了这段序 ...

  4. [Wpf]在C#中添加 collectionViewSource

    Products = new ObservableCollection<Product>(products); ProductOptions = new ObservableCollect ...

  5. npm学习(五)之使用package.json

    使用package.json 管理本地安装的npm包的最佳方法是创建一个package.json文件. 一个packagejson文件: 列出项目所依赖的包. 允许使用语义版本控制规则指定项目可以使用 ...

  6. Action获取请求参数的3中方式

    方式一:Action本身作为Model对象,通过属性注入(Setter)方法讲参数数据封装到Action中 具体为:在Action中,提供和参数名相同的几个属性,并为其提供set方法,那么,该参数会被 ...

  7. PHP WEB 引擎缓存加速优化

    PHP 缓存加速器介绍 操作码缓存 请求一个 PHP 程序时,PHP 引擎会解析程序,并且将编译码作为特定操作码.这是要执行的代 码的一种二进制表示形式.随后,此操作码有 PHP 引擎执行并丢弃.操作 ...

  8. Laravel session的保存机制

    与$_SESSION不同Laraver中的session是在当次程序执行完毕时保存到文件或其他存储引擎中的,也就是说如果使用了die等强制结束程序的函数将不会自动保存session导致session失 ...

  9. 003-基于impi zabbix监控r720 测试过程

    1.F2进入服务器bios 修改network  使这台服务器能够被远程访问. 2.在远程的centos 7 服务器上安装  impitool工具包 #ipmitool -I lanplus -H X ...

  10. MINIUI grid学习笔记

    grid 控件a.事件的绑定和移除         grid.on("rowclick", fn); //绑定事件 (这个的话类似jquery的绑定事件)         grid ...