SpringBoot Redis緩存數(shù)據(jù)實現(xiàn)解析
這篇文章主要介紹了SpringBoot Redis緩存數(shù)據(jù)實現(xiàn)解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
1.啟用對緩存的支持
spring對緩存的支持有兩種方式:
a.注解驅(qū)動的緩存
b.XML聲明的緩存
本文主要介紹純Java配置的緩存,那么必須在配置類上添加@EnableCaching,這樣的話就能啟動注解驅(qū)動的緩存。
2.使用Redis緩存
緩存的條目不過是一個鍵值對(Key-Value),其中key描述了產(chǎn)生value的操作和參數(shù),因此會很自然的想到Redis。
Redis可以用來為srping緩存抽象機(jī)制緩存條目,Spring-Data-Redis提供了RedisCacheManager,這是CacheManager的一個實現(xiàn)。RedisCacheManager會與Redis服務(wù)器協(xié)作,通過RedisTemplate將緩存條目儲存到Redis中。
為了使用RedisCacheManager,我們需要RedisTmeplate Bean配置以及RedisConnectionFactory實現(xiàn)類(JedisConnectionFactory Bean配置)。
3.配置將緩存條目存儲在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 //沒有@EnableCaching這個注解的話,代碼不會報錯,就是內(nèi)容不會放入redis中 @EnableCaching public class RedisConfig { /** * 緩存管理器,不管用什么的緩存,都必須有緩存管理器 */ @Bean public CacheManager cacheManager() { RedisCacheManager redisCacheManager = new RedisCacheManager(redisTemplate()); /* * 設(shè)置緩存保留的時間,默認(rèn)是永久保存 */ redisCacheManager.setDefaultExpiration(60); return redisCacheManager; } @Bean public JedisConnectionFactory jedisConnectionFactory() { JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(); jedisConnectionFactory.afterPropertiesSet(); return jedisConnectionFactory; } /** * redis默認(rèn)對象序列化是通過jdk來序列化的,這里面不用默認(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中啟用緩存時,會創(chuàng)建一個切面,它觸發(fā)
一個或更多的spring的緩存注解。
spring提供了四個注解來聲明緩存規(guī)則
5.填充緩存
@Cacheable和CachePut都可以填充緩存,他們之間還是確有差異的。
@Cacheable和CachePut共同的屬性
6.自定義key
@Cacheable和CachePut都有一個名為key的屬性,這個屬性能夠替代默認(rèn)的key,t它是通過SpEl(Spring El表達(dá)式)表達(dá)式計算得到的。具體到我們的業(yè)務(wù)場景 save(User user),我們需要將key設(shè)置保存為User對象中的id,我們通過mysql數(shù)據(jù)庫自動生成id,此時參數(shù)中的User對象還沒有id.幸好有SpEl。
7.在UserService中添加如下方法。
/** * 查詢?nèi)? * * @Cacheable,先在緩存中找,有則直接返回,不去調(diào)用方法,沒有則調(diào)用方法,將結(jié)果放入緩存中 * * * 默認(rèn)的key是基于方法參數(shù)來確定的,queryList()這個方法沒有參數(shù),所以需要生成key的策略 */ //@Cacheable(value="findAll",keyGenerator="wiselyKeyGenerator") public List<User> queryList() { return userDao.findAll(); } /** * @Cachable會條件性的出發(fā)對方法的調(diào)用,這個取決于緩存中是不是已經(jīng)有所需要的值。對于 * 所注解的方法,@CachePut采用一種更為直接的流程。帶有@CachePut注解的方法始終都會調(diào)用, * 而的返回值也會放入到緩存中。 * @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); } /** * 函數(shù)功能:根據(jù)id查詢 * * 當(dāng)get被調(diào)用時,緩存切面會攔截調(diào)用并在緩存中查找之前以名findOne存儲的返回值。緩存的key是 * 傳遞到get()方法的id參數(shù),這個參數(shù)還必須是String類型。如果按照這個key能 * 夠找到值得話就返回找到的值,方法不會在被調(diào)用。如果沒有找到值的話,那就會調(diào)用這個方法 * 并將返回值放到緩存之中。 * * 默認(rèn)是以參數(shù)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("從數(shù)據(jù)查詢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("從數(shù)據(jù)刪除id為:{}的對象",id); userDao.delete(id); }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java通過socket客戶端保持連接服務(wù)端實現(xiàn)代碼
這篇文章主要介紹了Java通過socket客戶端保持連接服務(wù)端實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-11-11Java多線程中的ThreadPoolExecutor使用解析
這篇文章主要介紹了Java多線程中的ThreadPoolExecutor使用解析,作為線程池的緩沖,當(dāng)新增線程超過maximumPoolSize時,會將新增線程暫時存放到該隊列中,需要的朋友可以參考下2023-12-12Java?從json提取數(shù)組并轉(zhuǎn)換為list的操作方法
這篇文章主要介紹了Java?從json提取出數(shù)組并轉(zhuǎn)換為list,使用getJSONArray()獲取到j(luò)sonarray后,再將jsonArray轉(zhuǎn)換為字符串,最后將字符串解析為List列表,本文通過實例代碼給大家詳細(xì)講解,需要的朋友可以參考下2022-10-10SpringBoot+BootStrap多文件上傳到本地實例
這篇文章主要介紹了SpringBoot+BootStrap多文件上傳到本地實例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03最流行的java后臺框架spring quartz定時任務(wù)
近日項目開發(fā)中需要執(zhí)行一些定時任務(wù),比如需要在每天凌晨時候,分析一次前一天的日志信息,借此機(jī)會整理了一下定時任務(wù)的幾種實現(xiàn)方式,由于項目采用spring框架,所以我都將結(jié)合spring框架來介紹2015-12-12使用Spring Security集成手機(jī)驗證碼登錄功能實現(xiàn)
本文詳細(xì)介紹了如何利用SpringSecurity來實現(xiàn)手機(jī)驗證碼的注冊和登錄功能,在登錄過程中,同樣需通過驗證碼進(jìn)行驗證,文章還提供了相關(guān)的代碼實現(xiàn)2024-10-10