<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.62</version> </dependency>
# Redis數據庫索引(默認為0)
spring.redis.database=0
# Redis服務器地址
spring.redis.host=localhost
# Redis服務器連接端口
spring.redis.port=6379
# Redis服務器連接密碼(默認為空)
spring.redis.password=123456
# 連接池最大連接數(使用負值表示沒有限制)
spring.redis.pool.max-active=200
# 連接池最大阻塞等待時間(使用負值表示沒有限制)
spring.redis.pool.max-wait=-1
# 連接池中的最大空閑連接
spring.redis.pool.max-idle=10
# 連接池中的最小空閑連接
spring.redis.pool.min-idle=0
# 連接超時時間(毫秒)
spring.redis.timeout=1000ms
@Configuration @ConditionalOnClass(RedisOperations.class) //系統中有RedisOperations類時 @EnableConfigurationProperties(RedisProperties.class) //啟動RedisProperties這個類 @EnableCaching public class RedisConfig extends CachingConfigurerSupport { @Autowired RedisTemplate redisTemplate; // 配置緩存管理器 @Bean public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) { LettuceConnectionFactory jedisConnectionFactory = (LettuceConnectionFactory) redisTemplate.getConnectionFactory(); jedisConnectionFactory.setDatabase(2); //指定dbindex redisTemplate.setConnectionFactory(jedisConnectionFactory); jedisConnectionFactory.resetConnection(); RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig() .entryTtl(Duration.ofSeconds(60*20)) // 20分鍾緩存失效 // 設置key的序列化方式 // .entryTtl(Duration.ofSeconds(10)) .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())) // 設置value的序列化方式 .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new FastJsonRedisSerializer(Object.class))) // 不緩存null值 .disableCachingNullValues(); RedisCacheManager redisCacheManager = RedisCacheManager.builder(connectionFactory) .cacheDefaults(config) .transactionAware() .build(); return redisCacheManager; } }
package com.FireService.config; import java.nio.charset.Charset; import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.data.redis.serializer.SerializationException; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.parser.ParserConfig; import com.alibaba.fastjson.serializer.SerializerFeature; public class FastJsonRedisSerializer<T> implements RedisSerializer<T> { public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8"); private Class<T> clazz; static { ParserConfig.getGlobalInstance().addAccept("com.FireService"); } public FastJsonRedisSerializer(Class<T> clazz) { super(); this.clazz = clazz; } @Override public byte[] serialize(T t) throws SerializationException { if (null == t) { return new byte[0]; } return JSON.toJSONString(t, SerializerFeature.WriteClassName).getBytes(DEFAULT_CHARSET); } @Override public T deserialize(byte[] bytes) throws SerializationException { if (null == bytes || bytes.length <= 0) { return null; } String str = new String(bytes, DEFAULT_CHARSET); return (T) JSON.parseObject(str, clazz); } }
@Cacheable:查詢
可選屬性:
cacheNames/value:指定緩存組件的名字;
key:緩存數據使用的key,可以用來指定。默認即使用方法參數的值
keyGenerator:key的生成器,可以自己指定key的生成器的組件id
//自定義配置類配置keyGenerator @Configuration public class MyCacheConfig { @Bean("myKeyGenerator") public KeyGenerator keyGenerator(){ return new KeyGenerator() { @Override public Object generate(Object target, Method method, Object... params) { return method.getName()+"["+ Arrays.asList(params).toString() +"]"; } }; } }
condition:指定符合條件的情況下才緩存;如condition="#id>0"
unless:否定緩存,當unless指定的條件為true,方法的返回值不會被緩存,可以獲取到結果進行判斷;如unless="#result==null";
sync:是否使用異步模式
例如:
@Cacheable(value = "RedisInfo", key = "#root.methodName+'['+#account+']'") @ResponseBody @RequestMapping("/RedisTest") public Result findUserOrder(String account) throws Exception{ if(account!=null) { List<Map<String, Object>> list=orderFindGoods.findUserOrder(account); return Results.successWithData(list, BaseEnums.SUCCESS.code(), BaseEnums.SUCCESS.desc()); }else { return Results.failure(); } }
1.第一次訪問
查看Druid連接信息
可以看出當前執行sql語句為一次
再一次刷新頁面
此時使用RedisDestopManager查看數據
成功!!
@CachePut:更新
既調用方法,又更新緩存數據,可達到同步更新緩存;
修改了數據庫的某個數據,同時更新緩存
運行時機:
1、先調用運行方法;
2、將目標方法的結果緩存起來
value:緩存名 key:緩存的key其中#result表示方法返回的結果(確保更新的key和查詢一致即可做到同時更新數據庫數據和緩存中的數據)
@CachePut(value="user",key = "#result.id") public User updateUser(User user){ System.out.println("updateUser:"+user); userMapper.updateUser(user); return user; }
緩存清除:目的是為了刪除一個數據並刪掉緩存
key:指定要清除的數據(對應上key可實現目的即同時做到刪除數據庫和緩存中的數據)
allEntries =true:指定清楚這個緩存中所有的數據
beforeInvocation = false:緩存的清楚是否在方法之前執行,默認代表是在方法之后執行
@CacheEvict(value = "user",key = "#id") public void deleteUser(Integer id){ System.out.println("deleteUser:"+id); userMapper.deleteUserById(id); }
具體代碼我就不寫了。大家可以自己嘗試一下!