#缓存默认有效期1h (60 * 60 = 3600秒)
redis.expiration=3600
#最大空闲数,数据库连接的最大空闲时间。超过空闲时间,数据库连接将被标记为不可用,然后被释放。设为0表示无限制。
redis.maxIdle=300
#连接池的最大数据库连接数。设为0表示无限制。
#Redis默认允许客户端连接的最大数量是10000。若是看到连接数超过5000以上,那可能会影响Redis的性能。倘若一些或大部分客户端发送大量的命令过来,这个数字会低的多。
redis.maxActive=5000
#最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
redis.maxWait=-1
#申请连接时检测连接是否有效,配置true会降低性能,但是可以检测链接有效性,默认false
redis.testOnBorrow=true
#返回前会先校验这个链接有效性,如果无效会被销毁,默认值false
redis.testOnReturn=true
redis.database=0
#缓存时间范围
cache.cacheTime=300,400
#同步等待时间
cache.syncWaitTime=300
#空值缓存时间
cache.nullCacheTime=60
(2).config文件夹下添加spring-data-redis.xml配置
1. <?xml version="1.0"="UTF-8"?>
2. <beansxmlns="http://www.springframework.org/schema/beans"
3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"
4. xmlns:context="http://www.springframework.org/schema/context"
5. xmlns:cache="http://www.springframework.org/schema/cache"
6. xsi:schemaLocation="http://www.springframework.org/schema/beans
7. http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
8. http://www.springframework.org/schema/context
9. http://www.springframework.org/schema/context/spring-context-4.3.xsd
10. http://www.springframework.org/schema/cache
11. >
12. <description>Jedis Configuration</description>
13. <!-- 加载配置属性文件 -->
14. <context:property-placeholderignore-unresolvable="true"location="classpath:config/config.properties"/>
15. <!-- ******************** redis缓存 **********************-->
16. <!-- 启用缓存注解功能,否则注解不会生效 -->
17. <cache:annotation-drivencache-manager="cacheManager"/>
18. <!-- redis 相关配置 -->
19. <beanid="poolConfig"class="redis.clients.jedis.JedisPoolConfig">
20. <propertyname="maxIdle"value="${redis.maxIdle}"/>
21. <propertyname="maxWaitMillis"value="${redis.maxWait}"/>
22. <propertyname="testOnBorrow"value="${redis.testOnBorrow}"/>
23. <propertyname="testOnReturn"value="${redis.testOnReturn}"/>
24. </bean>
25. <beanid="jedisConnectionFactory"class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
26. p:host-name="${redis.host}"p:port="${redis.port}"p:password="${redis.password}"
27. p:database="${redis.database}"p:timeout="${redis.timeout}"
28. p:pool-config-ref="poolConfig"/>
29. <beanid="redisTemplate"class="org.springframework.data.redis.core.RedisTemplate">
30. <propertyname="connectionFactory"ref="jedisConnectionFactory"/>
31. <!--对key的序列化器 -->
32. <propertyname="keySerializer">
33. <beanclass="org.springframework.data.redis.serializer.StringRedisSerializer"/>
34. </property>
35. <!--是对value的列化器 默认:JdkSerializationRedisSerializer -->
36. <propertyname="valueSerializer">
37. <beanclass="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer"/>
38. </property>
39. </bean>
40. <!-- 扩展RedisCacheManager -->
41. <beanid="cacheManager"class="com.we.core.web.cache.TFRedisCacheManager">
42. <constructor-argref="redisTemplate"/>
43. <!-- 是否使用前缀 默认: -->
44. <!--<property name="usePrefix" value="true" />-->
45. <!-- 默认有效期1h (60 * 60 = 3600秒) -->
46. <propertyname="defaultExpiration"value="${redis.expiration}"/>
47. </bean>
48. <!-- ******************** redis缓存 **********************-->
49. </beans>
(3).config/spring-context.xml中添加
1. <importresource="spring-data-redis.xml"/>
注解使用
概况
基于注解的缓存声明,需要掌握的有:@Cacheable、@CachePut 、 @CacheEvict 和@Caching
以下列举了几种常用的使用属性,详情可自行查阅
1. @Cacheable(value="",condition="",key="",unless="")
2. public@interfaceCacheable{
3. String[]();//缓存的名字,可以把数据写到多个缓存,我们扩展了属性:area#60*10, area是value,60*10是缓存时间(单位秒),不加走默认(1h)
4. String()default"";//缓存key,如果不指定将使用默认的KeyGenerator生成,后边介绍
5. String()default"";//满足缓存条件的数据才会放入缓存,condition在调用方法之前和之后都会判断
6. Stringunless()default"";//用于否决缓存更新的,不像condition,该表达只在方法执行之后判断,此时可以拿到返回值result进行判断了
7. String()default"";//指定key规则
8. }
9. @CachePut(value="",condition="",key="",unless="")
10. public@interfaceCachePut{
11. String[]();//缓存的名字,可以把数据写到多个缓存
12. String()default"";//缓存key,如果不指定将使用默认的KeyGenerator生成,后边介绍
13. String()default"";//满足缓存条件的数据才会放入缓存,condition在调用方法之前和之后都会判断
14. Stringunless()default"";//用于否决缓存更新的,不像condition,该表达只在方法执行之后判断,此时可以拿到返回值result进行判断了
15. }
16. @Cacheable(value="",condition="",key="",unless="")
17. public@interfaceCacheEvict{
18. String[]();//缓存的名字,可以把数据写到多个缓存
19. String()default"";//缓存key,如果不指定将使用默认的KeyGenerator生成,后边介绍
20. String()default"";//满足缓存条件的数据才会放入缓存,condition在调用方法之前和之后都会判断
21. boolean()defaultfalse;//是否移除所有数据
22. boolean()defaultfalse;//是调用方法之前移除/还是调用之后移除
23. @Caching(value="",condition="",key="",unless="")
24. public@interfaceCaching{
25. Cacheable[]()default{};//从缓存获取多个,如果没有则执行方法体,获取值后加入缓存
26. CachePut[]()default{};//缓存多个
27. CacheEvict[]()default{};//从缓存移除多个
28. }
@Cacheable
较常用,用在查询方法上,先从缓存中读取,如果缓存不存在再调用该方法获取数据,然后把返回的数据添加到缓存中去
正如其名字,@Cacheable用于添加在需高速缓存的方法上。这些方法默认会以参数为主键把返回结果存储到高速缓存中,以便在随后的调用(使用相同的参数)方法,直接返回高速缓存中的值,不需要实际执行此方法。
- 最简单的方式,只需要声明一个相关缓存策略的名称
- @Cacheable("area#60*10")
- publicBook(String){...}
- 也可以设置多个缓冲块,其中一个缓冲块命中即会返回,并会同步其他缓存块:
- @Cacheable(value ={"area#60*10","city#60*30"})
- publicBook(String){...}
- 定制key,且加同步
- @Cacheable(value ={"area#60*10"},="'code:'+#code",sync =true)
- publicAreaDto(String){
- return.get(code);
- }
- 定制key,且加同步,加条件
- @Cacheable(value ={"area#60*10"},="'code:'+#code",sync =true,="#code=='100000'")
- publicAreaDto(String){
- return.get(code);
- }
@CacheEvict
主要对方法配置,用来标记要清空缓存的方法,当这个方法被调用并满足一定条件后,即会清空缓存。
- 参数解析:
value:缓存的位置,不能为空。key:缓存的key,默认为空。condition:触发的条件,只有满足条件的情况才会清楚缓存,默认为空,支持SpEL。allEntries:true表示清除value中的全部缓存,默认为false。
1. /**
2. * 情况area#60*10下所有缓存
3. */
4. @CacheEvict(value ={"area#60*10"},="'code:'+#code",="#code=='100000'")
5. publicAreaDtodelete(String){
6. return.delete(code);
7. }
1. /**
2. * 只要执行了delArea2方法,就刷新缓存名为”getAreaVersion4”下面的所有缓存
3. */
4. @Caching(evict ={@CacheEvict(value ={"getAreaVersion4#60*5"},=true)})
5. publicvoid(){
6. }
@CachePut
主要针对方法的配置,能够根据方法的请求参数对其结果进行缓存,和@Cacheable不同的是,它每次都会触发真实方法的调用。
1. @CachePut(value ={"area#60*10"},="'code:'+#code",sync =true,="#code=='100000'")
2. publicAreaDto(String){
3. return.get(code);
4. }
其他自行查阅
1. spring-data-redis
自定义缓存注解
1.更新项目包
- we-core-web
2.添加默认配置
- 在apollo中添加 或者 在config/config.properties中添加优先级顺序:1、apollo;2、配置文件;
- #缓存时间范围
- cache.cacheTime=300,400
- #同步等待时间
- cache.syncWaitTime=3
- #空值缓存时间
- cache.nullCacheTime=60
3.应用
- 使用demo
- /**
- * 目标方法
- * <p&
- * 支持限流
- * 支持穿透
- * 支持异步处理
- * </p&
- *
- * @param code
- * @return
- */
- @TFCacheable(groupName =,={300,400},=300)
- publicAreaDto(String){
- return.get(code);
- }
注解介绍
1. /**
2. * 分组名
3. */
4. String()default"";
5. /**
6. * 缓存的时间范围
7. * <br/&
8. * 过期时间,单位为秒
9. *
10. * <p&
11. * 格式:minTime-maxTime,如:60-120
12. * </p&
13. */
14. int[]()default0;
15. /**
16. * 是否同步
17. * 同步排队时间:{@link #syncWaitTime}.
18. * <p&
19. * 细粒度同步锁,锁定级别:参数级别
20. * </p&
21. * @see #syncWaitTime
22. */
23. boolean()defaulttrue;
24.
/**
25. * 同步等待时间
26. * <br/&
27. * 过期时间,单位为秒
28. *
29. * <p&
30. * 过期时间,单位为秒
31. * 如果开启同步,默认排队时间,超过后,抛超时异常
32. * </p&
33. * @see #sync
34. */
35. int()default0;
36. /**
37. * 空值缓存时间
38. *
39. * <p&
40. * 空值会缓存短暂的时间,防止方法请求不断请求数据库,减少穿透几率
41. * </p&
42. */
43. int()default0
示例
@Cacheable(value = "ActivityScopeRedis#60*60",key = "#root.methodName + #activityId")
public List<ActivityScopeDto> findByActivityId(long activityId) {
return activityScopeBaseDao.findByActivityId(activityId);
}