1. 程式人生 > >專案中使用redis單機版和叢集版

專案中使用redis單機版和叢集版

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;
    }
    
}


下一篇:solr搜尋引擎安裝配置及專案中的使用方法