redis入門——Spring整合篇

redis入門——Spring整合篇

redis整合分析

由於集羣須要的服務器至少是6臺,使用Redis集羣的成本很高,因此若是沒有業務要求,不會使用Redis集羣。
而使用Redis集羣的公司,爲了節省成本,通常只會在生產環境使用集羣,而開發環境使用Redis單機版,因此咱們在整合項目的時候,單機版和集羣版都要有。java

咱們能夠建立一個接口,再編寫單機版和集羣版的實現類,使用spring進行管理,在部署時,使用哪一種Redis,就切換那種實現類。node

編寫RedisUtils接口

package com.pc.redis;

/**
 * Redis工具接口
 * 
 * @author Switch
 * @data 2017年2月11日
 * @version V1.0
 */
public interface RedisUtils {
    /**
     * 保存
     * 
     * @param key
     *            鍵
     * @param value
     *            zhi
     */
    public void set(String key, String value);

    /**
     * 保存並設置生存時間
     * 
     * @param key
     *            鍵
     * @param value
     *            值
     * @param seconds
     *            時間,秒s爲單位
     */
    public void set(String key, String value, Integer seconds);

    /**
     * 根據key查詢
     * 
     * @param key
     *            鍵
     * @return 值
     */
    public String get(String key);

    /**
     * 刪除
     * 
     * @param key
     *            鍵
     */
    public void del(String key);

    /**
     * 根據key設置生存時間
     * 
     * @param key
     *            鍵
     * @param seconds
     *            時間,秒s爲單位
     */
    public void expire(String key, Integer seconds);

    /**
     * value加一<br/>
     * 注意key必須是整型
     * 
     * @param key
     *            鍵
     * @return 加一後的結果
     */
    public Long incr(String key);
}

編寫RedisUtils實現類

單機版

package com.pc.redis.impl;

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

import com.pc.redis.RedisUtils;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

/**
 * Redis鏈接池工具類
 * 
 * @author Switch
 * @data 2017年2月11日
 * @version V1.0
 */
public class RedisPool implements RedisUtils {
    @Autowired
    private JedisPool jedisPool;

    @Override
    public void set(String key, String value) {
        Jedis jedis = this.getJedis();
        jedis.set(key, value);
        this.releaseJedis(jedis);
    }

    @Override
    public void set(String key, String value, Integer seconds) {
        Jedis jedis = this.getJedis();
        jedis.set(key, value);
        jedis.expire(key, seconds);
        this.releaseJedis(jedis);
    }

    @Override
    public String get(String key) {
        Jedis jedis = this.getJedis();
        String result = jedis.get(key);
        this.releaseJedis(jedis);
        return result;
    }

    @Override
    public void del(String key) {
        Jedis jedis = this.getJedis();
        jedis.del(key);
        this.releaseJedis(jedis);
    }

    @Override
    public void expire(String key, Integer seconds) {
        Jedis jedis = this.getJedis();
        jedis.expire(key, seconds);
        this.releaseJedis(jedis);
    }

    @Override
    public Long incr(String key) {
        Jedis jedis = this.getJedis();
        Long count = jedis.incr(key);
        this.releaseJedis(jedis);
        return count;
    }

    /**
     * 獲取Jedis鏈接
     * 
     * @return Jedis鏈接
     */
    public Jedis getJedis() {
        return this.jedisPool.getResource();
    }

    /**
     * 釋放Jedis鏈接
     * 
     * @param jedis
     *            jedis鏈接
     */
    public void releaseJedis(Jedis jedis) {
        jedis.close();
    }
}

 

集羣版

package com.pc.redis.impl;

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

import com.pc.redis.RedisUtils;

import redis.clients.jedis.JedisCluster;

/**
 * Redis集羣工具類
 * 
 * @author Switch
 * @data 2017年2月11日
 * @version V1.0
 */
public class RedisCluster implements RedisUtils {
    @Autowired
    private JedisCluster jedisCluster;

    @Override
    public void set(String key, String value) {
        this.jedisCluster.set(key, value);
    }

    @Override
    public void set(String key, String value, Integer seconds) {
        this.jedisCluster.set(key, value);
        this.jedisCluster.expire(key, seconds);
    }

    @Override
    public String get(String key) {
        return this.jedisCluster.get(key);
    }

    @Override
    public void del(String key) {
        this.jedisCluster.del(key);
    }

    @Override
    public void expire(String key, Integer seconds) {
        this.jedisCluster.expire(key, seconds);
    }

