1. 程式人生 > >Spring整合Redis快取,提高查詢效率

Spring整合Redis快取,提高查詢效率

整合redis快取後可以將資料庫的查詢介面,序列化到redis中,key就是註解中的引數,例如@Cacheable(“findUsers”): 存在redis中的key就是findUsers。快取了這個結果之後再次請求這個方法就不會去資料庫中查,而是從redis快取中讀取資料,這樣就減少了跟資料庫之間的互動。然後修改、刪除、增加操作就會清除快取,保持資料的一致性,同時有極大的提高了程式執行的效率

1.引入依賴包檔案

        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-redis</artifactId>
            <version>1.7.4.RELEASE</version>
        </dependency>


        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.9.0</version>
        </dependency>

2.建立redis.properties檔案

#============================#
#==== Redis settings ====#
#============================#
#redis 伺服器 IP
redis.host=127.0.0.1

#redis 伺服器埠
redis.port=6380

#redis 密碼
redis.pass=123456

#redis 支援16個數據庫(相當於不同使用者)可以使不同的應用程式資料彼此分開同時又儲存在相同的例項上
redis.dbIndex=0

#redis 快取資料過期時間單位秒
redis.expiration=3000

#控制一個 pool 最多有多少個狀態為 idle 的jedis例項
redis.maxIdle=300

#控制一個 pool 可分配多少個jedis例項
redis.maxActive=600

#當borrow一個jedis例項時,最大的等待時間,如果超過等待時間,則直接丟擲JedisConnectionException;
redis.maxWait=1000

#在borrow一個jedis例項時,是否提前進行alidate操作;如果為true,則得到的jedis例項均是可用的;
redis.testOnBorrow=true

3.建立redis-context檔案

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:aop="http://www.springframework.org/schema/aop" xmlns:bean="http://www.springframework.org/schema/util"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
                http://www.springframework.org/schema/context
                 http://www.springframework.org/schema/context/spring-context-3.2.xsd
                http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
    <!-- Root Context: defines shared resources visible to all other web components -->
    <!--<context:property-placeholder location="classpath:application.properties"/>-->


    <context:property-placeholder location="classpath:redis.properties"/>



    <!-- redis config start -->
    <!-- 配置JedisPoolConfig例項 -->
    <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <property name="maxIdle" value="${redis.maxIdle}" />
        <property name="maxTotal" value="${redis.maxActive}" />
        <property name="maxWaitMillis" value="${redis.maxWait}" />
        <property name="testOnBorrow" value="${redis.testOnBorrow}" />
    </bean>

    <!-- 配置JedisConnectionFactory -->
    <bean id="jedisConnectionFactory"
          class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
        <property name="hostName" value="${redis.host}" />
        <property name="port" value="${redis.port}" />
        <property name="database" value="${redis.dbIndex}" />
        <property name="password" value="${redis.pass}" />
        <property name="poolConfig" ref="poolConfig" />
    </bean>

    <!-- 配置RedisTemplate -->
    <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
        <property name="connectionFactory" ref="jedisConnectionFactory" />
    </bean>

    <!-- 配置RedisCacheManager -->
    <bean id="redisCacheManager" class="org.springframework.data.redis.cache.RedisCacheManager">
        <constructor-arg name="redisOperations" ref="redisTemplate" />
        <property name="defaultExpiration" value="${redis.expiration}" />
    </bean>

    <!-- 配置RedisCacheConfig -->
    <bean id="redisCacheConfig" class="com.lepu.redis.RedisCacheConfig">
        <constructor-arg ref="jedisConnectionFactory" />
        <constructor-arg ref="redisTemplate" />
        <constructor-arg ref="redisCacheManager" />
    </bean>
    <!-- redis config end -->

</beans>

4.redis快取配置類,會在redis-context配置檔案中註冊這個bean。

/**
 * @Author: chuan.bai
 * @Description
 * 該配置類繼承自 org.springframework.cache.annotation.CachingConfigurerSupport
 * 並實現 org.springframework.cache.annotation.CachingConfigurer 的方法。
 * 通俗一點,該類告訴 spring 當前使用的快取服務為 redis 並自定義了快取 key 生成的規則
 * @Date: Created on 14:45 27/01/2018
 * @Modified By:
 */

/**
 * 通過spring管理redis快取配置
 */
@Configuration
@EnableCaching
public class RedisCacheConfig extends CachingConfigurerSupport {
    protected final static Logger log = LoggerFactory.getLogger(RedisCacheConfig.class);

    private volatile JedisConnectionFactory mJedisConnectionFactory;
    private volatile RedisTemplate<String, String> mRedisTemplate;
    private volatile RedisCacheManager mRedisCacheManager;

    public RedisCacheConfig() {
        super();
    }

    public RedisCacheConfig(JedisConnectionFactory mJedisConnectionFactory, RedisTemplate<String, String> mRedisTemplate, RedisCacheManager mRedisCacheManager) {
        super();
        this.mJedisConnectionFactory = mJedisConnectionFactory;
        this.mRedisTemplate = mRedisTemplate;
        this.mRedisCacheManager = mRedisCacheManager;
    }

    public JedisConnectionFactory redisConnectionFactory() {
        return mJedisConnectionFactory;
    }

    public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory cf) {
        return mRedisTemplate;
    }

    public CacheManager cacheManager(RedisTemplate<?, ?> redisTemplate) {
        return mRedisCacheManager;
    }

    @Bean
    public KeyGenerator keyGenerator() {
        return new KeyGenerator() {
            @Override
            public Object generate(Object o, Method method, Object... objects) {
                StringBuilder sb = new StringBuilder();
                sb.append(o.getClass().getName());
                sb.append(method.getName());
                for (Object obj : objects) {
                    sb.append(obj.toString());
                }
                return sb.toString();
            }
        };
    }
}

在需要快取的方法上面新增相應註釋

@Cacheable  spring 會在其被呼叫後將返回值快取起來,以保證下次利用同樣的引數來執行該方法時可以直接從快取中獲取結果,而不需要再次執行該方法。

@CachePut  標註的方法在執行前不會去檢查快取中是否存在之前執行過的結果,而是每次都會執行該方法,並將執行結果以鍵值對的形式存入指定的快取中。

@CacheEvict 用來標註在需要清除快取元素的方法或類上的。

例如:

@Cacheable(value = "getAllUser")  :標註該方法查詢的結果進入快取,再次訪問時直接讀取快取中的資料
@CacheEvict(value= {"getAllUser","getUserById","findUsers"},allEntries=true)//清空快取,allEntries變量表示所有物件的快取都清除
一般在對資料做修改嗎,刪除的方法中,會插入該註解,防止redis資料和mysql不同步