1. 程式人生 > >spring與redis整合(一)--採用原生的jedis(ShardedJedisPool)

spring與redis整合(一)--採用原生的jedis(ShardedJedisPool)

一、簡介

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例項返回到池中
}
        }
    }
}