真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

SpringBoot中怎么利用Redis緩存數(shù)據(jù)

本篇文章為大家展示了SpringBoot中怎么利用redis緩存數(shù)據(jù),內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

成都創(chuàng)新互聯(lián)公司主要從事成都網(wǎng)站制作、做網(wǎng)站、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)金湖,十年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18980820575

1.啟用對(duì)緩存的支持

spring對(duì)緩存的支持有兩種方式:

a.注解驅(qū)動(dòng)的緩存

b.XML聲明的緩存

本文主要介紹純Java配置的緩存,那么必須在配置類上添加@EnableCaching,這樣的話就能啟動(dòng)注解驅(qū)動(dòng)的緩存。

2.使用Redis緩存

緩存的條目不過是一個(gè)鍵值對(duì)(Key-Value),其中key描述了產(chǎn)生value的操作和參數(shù),因此會(huì)很自然的想到Redis。

Redis可以用來為srping緩存抽象機(jī)制緩存條目,Spring-Data-Redis提供了RedisCacheManager,這是CacheManager的一個(gè)實(shí)現(xiàn)。RedisCacheManager會(huì)與Redis服務(wù)器協(xié)作,通過RedisTemplate將緩存條目?jī)?chǔ)存到Redis中。

為了使用RedisCacheManager,我們需要RedisTmeplate Bean配置以及RedisConnectionFactory實(shí)現(xiàn)類(JedisConnectionFactory Bean配置)。

3.配置將緩存條目存儲(chǔ)在Redis服務(wù)器的緩存管理器。

前提需要在pom.xml引入

org.springframework.bootspring-boot-starter-data-redis

在application.properties中配置redis連接相關(guān)參數(shù)

#配置redis#在RedisProperties.class有redis的默認(rèn)配置,默認(rèn)host為localhost,默認(rèn)端口為6379spring.redis.host=127.0.0.1spring.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//沒有@EnableCaching這個(gè)注解的話,代碼不會(huì)報(bào)錯(cuò),就是內(nèi)容不會(huì)放入redis中@EnableCaching public class RedisConfig {/*** 緩存管理器,不管用什么的緩存,都必須有緩存管理器*/@Beanpublic CacheManager cacheManager() {RedisCacheManager redisCacheManager = new RedisCacheManager(redisTemplate());/** 設(shè)置緩存保留的時(shí)間,默認(rèn)是永久保存*/redisCacheManager.setDefaultExpiration(60);return redisCacheManager;}@Beanpublic JedisConnectionFactory jedisConnectionFactory() {JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();jedisConnectionFactory.afterPropertiesSet();return jedisConnectionFactory;}   /*** redis默認(rèn)對(duì)象序列化是通過jdk來序列化的,這里面不用默認(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è)注解來聲明緩存規(guī)則

5.填充緩存

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

@Cacheable和CachePut共同的屬性

6.自定義key

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

7.在UserService中添加如下方法。

/*** 查詢?nèi)? * @Cacheable,先在緩存中找,有則直接返回,不去調(diào)用方法,沒有則調(diào)用方法,將結(jié)果放入緩存中* * * 默認(rèn)的key是基于方法參數(shù)來確定的,queryList()這個(gè)方法沒有參數(shù),所以需要生成key的策略*///@Cacheable(value="findAll",keyGenerator="wiselyKeyGenerator")public List queryList() {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()")@Transactionalpublic 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)用。如果沒有找到值的話,那就會(huì)調(diào)用這個(gè)方法* 并將返回值放到緩存之中。* * 默認(rèn)是以參數(shù)id的值作為緩存中的key的* * 沒有添加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()")@Transactionalpublic void delete(int id) {log.info("從數(shù)據(jù)刪除id為:{}的對(duì)象",id);userDao.delete(id);}

上述內(nèi)容就是SpringBoot中怎么利用Redis緩存數(shù)據(jù),你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


當(dāng)前名稱:SpringBoot中怎么利用Redis緩存數(shù)據(jù)
轉(zhuǎn)載來于:http://weahome.cn/article/gdihcj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部