91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringBoot Redis緩存數據的示例分析

發布時間:2021-05-07 10:33:05 來源:億速云 閱讀:195 作者:小新 欄目:編程語言

這篇文章主要介紹了SpringBoot Redis緩存數據的示例分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

springboot是什么

springboot一種全新的編程規范,其設計目的是用來簡化新Spring應用的初始搭建以及開發過程,SpringBoot也是一個服務于框架的框架,服務范圍是簡化配置文件。

1.啟用對緩存的支持

spring對緩存的支持有兩種方式:

a.注解驅動的緩存

b.XML聲明的緩存

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

2.使用Redis緩存

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

Redis可以用來為srping緩存抽象機制緩存條目,Spring-Data-Redis提供了RedisCacheManager,這是CacheManager的一個實現。RedisCacheManager會與Redis服務器協作,通過RedisTemplate將緩存條目儲存到Redis中。

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

3.配置將緩存條目存儲在Redis服務器的緩存管理器。

前提需要在pom.xml引入

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

在application.properties中配置redis連接相關參數

#配置redis
#在RedisProperties.class有redis的默認配置,默認host為localhost,默認端口為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
//沒有@EnableCaching這個注解的話,代碼不會報錯,就是內容不會放入redis中

@EnableCaching 

public class RedisConfig {
/**
* 緩存管理器,不管用什么的緩存,都必須有緩存管理器
*/
@Bean
public CacheManager cacheManager() {
RedisCacheManager redisCacheManager = new RedisCacheManager(redisTemplate());
/*
* 設置緩存保留的時間,默認是永久保存
*/
redisCacheManager.setDefaultExpiration(60);
return redisCacheManager;
}


@Bean
public JedisConnectionFactory jedisConnectionFactory() {
JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();
jedisConnectionFactory.afterPropertiesSet();
return jedisConnectionFactory;

}

   /**
* redis默認對象序列化是通過jdk來序列化的,這里面不用默認序列化方式,用JackJson進行序列化
* 
* 設置key的類型為String類型
* 
* @return
*/
@Bean
@SuppressWarnings({ "rawtypes", "unchecked" })
public RedisTemplate<String, String> redisTemplate() {
RedisTemplate<String, String> redisTemplate = new RedisTemplate<String, String>();

redisTemplate.setConnectionFactory(jedisConnectionFactory());

     // 使用Jackson2JsonRedisSerialize 替換默認序列化
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);
// 設置value的序列化規則和 key的序列化規則
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.afterPropertiesSet();
return redisTemplate;

}

 /**
   * 生產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的緩存抽象在很大程度上是圍繞切面構建的,在sprng中啟用緩存時,會創建一個切面,它觸發

一個或更多的spring的緩存注解。

spring提供了四個注解來聲明緩存規則

SpringBoot Redis緩存數據的示例分析

SpringBoot Redis緩存數據的示例分析

5.填充緩存

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

SpringBoot Redis緩存數據的示例分析

@Cacheable和CachePut共同的屬性

SpringBoot Redis緩存數據的示例分析

6.自定義key

@Cacheable和CachePut都有一個名為key的屬性,這個屬性能夠替代默認的key,t它是通過SpEl(Spring El表達式)表達式計算得到的。具體到我們的業務場景 save(User user),我們需要將key設置保存為User對象中的id,我們通過mysql數據庫自動生成id,此時參數中的User對象還沒有id.幸好有SpEl。

SpringBoot Redis緩存數據的示例分析

SpringBoot Redis緩存數據的示例分析

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

/**
* 查詢全部
* 
* @Cacheable,先在緩存中找,有則直接返回,不去調用方法,沒有則調用方法,將結果放入緩存中
* 
* 
* 默認的key是基于方法參數來確定的,queryList()這個方法沒有參數,所以需要生成key的策略
*/
//@Cacheable(value="findAll",keyGenerator="wiselyKeyGenerator")
public List<User> queryList() {
return userDao.findAll();
}

   /**
* @Cachable會條件性的出發對方法的調用,這個取決于緩存中是不是已經有所需要的值。對于
* 所注解的方法,@CachePut采用一種更為直接的流程。帶有@CachePut注解的方法始終都會調用,
* 而的返回值也會放入到緩存中。
* @CachePut先將對象保存到db中,返回的對象User中的id作為緩存中的key
* result能夠得到返回的User
* @param user
*/
@CachePut(value="save",key="#result.id.toString()")
@Transactional
public User save(User user) {
log.info("添加對象");
return userDao.save(user);

}

  /**
* 函數功能:根據id查詢
* 
* 當get被調用時,緩存切面會攔截調用并在緩存中查找之前以名findOne存儲的返回值。緩存的key是
* 傳遞到get()方法的id參數,這個參數還必須是String類型。如果按照這個key能
* 夠找到值得話就返回找到的值,方法不會在被調用。如果沒有找到值的話,那就會調用這個方法
* 并將返回值放到緩存之中。
* 
* 默認是以參數id的值作為緩存中的key的
* 
* 沒有添加key="#id.toString()" 可能為報java.lang.Integer cannot be cast to java.lang.String
* 因為key的類型為String類型
*/
@Cacheable(value="findOne",key="#id.toString()")
public User get(Integer id) {
log.info("從數據查詢id為:{}的對象",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("從數據刪除id為:{}的對象",id);
userDao.delete(id);
}

感謝你能夠認真閱讀完這篇文章,希望小編分享的“SpringBoot Redis緩存數據的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

南通市| 寿宁县| 岳西县| 云梦县| 平谷区| 广宁县| 左云县| 南漳县| 盐池县| 安福县| 开阳县| 铁力市| 江西省| 祁门县| 马鞍山市| 民丰县| 固安县| 长汀县| 吉林省| 德安县| 繁昌县| 双鸭山市| 安远县| 襄垣县| 唐山市| 龙里县| 高密市| 富蕴县| 巴东县| 凤城市| 隆昌县| 乐安县| 富平县| 崇明县| 绥阳县| 淮安市| 新龙县| 江山市| 青神县| 大关县| 平利县|