spring與redis整合(一)--採用原生的jedis(ShardedJedisPool)
阿新 • • 發佈:2019-02-08
一、簡介
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例項返回到池中 } } } }