1. 程式人生 > 其它 >怎麼把資料存入快取redis裡_SpringBoot+Redis輕鬆實現資料快取

怎麼把資料存入快取redis裡_SpringBoot+Redis輕鬆實現資料快取

技術標籤:怎麼把資料存入快取redis裡

1.為什麼需要快取

為什麼需要快取,我相信搞開發的都能回答出來,無非就是為了降低資料庫壓力,節約資源,提升系統性能。而事實上也確實是,歸根結底就是降壓,高併發,高效能。不過,大廠裡那一套高併發的東西不在本篇講述。下面我們就spring boot 整合redis ,實現資料快取的demo。

2.搭建Springboot工程

搭建spring boot工程,此處就不多贅述了,大家可以自己去官網下載然後匯入,或者直接用idea建立。引入的核心依賴如下,另外還有其他的如mybatis,thymeleaf等。

org.springframework.boot  spring-boot-starter-weborg.springframework.boot  spring-boot-starter-data-redis  2.3.0.RELEASE

3.Redis配置類

@[email protected] class RedisConfig extends CachingConfigurerSupport {    @Autowired    private LettuceConnectionFactory lettuceConnectionFactory;    @Bean    public RedisTemplate redisTemplate(LettuceConnectionFactory lettuceConnectionFactory) {        RedisTemplate redisTemplate = new RedisTemplate<>();        redisTemplate.setConnectionFactory(lettuceConnectionFactory);        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);        ObjectMapper objectMapper = new ObjectMapper();        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);        // key採用String的序列化方式        redisTemplate.setKeySerializer(stringRedisSerializer);        // hash的key也採用String的序列化方式        redisTemplate.setHashKeySerializer(stringRedisSerializer);        // value序列化方式採用jackson        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);        // hash的value序列化方式採用jackson        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);        redisTemplate.afterPropertiesSet();        return redisTemplate;    }}

4.Redis工具類

//大家可以根據需要再自行新增方法@Componentpublic final class RedisUtil {    @Autowired    private RedisTemplate redisTemplate;    /**     * 設定快取:無過期時間     * @param key     * @param value     * @return     */    public boolean set(String key, Object value) {        try {            redisTemplate.opsForValue().set(key,value);            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }    /**     * 設定快取:有過期時間,單位:秒     * @param key     * @param value     * @param time     * @return     */    public boolean set(String key, Object value, long time) {        try {            if(time > 0) {                redisTemplate.opsForValue().set(key,value,time, TimeUnit.SECONDS);            }else {                throw new RuntimeException("時間必須大於0");            }            return true;        }catch (Exception e) {            e.printStackTrace();            return false;        }    }    /**     * 普通快取獲取     * @param key 鍵     * @return 值     */    public Object get(String key) {        return key == null ? null : redisTemplate.opsForValue().get(key);    }    /**     * 判斷key是否存在     * @param key 鍵     * @return true 存在 false不存在     */    public boolean hasKey(String key) {        try {            return redisTemplate.hasKey(key);        } catch (Exception e) {            e.printStackTrace();            return false;        }    }    /**     * 指定key快取失效時間     * @param key 鍵     * @param time 時間(秒)     * @return     */    public boolean expire(String key, long time) {        try {            if (time > 0) {                redisTemplate.expire(key, time, TimeUnit.SECONDS);            }else {                throw new RuntimeException("時間必須大於0");            }            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }    /**     * 根據key 獲取過期時間     * @param key 鍵 不能為null     * @return 時間(秒) 返回0代表為永久有效     */    public long getExpire(String key) {        return redisTemplate.getExpire(key, TimeUnit.SECONDS);    }    /**     * 將list放入快取     * @param key 鍵     * @param value 值     * @return     */    public boolean lSet(String key, List value) {        try {            redisTemplate.opsForList().rightPushAll(key, value);            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }    /**     * 將list放入快取     * @param key 鍵     * @param value 值     * @param time 時間(秒)     * @return     */    public boolean lSet(String key, List value, long time) {        try {            redisTemplate.opsForList().rightPushAll(key, value);            if (time > 0) {                expire(key, time);            }            return true;        } catch (Exception e) {            e.printStackTrace();            return false;        }    }}

5.測試

@Testvoid contextLoads() {  if(redisTemplate.opsForValue().get("list") != null) {    LOGGER.info("走快取了=============");    List list = (List) redisTemplate.opsForValue().get("list");    System.out.println(list);  }else {    LOGGER.info("走資料庫了=============");    List list = aaaServerService.findList();    redisTemplate.opsForValue().set("list",list);  }}

我們第一次執行這個測試類,控制檯列印如下圖1,再執行一次,控制檯列印如下圖2。可以看到查詢的資料從快取中取了。我們還可以連線下redis,直接 get list,得到的結果如圖3,資料的確已經存入快取!至此,spring boot整合redis就大功告成了!

b9d8b497a162adcecabb403e949a192f.png

圖1

6b2c0ffa015f85314fe15d0131bcbbde.png

圖2

217306846241477a40aa38b380d498bb.png

圖3

小結

本篇文章建單的介紹了spring boot如何整合redis,相對來說,沒有什麼難懂的地方。對於簡單的業務層面來說,這個已經足夠了,更深層次的還需要大家不斷的學習探索。好了,今天的文章就到這裡了,喜歡的小夥伴來個關注唄[呲牙]