摘要:否則,這個(gè)方法就會(huì)被調(diào)用,返回值會(huì)放到緩存之中表名應(yīng)該將方法的返回值放到緩存中。
Redis是一種特殊類型的數(shù)據(jù)庫,他被稱之為key-value存儲(chǔ)
本文覆蓋緩存和存儲(chǔ)兩方面進(jìn)行說明,使用的是Spring 4.0和Java配置方式
代碼地址下載地址:https://github.com/zoeminghong/springmvc-javaconfig
存儲(chǔ) Redis的配置package springmvc.rootconfig; import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.EnableCaching; 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.RedisConnectionFactory; import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; @Configuration @EnableCaching public class CachingConfig { /** * 連接Redis * * @return */ @Bean public JedisConnectionFactory redisConnectionFactory() { JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(); // host地址 jedisConnectionFactory.setHostName("10.10.13.12"); // 端口號(hào) jedisConnectionFactory.setPort(6379); jedisConnectionFactory.afterPropertiesSet(); return jedisConnectionFactory; } /** * RedisTemplate配置 * * @param redisCF * @return */ @Bean public RedisTemplateredisTemplate( RedisConnectionFactory redisCF) { RedisTemplate redisTemplate = new RedisTemplate (); redisTemplate.setConnectionFactory(redisCF); redisTemplate.afterPropertiesSet(); return redisTemplate; } }
Redis連接工廠
JedisConnectionFactory
JredisConnectionFactory
LettuceConnectionFactory
SrpConnectionFactory
建議自行測(cè)試選用合適自己的連接工廠
如果使用的是localhost和默認(rèn)端口,則這兩項(xiàng)的配置可以省略
RedisTemplate
RedisTemplate
StringRedisTemplate
RedisTemplate能夠讓我們持久化各種類型的key和value,并不僅限于字節(jié)數(shù)組
StringRedisTemplate擴(kuò)展了RedisTemplate,只能使用String類型
StringRedisTemplate有一個(gè)接受RedisConnectionFactory的構(gòu)造器,因此沒有必要在構(gòu)建后在調(diào)用setConnectionFactory()
使用RedisTemplateAPI
方法 | 子API接口 | 描述 |
---|---|---|
opsForValue() | ValueOperations |
描述具有簡(jiǎn)單值的條目 |
opsForList() | ListOperations |
操作具有l(wèi)ist值的條目 |
opsForSet() | SetOperations |
操作具有set值的條目 |
opsForZSet() | ZSetOperations |
操作具有ZSet值(排序的set)的條目 |
opsForHash() | HashOperations |
操作具有hash值的條目 |
boundValueOps(K) | BoundValueOperations |
以綁定指定key的方式,操作具有簡(jiǎn)單值的條目 |
boundListOps(K) | BoundListOperations |
以綁定指定key的方式,操作具有l(wèi)ist的條目 |
boundSetOps(K) | BoundSetOperations |
以綁定指定key的方式,操作具有set的條目 |
boundZSet(K) | BoundZSetOperations |
以綁定指定key的方式,操作具有ZSet(排序的set)的條目 |
boundHashOps(K) | BoundHashOperations |
以綁定指定key的方式,操作具有hash值的條目 |
操作
package springmvc.web; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import springmvc.bean.Order; import springmvc.orders.db.OrderRepository; @Controller public class HomeController { @Autowired RedisTemplateredisTemplate; @RequestMapping(value = { "/", "index" }, method = RequestMethod.GET) public String index() { redisTemplate.opsForValue().set("gege", 11); System.out.print(redisTemplate.opsForValue().get("gege")); return "index"; } }
//創(chuàng)建List條目,key是cart BoundListOperationsKey和Value序列化cart=redisTemplate.boundListOps("cart"); //刪除最后的一條數(shù)據(jù) cart.rightPop(); //在最后,添加一條數(shù)據(jù) cart.rightPush("我笑了");
如果要使用到JavaBean,需要其實(shí)現(xiàn)Serializable接口,將其序列化
或者使用Spring Data Redis提供的序列化器
GenericToStringSerializer:使用Spring轉(zhuǎn)換服務(wù)進(jìn)行序列化
JacksonJsonRedisSerializer:使用Jackson1,將對(duì)象序列化為JSON
Jackson2JsonRedisSerializer:使用Jackson2,將對(duì)象序列化為JSON
JdkSerializationRedisSerializer:使用Java序列化
OxmSerializer:使用Spring O/X映射的編排器和解排器實(shí)現(xiàn)序列化,用于XML序列化
StringRedisSerializer:序列化String類型的key和value
redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer緩存 配置(Order.class));
在配置文件中追加如下代碼
/** * 緩存管理器 * @param redisTemplate * @return */ @Bean public CacheManager cacheManager(RedisTemplate使用注解進(jìn)行緩存數(shù)據(jù)redisTemplate) { RedisCacheManager cacheManager =new RedisCacheManager(redisTemplate); //設(shè)置過期時(shí)間 cacheManager.setDefaultExpiration(10); return cacheManager; }
注解 | 描述 |
---|---|
@Cacheable | 表明Spring在調(diào)用方法之前,首先應(yīng)該在緩存中查找方法的返回值,如果這個(gè)值能夠找到,就會(huì)返回緩存的值。否則,這個(gè)方法就會(huì)被調(diào)用,返回值會(huì)放到緩存之中 |
@CachePut | 表名Spring應(yīng)該將方法的返回值放到緩存中。在方法的調(diào)用前并不會(huì)檢查緩存,方法始終都會(huì)被調(diào)用 |
@CacheEvict | 表明Spring應(yīng)該在緩存中清除一個(gè)或多個(gè)條目 |
@Caching | 這是一個(gè)分組的注解,能夠同時(shí)應(yīng)用多個(gè)其他的緩存注解 |
@Cacheable與@CachePut的一些共有屬性
屬性 | 類型 | 描述 |
---|---|---|
value | String[] | 要使用的緩存名稱 |
condition | String | SpEL表達(dá)式,如果得到的值是false的話,不會(huì)將緩存應(yīng)用到方法調(diào)用上 |
key | String | SpEL表達(dá)式,用來計(jì)算自定義的緩存key |
unless | String | SpEL表達(dá)式,如果得到的值是true的話,返回值不會(huì)放到緩存之中 |
package springmvc.orders.db; import java.util.List; import org.springframework.cache.annotation.Cacheable; import springmvc.bean.Order; public interface OrderOperations { @Cacheable("spittle") ListfindOrdersByType(String t); }
緩存切面會(huì)攔截調(diào)用并在緩存中查找之前以名spittle存儲(chǔ)的返回值。緩存的key是傳遞到findOrdersByType()方法中的t參數(shù)。如果按照這個(gè)key能夠找到值的話,就會(huì)返回找到的值,方法就不會(huì)被調(diào)用。如果沒有找到值的話,那么就會(huì)調(diào)用這個(gè)方法
當(dāng)在接口方法添加注解后,被注解的方法,在所有的實(shí)現(xiàn)繼承中都會(huì)有相同的緩存規(guī)則
@CacheEvict
@CacheEvict("spittle") void remove(String Id);
@CacheEvict能夠應(yīng)用在返回值為void的方法上, 而@Cacheable和@CachePut需要非void的返回值,他將會(huì)作為放在緩存中的條目
屬性 | 類型 | 描述 |
---|---|---|
value | String[] | 要使用的緩存名稱 |
key | String | SpEL表達(dá)式,用來計(jì)算自定義的緩存key |
condition | String | SpEL表達(dá)式,如果得到的值是false的話,緩存不會(huì)應(yīng)用到方法調(diào)用上 |
allEntries | boolean | 如果為true的話,特定緩存的所有條目都會(huì)被移除 |
beforeInvocation | boolean | 如果為true的話,在方法調(diào)用之前移除條目,如果為false的話,在方法成功調(diào)用之后在移除條目 |
更多內(nèi)容可以關(guān)注微信公眾號(hào),或者訪問AppZone網(wǎng)站
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/64907.html
摘要:引入了新的環(huán)境和概要信息,是一種更揭秘與實(shí)戰(zhàn)六消息隊(duì)列篇掘金本文,講解如何集成,實(shí)現(xiàn)消息隊(duì)列。博客地址揭秘與實(shí)戰(zhàn)二數(shù)據(jù)緩存篇掘金本文,講解如何集成,實(shí)現(xiàn)緩存。 Spring Boot 揭秘與實(shí)戰(zhàn)(九) 應(yīng)用監(jiān)控篇 - HTTP 健康監(jiān)控 - 掘金Health 信息是從 ApplicationContext 中所有的 HealthIndicator 的 Bean 中收集的, Spring...
摘要:作為微服務(wù)的基礎(chǔ)設(shè)施之一,背靠強(qiáng)大的生態(tài)社區(qū),支撐技術(shù)體系。微服務(wù)實(shí)踐為系列講座,專題直播節(jié),時(shí)長(zhǎng)高達(dá)小時(shí),包括目前最流行技術(shù),深入源碼分析,授人以漁的方式,幫助初學(xué)者深入淺出地掌握,為高階從業(yè)人員拋磚引玉。 簡(jiǎn)介 目前業(yè)界最流行的微服務(wù)架構(gòu)正在或者已被各種規(guī)模的互聯(lián)網(wǎng)公司廣泛接受和認(rèn)可,業(yè)已成為互聯(lián)網(wǎng)開發(fā)人員必備技術(shù)。無論是互聯(lián)網(wǎng)、云計(jì)算還是大數(shù)據(jù),Java平臺(tái)已成為全棧的生態(tài)體系,...
閱讀 1123·2021-09-22 16:04
閱讀 1502·2019-08-30 15:43
閱讀 1110·2019-08-29 14:01
閱讀 3446·2019-08-26 12:19
閱讀 3361·2019-08-26 12:15
閱讀 1454·2019-08-26 12:13
閱讀 3273·2019-08-23 17:00
閱讀 1491·2019-08-23 15:38