SSM11-Redis---jedis的使用方法以及緩存同步

1. Jedis

須要把jedis依賴的jar包添加到工程中。Maven工程中須要把jedis的座標添加到依賴。node

 

推薦添加到服務層。E3-content-Service工程中。redis

 

1.1. 鏈接單機版

第一步:建立一個Jedis對象。須要指定服務端的ip及端口。spring

第二步:使用Jedis對象操做數據庫,每一個redis命令對應一個方法。數據庫

第三步:打印結果。緩存

第四步:關閉Jedis服務器

@Testapp

public void testJedis() throws Exception {ide

// 第一步:建立一個Jedis對象。須要指定服務端的ip及端口。測試

Jedis jedis = new Jedis("192.168.80.129", 6379);spa

// 第二步:使用Jedis對象操做數據庫,每一個redis命令對應一個方法。

String result = jedis.get("hello");

// 第三步:打印結果。

System.out.println(result);

// 第四步:關閉Jedis

jedis.close();

}

 

1.2. 鏈接單機版使用鏈接池

第一步:建立一個JedisPool對象。須要指定服務端的ip及端口。

第二步:從JedisPool中得到Jedis對象。

第三步:使用Jedis操做redis服務器。

第四步:操做完畢後關閉jedis對象,鏈接池回收資源。

第五步:關閉JedisPool對象。

@Test

public void testJedisPool() throws Exception {

// 第一步:建立一個JedisPool對象。須要指定服務端的ip及端口。

JedisPool jedisPool = new JedisPool("192.168.80.129", 6379);

// 第二步:從JedisPool中得到Jedis對象。

Jedis jedis = jedisPool.getResource();

// 第三步:使用Jedis操做redis服務器。

jedis.set("jedis", "test");

String result = jedis.get("jedis");

System.out.println(result);

// 第四步:操做完畢後關閉jedis對象,鏈接池回收資源。

jedis.close();

// 第五步:關閉JedisPool對象。

jedisPool.close();

}

 

1.3. 鏈接集羣版

第一步:使用JedisCluster對象。須要一個Set<HostAndPort>參數。Redis節點的列表。

第二步:直接使用JedisCluster對象操做redis。在系統中單例存在。

第三步:打印結果

第四步:系統關閉前,關閉JedisCluster對象。

 

@Test

public void testJedisCluster() throws Exception {

// 第一步:使用JedisCluster對象。須要一個Set<HostAndPort>參數。Redis節點的列表。

Set<HostAndPort> nodes = new HashSet<>();

nodes.add(new HostAndPort("192.168.80.129", 7001));

nodes.add(new HostAndPort("192.168.80.129", 7002));

nodes.add(new HostAndPort("192.168.80.129", 7003));

nodes.add(new HostAndPort("192.168.80.129", 7004));

nodes.add(new HostAndPort("192.168.80.129", 7005));

nodes.add(new HostAndPort("192.168.80.129", 7006));

JedisCluster jedisCluster = new JedisCluster(nodes);

// 第二步:直接使用JedisCluster對象操做redis。在系統中單例存在。

jedisCluster.set("hello", "100");

String result = jedisCluster.get("hello");

// 第三步:打印結果

System.out.println(result);

// 第四步:系統關閉前,關閉JedisCluster對象。

jedisCluster.close();

}

 

2. 向業務邏輯中添加緩存

2.1. 接口封裝

經常使用的操做redis的方法提取出一個接口,分別對應單機版和集羣版建立兩個實現類。

 

2.1.1. 接口定義

public interface JedisClient {

 

String set(String key, String value);

String get(String key);

Boolean exists(String key);

Long expire(String key, int seconds);

Long ttl(String key);

Long incr(String key);

Long hset(String key, String field, String value);

String hget(String key, String field);

Long hdel(String key, String... field);

}

 

2.1.2. 單機版實現類

public class JedisClientPool implements JedisClient {

 

@Autowired

private JedisPool jedisPool;

 

@Override

public String set(String key, String value) {

Jedis jedis = jedisPool.getResource();

String result = jedis.set(key, value);

jedis.close();

return result;

}

 

@Override

public String get(String key) {

Jedis jedis = jedisPool.getResource();

String result = jedis.get(key);

jedis.close();

return result;

}

 

@Override

public Boolean exists(String key) {

Jedis jedis = jedisPool.getResource();

Boolean result = jedis.exists(key);

jedis.close();

return result;

}

 

@Override

public Long expire(String key, int seconds) {

Jedis jedis = jedisPool.getResource();

Long result = jedis.expire(key, seconds);

jedis.close();

return result;

}

 

@Override

public Long ttl(String key) {

Jedis jedis = jedisPool.getResource();

Long result = jedis.ttl(key);

jedis.close();

return result;

}

 

@Override

public Long incr(String key) {

Jedis jedis = jedisPool.getResource();

Long result = jedis.incr(key);

jedis.close();

return result;

}

 

@Override

public Long hset(String key, String field, String value) {

Jedis jedis = jedisPool.getResource();

Long result = jedis.hset(key, field, value);

jedis.close();

return result;

}

 

@Override

public String hget(String key, String field) {

Jedis jedis = jedisPool.getResource();

String result = jedis.hget(key, field);

jedis.close();

return result;

}

 

@Override

public Long hdel(String key, String... field) {

Jedis jedis = jedisPool.getResource();

Long result = jedis.hdel(key, field);

jedis.close();

return result;

}

 

}

 

