摘要:否則,這個方法就會被調用,返回值會放到緩存之中表名應該將方法的返回值放到緩存中。
Redis是一種特殊類型的數據庫,他被稱之為key-value存儲
本文覆蓋緩存和存儲兩方面進行說明,使用的是Spring 4.0和Java配置方式
代碼地址下載地址:https://github.com/zoeminghong/springmvc-javaconfig
存儲 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"); // 端口號 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
建議自行測試選用合適自己的連接工廠
如果使用的是localhost和默認端口,則這兩項的配置可以省略
RedisTemplate
RedisTemplate
StringRedisTemplate
RedisTemplate能夠讓我們持久化各種類型的key和value,并不僅限于字節數組
StringRedisTemplate擴展了RedisTemplate,只能使用String類型
StringRedisTemplate有一個接受RedisConnectionFactory的構造器,因此沒有必要在構建后在調用setConnectionFactory()
使用RedisTemplateAPI
方法 | 子API接口 | 描述 |
---|---|---|
opsForValue() | ValueOperations |
描述具有簡單值的條目 |
opsForList() | ListOperations |
操作具有list值的條目 |
opsForSet() | SetOperations |
操作具有set值的條目 |
opsForZSet() | ZSetOperations |
操作具有ZSet值(排序的set)的條目 |
opsForHash() | HashOperations |
操作具有hash值的條目 |
boundValueOps(K) | BoundValueOperations |
以綁定指定key的方式,操作具有簡單值的條目 |
boundListOps(K) | BoundListOperations |
以綁定指定key的方式,操作具有list的條目 |
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"; } }
//創建List條目,key是cart BoundListOperationsKey和Value序列化cart=redisTemplate.boundListOps("cart"); //刪除最后的一條數據 cart.rightPop(); //在最后,添加一條數據 cart.rightPush("我笑了");
如果要使用到JavaBean,需要其實現Serializable接口,將其序列化
或者使用Spring Data Redis提供的序列化器
GenericToStringSerializer:使用Spring轉換服務進行序列化
JacksonJsonRedisSerializer:使用Jackson1,將對象序列化為JSON
Jackson2JsonRedisSerializer:使用Jackson2,將對象序列化為JSON
JdkSerializationRedisSerializer:使用Java序列化
OxmSerializer:使用Spring O/X映射的編排器和解排器實現序列化,用于XML序列化
StringRedisSerializer:序列化String類型的key和value
redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer緩存 配置(Order.class));
在配置文件中追加如下代碼
/** * 緩存管理器 * @param redisTemplate * @return */ @Bean public CacheManager cacheManager(RedisTemplate使用注解進行緩存數據redisTemplate) { RedisCacheManager cacheManager =new RedisCacheManager(redisTemplate); //設置過期時間 cacheManager.setDefaultExpiration(10); return cacheManager; }
注解 | 描述 |
---|---|
@Cacheable | 表明Spring在調用方法之前,首先應該在緩存中查找方法的返回值,如果這個值能夠找到,就會返回緩存的值。否則,這個方法就會被調用,返回值會放到緩存之中 |
@CachePut | 表名Spring應該將方法的返回值放到緩存中。在方法的調用前并不會檢查緩存,方法始終都會被調用 |
@CacheEvict | 表明Spring應該在緩存中清除一個或多個條目 |
@Caching | 這是一個分組的注解,能夠同時應用多個其他的緩存注解 |
@Cacheable與@CachePut的一些共有屬性
屬性 | 類型 | 描述 |
---|---|---|
value | String[] | 要使用的緩存名稱 |
condition | String | SpEL表達式,如果得到的值是false的話,不會將緩存應用到方法調用上 |
key | String | SpEL表達式,用來計算自定義的緩存key |
unless | String | SpEL表達式,如果得到的值是true的話,返回值不會放到緩存之中 |
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); }
緩存切面會攔截調用并在緩存中查找之前以名spittle存儲的返回值。緩存的key是傳遞到findOrdersByType()方法中的t參數。如果按照這個key能夠找到值的話,就會返回找到的值,方法就不會被調用。如果沒有找到值的話,那么就會調用這個方法
當在接口方法添加注解后,被注解的方法,在所有的實現繼承中都會有相同的緩存規則
@CacheEvict
@CacheEvict("spittle") void remove(String Id);
@CacheEvict能夠應用在返回值為void的方法上, 而@Cacheable和@CachePut需要非void的返回值,他將會作為放在緩存中的條目
屬性 | 類型 | 描述 |
---|---|---|
value | String[] | 要使用的緩存名稱 |
key | String | SpEL表達式,用來計算自定義的緩存key |
condition | String | SpEL表達式,如果得到的值是false的話,緩存不會應用到方法調用上 |
allEntries | boolean | 如果為true的話,特定緩存的所有條目都會被移除 |
beforeInvocation | boolean | 如果為true的話,在方法調用之前移除條目,如果為false的話,在方法成功調用之后在移除條目 |
更多內容可以關注微信公眾號,或者訪問AppZone網站
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64907.html
摘要:引入了新的環境和概要信息,是一種更揭秘與實戰六消息隊列篇掘金本文,講解如何集成,實現消息隊列。博客地址揭秘與實戰二數據緩存篇掘金本文,講解如何集成,實現緩存。 Spring Boot 揭秘與實戰(九) 應用監控篇 - HTTP 健康監控 - 掘金Health 信息是從 ApplicationContext 中所有的 HealthIndicator 的 Bean 中收集的, Spring...
摘要:作為微服務的基礎設施之一,背靠強大的生態社區,支撐技術體系。微服務實踐為系列講座,專題直播節,時長高達小時,包括目前最流行技術,深入源碼分析,授人以漁的方式,幫助初學者深入淺出地掌握,為高階從業人員拋磚引玉。 簡介 目前業界最流行的微服務架構正在或者已被各種規模的互聯網公司廣泛接受和認可,業已成為互聯網開發人員必備技術。無論是互聯網、云計算還是大數據,Java平臺已成為全棧的生態體系,...
閱讀 1111·2021-09-22 16:04
閱讀 1494·2019-08-30 15:43
閱讀 1097·2019-08-29 14:01
閱讀 3438·2019-08-26 12:19
閱讀 3353·2019-08-26 12:15
閱讀 1444·2019-08-26 12:13
閱讀 3264·2019-08-23 17:00
閱讀 1484·2019-08-23 15:38