亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

SpringBoot Redis緩存數(shù)據(jù)實(shí)現(xiàn)解析

 更新時(shí)間:2020年01月17日 09:09:39   作者:JAVA程序猿成長(zhǎng)之路  
這篇文章主要介紹了SpringBoot Redis緩存數(shù)據(jù)實(shí)現(xiàn)解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

這篇文章主要介紹了SpringBoot Redis緩存數(shù)據(jù)實(shí)現(xiàn)解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

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引入

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

在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<String, String> redisTemplate() {
RedisTemplate<String, String> redisTemplate = new RedisTemplate<String, String>();

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 List<User> 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()")
@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);
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 一款不可錯(cuò)過(guò)的Java應(yīng)用診斷利器Arthas

    一款不可錯(cuò)過(guò)的Java應(yīng)用診斷利器Arthas

    Arthas是一款由阿里巴巴開(kāi)源的Java應(yīng)用診斷利器,它可以幫助開(kāi)發(fā)人員在運(yùn)行時(shí)對(duì)Java應(yīng)用進(jìn)行調(diào)試和診斷,解決線上問(wèn)題,本文將簡(jiǎn)單的描述一下該工具的用法和常用命令,以勾起大家對(duì)此工具應(yīng)用的興趣
    2023-06-06
  • Java通過(guò)socket客戶端保持連接服務(wù)端實(shí)現(xiàn)代碼

    Java通過(guò)socket客戶端保持連接服務(wù)端實(shí)現(xiàn)代碼

    這篇文章主要介紹了Java通過(guò)socket客戶端保持連接服務(wù)端實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Java多線程中的ThreadPoolExecutor使用解析

    Java多線程中的ThreadPoolExecutor使用解析

    這篇文章主要介紹了Java多線程中的ThreadPoolExecutor使用解析,作為線程池的緩沖,當(dāng)新增線程超過(guò)maximumPoolSize時(shí),會(huì)將新增線程暫時(shí)存放到該隊(duì)列中,需要的朋友可以參考下
    2023-12-12
  • java復(fù)制文件和java移動(dòng)文件的示例分享

    java復(fù)制文件和java移動(dòng)文件的示例分享

    本文主要介紹了java將文件夾下面的所有的jar文件拷貝到指定的文件夾下面的方法,需要的朋友可以參考下
    2014-02-02
  • Java?從json提取數(shù)組并轉(zhuǎn)換為list的操作方法

    Java?從json提取數(shù)組并轉(zhuǎn)換為list的操作方法

    這篇文章主要介紹了Java?從json提取出數(shù)組并轉(zhuǎn)換為list,使用getJSONArray()獲取到j(luò)sonarray后,再將jsonArray轉(zhuǎn)換為字符串,最后將字符串解析為L(zhǎng)ist列表,本文通過(guò)實(shí)例代碼給大家詳細(xì)講解,需要的朋友可以參考下
    2022-10-10
  • HashMap和Hashtable的詳細(xì)比較

    HashMap和Hashtable的詳細(xì)比較

    這篇文章主要介紹了HashMap和Hashtable的詳細(xì)比較的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • SpringBoot+BootStrap多文件上傳到本地實(shí)例

    SpringBoot+BootStrap多文件上傳到本地實(shí)例

    這篇文章主要介紹了SpringBoot+BootStrap多文件上傳到本地實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 最流行的java后臺(tái)框架spring quartz定時(shí)任務(wù)

    最流行的java后臺(tái)框架spring quartz定時(shí)任務(wù)

    近日項(xiàng)目開(kāi)發(fā)中需要執(zhí)行一些定時(shí)任務(wù),比如需要在每天凌晨時(shí)候,分析一次前一天的日志信息,借此機(jī)會(huì)整理了一下定時(shí)任務(wù)的幾種實(shí)現(xiàn)方式,由于項(xiàng)目采用spring框架,所以我都將結(jié)合spring框架來(lái)介紹
    2015-12-12
  • 使用Spring Security集成手機(jī)驗(yàn)證碼登錄功能實(shí)現(xiàn)

    使用Spring Security集成手機(jī)驗(yàn)證碼登錄功能實(shí)現(xiàn)

    本文詳細(xì)介紹了如何利用SpringSecurity來(lái)實(shí)現(xiàn)手機(jī)驗(yàn)證碼的注冊(cè)和登錄功能,在登錄過(guò)程中,同樣需通過(guò)驗(yàn)證碼進(jìn)行驗(yàn)證,文章還提供了相關(guān)的代碼實(shí)現(xiàn)
    2024-10-10
  • 使用Maven多模塊——打包指定模塊

    使用Maven多模塊——打包指定模塊

    這篇文章主要介紹了使用Maven多模塊——打包指定模塊問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-09-09

最新評(píng)論