spring boot redis (二,整合自動緩存)

項目中整合redis

前期安裝好了redis典格,我們就可以準備整合啦

1.添加依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-redis</artifactId>
</dependency>

2.添加配置文件 RedisConfig.java

package com.daiwei.config;
import java.lang.reflect.Method;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
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.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport{

    @Value("${spring.redis.host}")
    private String host;
    @Value("${spring.redis.port}")
    private int port;
    @Value("${spring.redis.timeout}")
    private int timeout;
    
    //自定義緩存key生成策略
    @Bean
    public KeyGenerator keyGenerator() {
        return new KeyGenerator() {
            @Override
            public Object generate(Object target, Method method, Object... params) {
                StringBuilder sb = new StringBuilder();
                String[] value = new String[1];
                // sb.append(target.getClass().getName());
                // sb.append(":" + method.getName());
                Cacheable cacheable = method.getAnnotation(Cacheable.class);
                if (cacheable != null) {
                    value = cacheable.value();
                }
                CachePut cachePut = method.getAnnotation(CachePut.class);
                if (cachePut != null) {
                    value = cachePut.value();
                }
                CacheEvict cacheEvict = method.getAnnotation(CacheEvict.class);
                if (cacheEvict != null) {
                    value = cacheEvict.value();
                }
                sb.append(value[0]);
                for (Object obj : params) {
                    sb.append(":" + obj.toString());
                }
                return sb.toString();
            }
        };
    }
    
    
    //緩存管理器
    @Bean 
    public CacheManager cacheManager(@SuppressWarnings("rawtypes") RedisTemplate redisTemplate) {
        RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);
        //設置緩存過期時間 
        cacheManager.setDefaultExpiration(10000);
        return cacheManager;
    }
    @Bean
    public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory){
        StringRedisTemplate template = new StringRedisTemplate(factory);
        setSerializer(template);//設置序列化工具
        template.afterPropertiesSet();
        return template;
    }
    
    //序列化不限制long
     private void setSerializer(StringRedisTemplate template){
            @SuppressWarnings({ "rawtypes", "unchecked" })
            Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
            ObjectMapper om = new ObjectMapper();
            om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
            om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
            jackson2JsonRedisSerializer.setObjectMapper(om);
            template.setValueSerializer(jackson2JsonRedisSerializer);
     }
}

3.修改項目啟動類砾肺,增加注解@EnableCaching防嗡,開啟緩存功能变汪,如下

package com.daiwei;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.context.web.SpringBootServletInitializer;
import org.springframework.cache.annotation.EnableCaching;


@SpringBootApplication
@EnableCaching
public class StartApplication extends SpringBootServletInitializer{
    
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(StartApplication.class);
    }
     
    public static void main(String[] args) {
        SpringApplication.run(StartApplication.class, args);
    }
}

4.開始測試

    @Cacheable(value="testallCache")
    @RequestMapping("/getUser/{id}")
    public Map<String,Object> getUser(@PathVariable long id) {
        Map<String,Object> user=BeanKit.describe(userService.findById(id), "roles");
        System.out.println("若下面沒出現“無緩存的時候調用”字樣且能打印出數據表示測試成功");  
        return user;
    }

輸入地址訪問


11.png

12.png

看后臺的日志可以看出 第一次訪問的時候 是調用hibernate 去訪問數據庫的裙盾,然后再刷一遍,是不是發(fā)現秒開番官,而且控制臺也沒有日志記錄,說明這次的請求訪問的是緩存徘熔,而不是去訪問數據庫了,小小的測試成功了讶凉,同時你可以根據可視化工具去看下redis里面的儲存情況:


13.png

具體的實際操作請看下一章山孔。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市饱须,隨后出現的幾起案子台谊,更是在濱河造成了極大的恐慌,老刑警劉巖锅铅,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異盐须,居然都是意外死亡,警方通過查閱死者的電腦和手機阶冈,發(fā)現死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門塑径,熙熙樓的掌柜王于貴愁眉苦臉地迎上來女坑,“玉大人统舀,你說我怎么就攤上這事∮颍” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵瓮钥,是天一觀的道長。 經常有香客問我骏庸,道長毛甲,這世上最難降的妖魔是什么具被? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮七咧,結果婚禮上,老公的妹妹穿的比我還像新娘艾栋。我一直安慰自己,他們只是感情好蝗砾,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布携冤。 她就那樣靜靜地躺著悼粮,像睡著了一般曾棕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上翘地,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音衙耕,去河邊找鬼。 笑死粤咪,一個胖子當著我的面吹牛,可吹牛的內容都是我干的寥枝。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼囊拜,長吁一口氣:“原來是場噩夢啊……” “哼比搭!你這毒婦竟也來了冠跷?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤抄囚,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后幔托,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡重挑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年棠涮,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片严肪。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖劲室,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤充蓝,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站谓苟,受9級特大地震影響,放射性物質發(fā)生泄漏涝焙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一赤兴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧桶良,春花似錦、人聲如沸陨帆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽疲牵。三九已至,卻和暖如春纲爸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背缩焦。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留袁滥,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓揩徊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親塑荒。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內容

  • Spring Boot 參考指南 介紹 轉載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,748評論 6 342
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現炊豪,斷路器,智...
    卡卡羅2017閱讀 134,601評論 18 139
  • 這一年以6月為中點缺虐,已經確確實實過去一半了,反觀自己的上半年高氮,忙忙碌碌慧妄,卻沒有靜下心來好好讀幾本書剪芍。 去年的這個時...
    九月星辰閱讀 196評論 2 5
  • Spring的事物是如何運作的? 首先帶著問題看源碼: Spring的事物是通過哪些原理實現的? Spring的事...
    凱凱雄雄閱讀 3,135評論 4 21
  • “喝一口,來窖铡,快疗锐,張嘴喝一口费彼,再多喝幾口滑臊」坎”她笑呵呵的端著已要溢出頭號中碗的玉米糊糊兒親切地喂到正坐在飯桌邊上等飯...
    以琳閱讀 246評論 0 0