配置:applicationContext-redis.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"

xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans4.2.xsd

http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context4.2.xsd

http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop4.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx4.2.xsd

http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util4.2.xsd">

 

<!-- 配置單機版的鏈接 -->

<bean id="jedisPool" class="redis.clients.jedis.JedisPool">

<constructor-arg name="host" value="192.168.80.129"></constructor-arg>

<constructor-arg name="port" value="6379"></constructor-arg>

</bean>

<bean id="jedisClientPool" class="cn.e3mall.jedis.JedisClientPool"/>

 

</beans>

 

2.1.3. 集羣版實現類

package cn.e3mall.jedis;

 

import org.springframework.beans.factory.annotation.Autowired;

 

import redis.clients.jedis.JedisCluster;

 

public class JedisClientCluster implements JedisClient {

 

@Autowired

private JedisCluster jedisCluster;

 

@Override

public String set(String key, String value) {

return jedisCluster.set(key, value);

}

 

@Override

public String get(String key) {

return jedisCluster.get(key);

}

 

@Override

public Boolean exists(String key) {

return jedisCluster.exists(key);

}

 

@Override

public Long expire(String key, int seconds) {

return jedisCluster.expire(key, seconds);

}

 

@Override

public Long ttl(String key) {

return jedisCluster.ttl(key);

}

 

@Override

public Long incr(String key) {

return jedisCluster.incr(key);

}

 

@Override

public Long hset(String key, String field, String value) {

return jedisCluster.hset(key, field, value);

}

 

@Override

public String hget(String key, String field) {

return jedisCluster.hget(key, field);

}

 

@Override

public Long hdel(String key, String... field) {

return jedisCluster.hdel(key, field);

}

 

}

 

 

Spring的配置:

<!-- 集羣版的配置 -->

<bean id="jedisCluster" class="redis.clients.jedis.JedisCluster">

<constructor-arg>

<set>

<bean class="redis.clients.jedis.HostAndPort">

<constructor-arg name="host" value="192.168.80.129"></constructor-arg>

<constructor-arg name="port" value="7001"></constructor-arg>

</bean>

<bean class="redis.clients.jedis.HostAndPort">

<constructor-arg name="host" value="192.168.80.129"></constructor-arg>

<constructor-arg name="port" value="7002"></constructor-arg>

</bean>

<bean class="redis.clients.jedis.HostAndPort">

<constructor-arg name="host" value="192.168.80.129"></constructor-arg>

<constructor-arg name="port" value="7003"></constructor-arg>

</bean>

<bean class="redis.clients.jedis.HostAndPort">

<constructor-arg name="host" value="192.168.80.129"></constructor-arg>

<constructor-arg name="port" value="7004"></constructor-arg>

</bean>

<bean class="redis.clients.jedis.HostAndPort">

<constructor-arg name="host" value="192.168.80.129"></constructor-arg>

<constructor-arg name="port" value="7005"></constructor-arg>

</bean>

<bean class="redis.clients.jedis.HostAndPort">

<constructor-arg name="host" value="192.168.80.129"></constructor-arg>

<constructor-arg name="port" value="7006"></constructor-arg>

</bean>

</set>

</constructor-arg>

</bean>

<bean id="jedisClientCluster" class="cn.e3mall.jedis.JedisClientCluster"/>

 

注意:單機版和集羣版不能共存,使用單機版時註釋集羣版的配置。使用集羣版,把單機版註釋。

 

 

2.2. 封裝代碼測試

@Test

public void testJedisClient() throws Exception {

//初始化Spring容器

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-redis.xml");

//從容器中得到JedisClient對象

JedisClient jedisClient = applicationContext.getBean(JedisClient.class);

jedisClient.set("first", "100");

String result = jedisClient.get("first");

System.out.println(result);

 

 

}

 

 

1.1. 緩存同步

對內容信息作增刪改操做後只須要把對應緩存刪除便可。

能夠根據cid刪除。

@Override

public E3Result addContent(TbContent content) {

//補全屬性

content.setCreated(new Date());

content.setUpdated(new Date());

//插入數據

contentMapper.insert(content);

 

//緩存同步刪除 已經修改的數據 下次從數據庫中查詢 而不是直接從緩存中得到

jedisClient.hdel(CONTENT_KEY, content.getCategoryId().toString());

 

return E3Result.ok();

}

相關文章
相關標籤/搜索