Spring boot下配置使用redis--註解形式,springredis--

來源:互聯網
上載者:User

Spring boot下配置使用redis--註解形式,springredis--

繼上一篇的template編碼方式使用redis
編碼形式配置(一)
編碼形式使用(二)

經過深入學習發現註解形式的更好用一些,省去一些繁瑣的代碼,使得你代碼看起來更優雅
安裝redis服務端請看編碼形式配置(一)

1. pom.xml

添加jar包支援,使用springboot內建的redis啟動器

        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-data-redis</artifactId>        </dependency>        
2. Redis設定檔

這裡新加入了緩衝管理器,來管理redis.
Spring 3.1 引入了基於注釋(annotation)的緩衝(cache)技術,它不是一個具體的緩衝實現方案(例如EHCache 或者 OSCache、Redis等),而是一個對緩衝使用的抽象,通過在既有代碼中添加少量它定義的各種 annotation,即能夠達到緩衝方法的返回對象的效果。
RedisConfig.java

import java.io.Serializable;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Value;import org.springframework.cache.CacheManager;import org.springframework.cache.annotation.CachingConfigurerSupport;import org.springframework.cache.annotation.EnableCaching;import org.springframework.cache.interceptor.KeyGenerator;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.data.redis.cache.RedisCacheManager;import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;import org.springframework.data.redis.core.HashOperations;import org.springframework.data.redis.core.ListOperations;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.core.SetOperations;import org.springframework.data.redis.core.ValueOperations;import org.springframework.data.redis.core.ZSetOperations;import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer;import org.springframework.data.redis.serializer.StringRedisSerializer;import java.lang.reflect.Method;@Slf4j@Configuration@EnableCaching//啟用緩衝,這個註解很重要;//繼承CachingConfigurerSupport,為了自訂產生KEY的策略。可以不繼承。public class RedisConfig extends CachingConfigurerSupport{//因為生產環境和開發環境使用不同的啟動資源檔,所以使用了@Profile,用來指定使用的啟動資源檔    @Configuration    @Profile(value={"dev"})//如果你不需要的話可以刪掉    static class LocalConfiguration {        //從application.properties中獲得以下參數        @Value("${redis.host}")        private String host;        @Value("${redis.port}")        private Integer port;        @Value("${redis.password}")        private String password;        /**         * 緩衝管理器.         * @param redisTemplate         * @return         */        @Bean        public CacheManager cacheManager(RedisTemplate<?,?> redisTemplate) {           CacheManager cacheManager = new RedisCacheManager(redisTemplate);           return cacheManager;        }        @Bean        public RedisTemplate<Serializable, Serializable> redisTemplate(                JedisConnectionFactory redisConnectionFactory) {            log.info("------------------------------------------");            log.info("-----------------local redis--------------");            log.info("------------------------------------------");            RedisTemplate<Serializable, Serializable> redisTemplate = new RedisTemplate<Serializable, Serializable>();            //key序列化方式;(不然會出現亂碼;),但是如果方法上有Long等非String類型的話,會報類型轉換錯誤;            //所以在沒有自己定義key建置原則的時候,以下這個代碼建議不要這麼寫,可以不配置或者自己實現 ObjectRedisSerializer            //或者JdkSerializationRedisSerializer序列化方式;            redisTemplate.setKeySerializer(new StringRedisSerializer());            redisTemplate.setHashKeySerializer(new StringRedisSerializer());            redisTemplate                    .setValueSerializer(new JdkSerializationRedisSerializer());            redisTemplate                    .setHashValueSerializer(new JdkSerializationRedisSerializer());            //以上4條配置可以不用            redisTemplate.setConnectionFactory(redisConnectionFactory);            return redisTemplate;        }        @Bean        public JedisConnectionFactory redisConnectionFactory() {            JedisConnectionFactory redisConnectionFactory = new JedisConnectionFactory();            redisConnectionFactory.setHostName(host);            redisConnectionFactory.setPort(port);            redisConnectionFactory.setPassword(password);            return redisConnectionFactory;        }    }    /**     * 自訂key.     * 此方法將會根據類名+方法名+所有參數的值產生唯一的一個key     */    @Override    public KeyGenerator keyGenerator() {        log.info("RedisCacheConfig.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());              }              log.info("keyGenerator=" + sb.toString());              return sb.toString();           }       };    }}

@Profile(value={“dev”})代表開發環境用的配置
@Slf4j 是lombok中的註解,不用的可以刪掉

3. 使用案例
import java.io.Serializable;import java.util.List;import javax.annotation.Resource;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.core.ValueOperations;import org.springframework.stereotype.Service;import org.springframework.transaction.annotation.Transactional;import com.github.pagehelper.PageHelper;@Slf4j@Transactional@Servicepublic class UserServiceImpl implements IUserService {    @Autowired    private IUserDao userDao;    // 因為設定檔繼承了CachingConfigurerSupport,所以沒有指定key的話就是用預設KEY建置原則產生,我們這裡指定了KEY    @Cacheable(value = "userInfo", key = "'findUser' + #id", condition = "#id%2==0")    // value屬性指定Cache名稱    // 使用key屬性自訂key    // condition屬性指定發生的條件(如上樣本表示只有當user的id為偶數時才會進行緩衝)    @Override    public UserDto findProperty(String id) {        UserDto user = userDao.findUser(id);        return user;    }    /**     *      * @CachePut也可以聲明一個方法支援緩衝功能。      * 與@Cacheable不同的是使用@CachePut標註的方法在執行前不會去檢查緩衝中是否存在之前執行過的結果,     * 而是每次都會執行該方法,並將執行結果以索引值對的形式存入指定的緩衝中。     *     */    @CachePut("users")    // 每次都會執行方法,並將結果存入指定的緩衝中    @Override    public List<UserDto> mybatisQueryAll() {        return userDao.selectAll();    }    @Override    // @CacheEvict(value="propertyInfo",allEntries=true) 清空全部    // 刪除指定緩衝    @CacheEvict(value = "propertyInfo", key = "'findUser' + #id")    // 其他屬性    // allEntries是boolean類型,表示是否需要清除緩衝中的所有元素。預設為false,表示不需要。當指定了allEntries為true時,Spring Cache將忽略指定的key。    // 清除操作預設是在對應方法成功執行之後觸發的,即方法如果因為拋出異常而未能成功返回時也不會觸發清除操作。    // 使用beforeInvocation可以改變觸發清除操作的時間,當我們指定該屬性值為true時,Spring會在調用該方法之前清除緩衝中的指定元素。    public String cacheEvict(String id) {        log.info("刪除緩衝" + id);        return null;    }    /**     * @Caching註解可以讓我們在一個方法或者類上同時指定多個Spring Cache相關的註解。     * 其擁有三個屬性:cacheable、put和evict,分別用於指定@Cacheable、@CachePut和@CacheEvict。     */    @Caching(cacheable = @Cacheable("users"), evict = { @CacheEvict("cache2"),    @CacheEvict(value = "cache3", allEntries = true) })    public UserDto find(Integer id) {        return null;    }}

註解詳細說明請參考註解說明
是不是感覺註解的形式代碼很優雅
有任何問題,請留言^^

   
2
0
查看評論

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.