專案中使用redis單機版和叢集版
阿新 • • 發佈:2018-12-25
redis搭建請看上一篇文章
新增jedis依賴:
<!-- Redis客戶端 -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
連線單機版:
@Test public void testJedis() throws Exception { // 第一步:建立一個Jedis物件。需要指定服務端的ip及埠。 Jedis jedis = new Jedis("192.168.00.000", 6379); // 第二步:使用Jedis物件操作資料庫,每個redis命令對應一個方法。 String result = jedis.get("a"); // 第三步:列印結果。 System.out.println(result); // 第四步:關閉Jedis jedis.close(); }
連線單機版使用連線池:
@Test public void testJedisPool() throws Exception { // 第一步:建立一個JedisPool物件。需要指定服務端的ip及埠。 JedisPool jedisPool = new JedisPool("192.168.25.153", 6379); // 第二步:從JedisPool中獲得Jedis物件。 Jedis jedis = jedisPool.getResource(); // 第三步:使用Jedis操作redis伺服器。 jedis.set("a", "1"); String result = jedis.get("a"); System.out.println(result); // 第四步:操作完畢後關閉jedis物件,連線池回收資源。 jedis.close(); // 第五步:關閉JedisPool物件。 jedisPool.close(); }
連線叢集版:
@Test public void testJedisCluster() throws Exception { // 第一步:使用JedisCluster物件。需要一個Set<HostAndPort>引數。Redis節點的列表。 Set<HostAndPort> nodes = new HashSet<>(); nodes.add(new HostAndPort("192.168.00.000", 7001)); nodes.add(new HostAndPort("192.168.00.000", 7002)); nodes.add(new HostAndPort("192.168.00.000", 7003)); nodes.add(new HostAndPort("192.168.00.000", 7004)); nodes.add(new HostAndPort("192.168.00.000", 7005)); nodes.add(new HostAndPort("192.168.00.000", 7006)); JedisCluster jedisCluster = new JedisCluster(nodes); // 第二步:直接使用JedisCluster物件操作redis。在系統中單例存在。 jedisCluster.set("a", "1"); String result = jedisCluster.get("a"); // 第三步:列印結果 System.out.println(result); // 第四步:系統關閉前,關閉JedisCluster物件。 jedisCluster.close(); }
向業務邏輯中新增快取:(基於spring)
常用的操作redis的方法提取出一個介面,分別對應單機版和叢集版建立兩個實現類。
介面定義:
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);
}
單機版實現類: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;
}
}
叢集版實現類:
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);
}
}
配置: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.25.153"></constructor-arg>
<constructor-arg name="port" value="6379"></constructor-arg>
</bean>
<bean id="jedisClientPool" class="com.demo.jedis.JedisClientPool"/>
</beans>
叢集版:<!-- 叢集版的配置 -->
<bean id="jedisCluster" class="redis.clients.jedis.JedisCluster">
<constructor-arg>
<set>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.00.000"></constructor-arg>
<constructor-arg name="port" value="7001"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.00.000"></constructor-arg>
<constructor-arg name="port" value="7002"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.00.000"></constructor-arg>
<constructor-arg name="port" value="7003"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.00.000"></constructor-arg>
<constructor-arg name="port" value="7004"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.00.000"></constructor-arg>
<constructor-arg name="port" value="7005"></constructor-arg>
</bean>
<bean class="redis.clients.jedis.HostAndPort">
<constructor-arg name="host" value="192.168.00.000"></constructor-arg>
<constructor-arg name="port" value="7006"></constructor-arg>
</bean>
</set>
</constructor-arg>
</bean>
<bean id="jedisClientCluster" class="com.demo.jedis.JedisClientCluster"/>
程式碼測試:
@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("a", "100");
String result = jedisClient.get("a");
System.out.println(result);
}
程式碼實現:
@Override
public List<TbContent> getContentList(long cid) {
//查詢快取
try {
String json = jedisClient.hget(DEMO_KEY, cid + "");
//判斷json是否為空
if (StringUtils.isNotBlank(json)) {
//把json轉換成list
List<Demo> list = JsonUtils.jsonToList(json, Demo.class);
return list;
}
} catch (Exception e) {
e.printStackTrace();
}
//根據cid查詢內容列表
TbDemoExample example = new TbDemoExample();
//設定查詢條件
Criteria criteria = example.createCriteria();
criteria.andDemoIdEqualTo(cid);
//執行查詢
List<Demo> list = demoMapper.selectByExample(example);
//向快取中新增資料
try {
jedisClient.hset(DEMO_KEY, cid + "", JsonUtils.objectToJson(list));
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
快取同步:
對內容資訊做增刪改操作後只需要把對應快取刪除即可。
可以根據cid刪除。
@Override
public E3Result addDemo(Demo demo) {
//補全屬性
demo.setCreated(new Date());
demo.setUpdated(new Date());
//插入資料
demoMapper.insert(content);
//快取同步
jedisClient.hdel(DEMO_KEY, content.getCategoryId().toString());
return E3Result.ok();
}
這裡用到的JsonUtils的工具類JsonUtils
import java.util.List;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
*
*/
public class JsonUtils {
// 定義jackson物件
private static final ObjectMapper MAPPER = new ObjectMapper();
/**
* 將物件轉換成json字串。
* <p>Title: pojoToJson</p>
* <p>Description: </p>
* @param data
* @return
*/
public static String objectToJson(Object data) {
try {
String string = MAPPER.writeValueAsString(data);
return string;
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return null;
}
/**
* 將json結果集轉化為物件
*
* @param jsonData json資料
* @param clazz 物件中的object型別
* @return
*/
public static <T> T jsonToPojo(String jsonData, Class<T> beanType) {
try {
T t = MAPPER.readValue(jsonData, beanType);
return t;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 將json資料轉換成pojo物件list
* <p>Title: jsonToList</p>
* <p>Description: </p>
* @param jsonData
* @param beanType
* @return
*/
public static <T>List<T> jsonToList(String jsonData, Class<T> beanType) {
JavaType javaType = MAPPER.getTypeFactory().constructParametricType(List.class, beanType);
try {
List<T> list = MAPPER.readValue(jsonData, javaType);
return list;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}