    @Override
    public Long incr(String key) {
        return this.jedisCluster.incr(key);
    }

    /**
     * 獲取JedisCluster對象<br/>
     * 能夠直接使用它來進行redis操做
     * 
     * @return JedisCluster對象
     */
    public JedisCluster getJedisCluster() {
        return jedisCluster;
    }
}

配置Spring管理Redis

建立applicationContext-redis.xmlredis

通常來書,spring配置文件分類以後,會將下面的配置放在applicationContext-dao.xml配置文件中。spring

<!-- 配置 讀取properties文件 -->
<context:property-placeholder location="classpath:resource/*.properties" />
  • 1
  • 2

注意:使用的時候開啓一個配置便可。數據庫

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
        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">

    <!-- 兩種方案:使用jedis鏈接池(單機版)和jedis集羣 -->
    <!-- 通常生產環境使用集羣,開發環境使用單機版 -->
    <!-- 使用哪一種,能夠將另外一種註釋掉 -->
    <!-- 注意:若是在注入工具類的時候是按類型注入的話,那麼不使用的工具類必須註釋掉-->

    <!-- 單機版 -->
    <!-- 配置jedis鏈接池 -->
    <bean class="redis.clients.jedis.JedisPool">
        <constructor-arg name="host" value="${redis.host}" />
        <constructor-arg name="port" value="${redis.port}" />
    </bean>

    <!-- 配置單機版工具類 -->
    <bean class="com.pc.redis.impl.RedisPool" />


    <!-- 集羣版 -->
    <!-- 配置jedis集羣 -->
    <bean class="redis.clients.jedis.JedisCluster">
        <constructor-arg name="nodes">
            <set>
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg name="host" value="${cluster.host1}" />
                    <constructor-arg name="port" value="${cluster.port1}" />
                </bean>
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg name="host" value="${cluster.host2}" />
                    <constructor-arg name="port" value="${cluster.port2}" />
                </bean>
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg name="host" value="${cluster.host3}" />
                    <constructor-arg name="port" value="${cluster.port3}" />
                </bean>
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg name="host" value="${cluster.host4}" />
                    <constructor-arg name="port" value="${cluster.port4}" />
                </bean>
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg name="host" value="${cluster.host5}" />
                    <constructor-arg name="port" value="${cluster.port5}" />
                </bean>
                <bean class="redis.clients.jedis.HostAndPort">
                    <constructor-arg name="host" value="${cluster.host6}" />
                    <constructor-arg name="port" value="${cluster.port6}" />
                </bean>
            </set>
        </constructor-arg>
    </bean>

    <!-- 配置集羣版工具類 -->
    <bean class="com.pc.redis.impl.RedisCluster" />
</beans>

添加redis.properties

#redis單機版信息
redis.host=192.168.37.131
redis.port=6379


#redis集羣版信息
cluster.host1=192.168.37.131
cluster.port1=7001

cluster.host2=192.168.37.131
cluster.port2=7002

cluster.host3=192.168.37.131
cluster.port3=7003

cluster.host4=192.168.37.131
cluster.port4=7004

cluster.host5=192.168.37.131
cluster.port5=7005

cluster.host6=192.168.37.131
cluster.port6=7006

redis用做緩存

添加緩存的步驟

  1. 從緩存中命中
  2. 沒有命中執行原有邏輯,從數據庫MySQL中查詢
  3. 把數據保存在redis

添加緩存的原則

不可以影響正常的業務邏輯,能夠進行try/catchjson

package com.pc.test;

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

import com.pc.redis.RedisUtils;

/**
 * 緩存測試類
 * 
 * @author Switch
 * @data 2017年2月11日
 * @version V1.0
 */
public class RedisCacheTest {
    // 注入Redis工具類
    @Autowired
    private RedisUtils redisUtils;

    @Override
    public String queryByRedis() {
        String key = "redis";
        // 1.從緩存中命中
        try {
            String redisJson = redisUtils.get(key);
            if (StringUtils.isNotBlank(redisJson)) {
                return redisJson;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        // 2.若是沒用命中,執行原有邏輯,從數據庫中獲取數據
        // 未實現,從數據庫中獲取數據
        String json = getFromDB();

        // 3.將查詢出來的結果加入緩存
        try {
            this.redisUtils.set(key, json);
            this.redisUtils.expire(key, 60 * 60 * 24);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return json;
    }
}
相關文章
相關標籤/搜索