十年網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
這篇文章主要介紹了SpringBoot redis緩存數(shù)據(jù)的示例分析,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
在廣陵等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站設(shè)計(jì)、做網(wǎng)站 網(wǎng)站設(shè)計(jì)制作按需制作,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站建設(shè),網(wǎng)絡(luò)營(yíng)銷推廣,成都外貿(mào)網(wǎng)站建設(shè),廣陵網(wǎng)站建設(shè)費(fèi)用合理。
springboot一種全新的編程規(guī)范,其設(shè)計(jì)目的是用來(lái)簡(jiǎn)化新Spring應(yīng)用的初始搭建以及開(kāi)發(fā)過(guò)程,SpringBoot也是一個(gè)服務(wù)于框架的框架,服務(wù)范圍是簡(jiǎn)化配置文件。
1.啟用對(duì)緩存的支持
spring對(duì)緩存的支持有兩種方式:
a.注解驅(qū)動(dòng)的緩存
b.XML聲明的緩存
本文主要介紹純Java配置的緩存,那么必須在配置類上添加@EnableCaching,這樣的話就能啟動(dòng)注解驅(qū)動(dòng)的緩存。
2.使用Redis緩存
緩存的條目不過(guò)是一個(gè)鍵值對(duì)(Key-Value),其中key描述了產(chǎn)生value的操作和參數(shù),因此會(huì)很自然的想到Redis。
Redis可以用來(lái)為srping緩存抽象機(jī)制緩存條目,Spring-Data-Redis提供了RedisCacheManager,這是CacheManager的一個(gè)實(shí)現(xiàn)。RedisCacheManager會(huì)與Redis服務(wù)器協(xié)作,通過(guò)RedisTemplate將緩存條目?jī)?chǔ)存到Redis中。
為了使用RedisCacheManager,我們需要RedisTmeplate Bean配置以及RedisConnectionFactory實(shí)現(xiàn)類(JedisConnectionFactory Bean配置)。
3.配置將緩存條目存儲(chǔ)在Redis服務(wù)器的緩存管理器。
前提需要在pom.xml引入
org.springframework.boot spring-boot-starter-data-redis
在application.properties中配置redis連接相關(guān)參數(shù)
#配置redis #在RedisProperties.class有redis的默認(rèn)配置,默認(rèn)host為localhost,默認(rèn)端口為6379 spring.redis.host=127.0.0.1 spring.redis.port=6379
配置緩存管理器
package com.niugang;
import java.lang.reflect.Method;
import org.springframework.cache.CacheManager;
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.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
@Configuration
//沒(méi)有@EnableCaching這個(gè)注解的話,代碼不會(huì)報(bào)錯(cuò),就是內(nèi)容不會(huì)放入redis中
@EnableCaching
public class RedisConfig {
/**
* 緩存管理器,不管用什么的緩存,都必須有緩存管理器
*/
@Bean
public CacheManager cacheManager() {
RedisCacheManager redisCacheManager = new RedisCacheManager(redisTemplate());
/*
* 設(shè)置緩存保留的時(shí)間,默認(rèn)是永久保存
*/
redisCacheManager.setDefaultExpiration(60);
return redisCacheManager;
}
@Bean
public JedisConnectionFactory jedisConnectionFactory() {
JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
jedisConnectionFactory.afterPropertiesSet();
return jedisConnectionFactory;
}
/**
* redis默認(rèn)對(duì)象序列化是通過(guò)jdk來(lái)序列化的,這里面不用默認(rèn)序列化方式,用JackJson進(jìn)行序列化
*
* 設(shè)置key的類型為String類型
*
* @return
*/
@Bean
@SuppressWarnings({ "rawtypes", "unchecked" })
public RedisTemplate redisTemplate() {
RedisTemplate redisTemplate = new RedisTemplate();
redisTemplate.setConnectionFactory(jedisConnectionFactory());
// 使用Jackson2JsonRedisSerialize 替換默認(rèn)序列化
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
// 設(shè)置value的序列化規(guī)則和 key的序列化規(guī)則
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
/**
* 生產(chǎn)key的策略
* @return
*/
@Bean
public KeyGenerator wiselyKeyGenerator(){
return new KeyGenerator() {
@Override
public Object generate(Object target, Method method, Object... params) {
StringBuilder sb = new StringBuilder();
sb.append(target.getClass().getName());
sb.append(method.getName());
for (Object obj : params) {
sb.append(obj.toString());
}
return sb.toString();
}
};
}
} 4.為方法添加注解以支持緩存
spring的緩存抽象在很大程度上是圍繞切面構(gòu)建的,在sprng中啟用緩存時(shí),會(huì)創(chuàng)建一個(gè)切面,它觸發(fā)
一個(gè)或更多的spring的緩存注解。
spring提供了四個(gè)注解來(lái)聲明緩存規(guī)則


5.填充緩存
@Cacheable和CachePut都可以填充緩存,他們之間還是確有差異的。

@Cacheable和CachePut共同的屬性

6.自定義key
@Cacheable和CachePut都有一個(gè)名為key的屬性,這個(gè)屬性能夠替代默認(rèn)的key,t它是通過(guò)SpEl(Spring El表達(dá)式)表達(dá)式計(jì)算得到的。具體到我們的業(yè)務(wù)場(chǎng)景 save(User user),我們需要將key設(shè)置保存為User對(duì)象中的id,我們通過(guò)MySQL數(shù)據(jù)庫(kù)自動(dòng)生成id,此時(shí)參數(shù)中的User對(duì)象還沒(méi)有id.幸好有SpEl。


7.在UserService中添加如下方法。
/** * 查詢?nèi)? * * @Cacheable,先在緩存中找,有則直接返回,不去調(diào)用方法,沒(méi)有則調(diào)用方法,將結(jié)果放入緩存中 * * * 默認(rèn)的key是基于方法參數(shù)來(lái)確定的,queryList()這個(gè)方法沒(méi)有參數(shù),所以需要生成key的策略 */ //@Cacheable(value="findAll",keyGenerator="wiselyKeyGenerator") public ListqueryList() { return userDao.findAll(); } /** * @Cachable會(huì)條件性的出發(fā)對(duì)方法的調(diào)用,這個(gè)取決于緩存中是不是已經(jīng)有所需要的值。對(duì)于 * 所注解的方法,@CachePut采用一種更為直接的流程。帶有@CachePut注解的方法始終都會(huì)調(diào)用, * 而的返回值也會(huì)放入到緩存中。 * @CachePut先將對(duì)象保存到db中,返回的對(duì)象User中的id作為緩存中的key * result能夠得到返回的User * @param user */ @CachePut(value="save",key="#result.id.toString()") @Transactional public User save(User user) { log.info("添加對(duì)象"); return userDao.save(user); } /** * 函數(shù)功能:根據(jù)id查詢 * * 當(dāng)get被調(diào)用時(shí),緩存切面會(huì)攔截調(diào)用并在緩存中查找之前以名findOne存儲(chǔ)的返回值。緩存的key是 * 傳遞到get()方法的id參數(shù),這個(gè)參數(shù)還必須是String類型。如果按照這個(gè)key能 * 夠找到值得話就返回找到的值,方法不會(huì)在被調(diào)用。如果沒(méi)有找到值的話,那就會(huì)調(diào)用這個(gè)方法 * 并將返回值放到緩存之中。 * * 默認(rèn)是以參數(shù)id的值作為緩存中的key的 * * 沒(méi)有添加key="#id.toString()" 可能為報(bào)java.lang.Integer cannot be cast to java.lang.String * 因?yàn)閗ey的類型為String類型 */ @Cacheable(value="findOne",key="#id.toString()") public User get(Integer id) { log.info("從數(shù)據(jù)查詢id為:{}的對(duì)象",id); return userDao.findOne(id); } /** * 刪除 * @CacheEvict移除條目,可以用在返回值為void的方法上,但是@Cacheable,@CachePut不能用在返回值為void的方法上 * * @param id */ @CacheEvict(value="save",key="#id.toString()") @Transactional public void delete(int id) { log.info("從數(shù)據(jù)刪除id為:{}的對(duì)象",id); userDao.delete(id); }
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“SpringBoot Redis緩存數(shù)據(jù)的示例分析”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!