概述
springboot一般整合redis,採用的是RedisTemplate的形式,除了這種形式之外,還有另一種形式去整合,即採用spring支持的註解進行訪問緩存.java
準備工做
- pom.xml
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.7.3</version> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>1.7.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-redis</artifactId> <version>RELEASE</version> </dependency>
- application.properties
# REDIS (RedisProperties) # Redis數據庫索引(默認爲0) spring.redis.database=0 # Redis服務器地址 spring.redis.host=127.0.0.1 # Redis服務器鏈接端口 spring.redis.port=6379 # 鏈接池最大鏈接數(使用負值表示沒有限制) spring.redis.pool.max-active=8 # 鏈接池最大阻塞等待時間(使用負值表示沒有限制) spring.redis.pool.max-wait=-1 # 鏈接池中的最大空閒鏈接 spring.redis.pool.max-idle=8 # 鏈接池中的最小空閒鏈接 spring.redis.pool.min-idle=0 # 鏈接超時時間(毫秒) spring.redis.timeout=0
Redis配置類
/** * @author hulonghai * redis配置類 */ @Configuration @EnableCaching public class CacheConfig extends CachingConfigurerSupport{ @SuppressWarnings("rawtypes") @Bean public CacheManager cacheManager(RedisTemplate redisTemplate) { RedisCacheManager rcm = new RedisCacheManager(redisTemplate); // 多個緩存的名稱,目前只定義了一個 rcm.setCacheNames(Arrays.asList("thisredis")); //設置緩存過時時間(秒) rcm.setDefaultExpiration(600); return rcm; } @Bean public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) { StringRedisTemplate template = new StringRedisTemplate(factory); Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); template.setValueSerializer(jackson2JsonRedisSerializer); template.afterPropertiesSet(); return template; } }
能夠看出,咱們這裏主要配置了兩個東西,cacheManager方法配置了一個緩存名稱,它的名字叫作thisredis,當咱們要在方法註解裏面使用到它的時候,就要根據名稱進行區分不一樣緩存.同時設置了緩
存的過時時間.redisTemplate則是比較常見的,咱們設置了RedisTemplate,所以在代碼裏面,咱們也能夠經過@Autowired注入RedisTemplate來操做redis.redis
使用
接下來就是如何使用註解啦,這一步反而是最簡單的.其實只用到了兩個註解,@Cacheable和@CacheEvict.第一個註解表明從緩存中查詢指定的key,若是有,從緩存中取,再也不執行方法.若是沒有則執
行方法,而且將方法的返回值和指定的key關聯起來,放入到緩存中.而@CacheEvict則是從緩存中清除指定的key對應的數據.使用的代碼以下:spring
@Cacheable(value="thisredis", key="'users_'+#id") public User findUser(Integer id) { User user = new User(); user.setUsername("hlhdidi"); user.setPassword("123"); user.setUid(id.longValue()); System.out.println("log4j2壞啦?"); logger.info("輸入user,用戶名:{},密碼:{}",user.getUsername(),user.getPassword()); return user; } @CacheEvict(value="thisredis", key="'users_'+#id",condition="#id!=1") public void delUser(Integer id) { // 刪除user System.out.println("user刪除"); }
能夠看出,咱們用@Cacheable的value屬性指定具體緩存,並經過key將其放入緩存中.這裏key很是靈活,支持spring的el表達式,能夠經過方法參數產生可變的key(見findUser方法),也能夠經過其指定在
什麼狀況下,使用/不使用緩存(見delUser方法).數據庫