1.首先,说明所使用的环境:
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>1.6.2.RELEASE</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.8.0</version>
</dependency>
spring采用的3.1.2RELEASE,
2.由于项目中使用到了redis,所以为了减轻数据库压力,最近打算把部分访问频率较高的数据放到redis中,并以redis作为项目缓存,开始爬坑了.....
3.步骤
第一步:applicationContext.xml命令空间的引入,如下:
xmlns:cache="http://www.springframework.org/schema/cache"
http://www.springframework.org/schema/cache
http://www.springframework.org/schema/cache/spring-cache.xsd
第二步:配置文件
3.2.1 redis的连接池配置
<!-- redis连接池配置-->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig" >
<!--最大空闲数-->
<property name="maxIdle" value="${redis.maxIdle}" />
<!--连接池的最大数据库连接数 -->
<property name="maxTotal" value="${redis.maxTotal}" />
<!--最大建立连接等待时间-->
<property name="maxWaitMillis" value="${redis.maxWaitMillis}" />
<!--逐出连接的最小空闲时间 默认1800000毫秒(30分钟)-->
<property name="minEvictableIdleTimeMillis" value="${redis.minEvictableIdleTimeMillis}" />
<!--每次逐出检查时 逐出的最大数目 如果为负数就是 : 1/abs(n), 默认3-->
<property name="numTestsPerEvictionRun" value="${redis.numTestsPerEvictionRun}" />
<!--逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1-->
<property name="timeBetweenEvictionRunsMillis" value="${redis.timeBetweenEvictionRunsMillis}" />
<!--是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个-->
<property name="testOnBorrow" value="${redis.testOnBorrow}" />
<!--在空闲时检查有效性, 默认false -->
<property name="testWhileIdle" value="${redis.testWhileIdle}" />
</bean >
3.2.2 redis连接工厂
<!--redis连接工厂 -->
<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" destroy-method="destroy">
<property name="poolConfig" ref="jedisPoolConfig"></property>
<!--IP地址 -->
<property name="hostName" value="${redis.hostName}"></property>
<!--端口号 -->
<property name="port" value="${redis.port}"></property>
<!--如果Redis设置有密码 -->
<property name="password" value="${redis.password}" />
<!--客户端超时时间单位是毫秒 -->
<property name="timeout" value="${redis.timeout}"></property>
</bean>
3.2.3 redis的操作模板[将redis给spring去管理]
<!--redis操作模版,使用该对象可以操作redis -->
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate" >
<property name="connectionFactory" ref="jedisConnectionFactory" />
<!--如果不配置Serializer,那么存储的时候缺省使用String,如果用User类型存储,那么会提示错误User can't cast to String!! -->
<property name="keySerializer" >
<bean class="org.springframework.data.redis.serializer.StringRedisSerializer" />
</property>
<property name="valueSerializer" >
<bean class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer" />
</property>
<property name="hashKeySerializer">
<bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
</property>
<property name="hashValueSerializer">
<bean class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer"/>
</property>
<!--开启事务 -->
<property name="enableTransactionSupport" value="false"></property>
</bean >
3.2.4 可以自定义一个工具类,交给spring的ioc管理
<!--自定义redis工具类,在需要缓存的地方注入此类 -->
<bean id="redisUtil" class="com.iflytek.redis.RedisUtil">
<property name="redisTemplate" ref="redisTemplate" />
</bean>
3.2.5 redis的缓存管理类的配置
<bean id="cacheManager" class="org.springframework.data.redis.cache.RedisCacheManager">
<!--配置 redisTemplate-->
<constructor-arg name="redisOperations" ref="redisTemplate"></constructor-arg>
<constructor-arg name="cacheNames">
<set>
<!--缓存名称,对应着缓存注解的value -->
<value>xxyq_globalset</value>
<value>play_repeat_state</value>
<!-- <value>xxyq_message_config</value> -->
<value>get_qtxx_lhpl</value>
</set>
</constructor-arg>
<!-- 过期时间 1800秒-->
<property name="defaultExpiration" value="1800"/>
</bean>
3.2.6 最后一步:开启缓存的注解扫描:
<cache:annotation-driven cache-manager="cacheManager"/>
注意: cache-manager的默认值是cacheManager,如果你的缓存管理类是cacheManager,那么 cache-manager属性可省略
至此,以redis作为项目缓存基本完成,下面记录一下桑常用注解的各个属性的含义:
4. cache注解介绍@Cacheable,@CachePut,@CacheEvict
4.1 @Cacheable注解的配置与用法
@Cacheable主要是针对方法配置,根据方法请求参数对其结果进行缓存,注意,缓存的是结果 ----- 即方法的返回值
@Cacheable作用在方法上,如果缓存中有值的话,就不会去调用方法,直接从缓存中获取值返回(类似于get操作)
主要参数 | 参数含义 | 示例 |
---|---|---|
value | 缓存的名称,在 spring 配置文件[缓存管理类中,本文是在cacheManager]中定义,必须指定至少一个 | @Cacheable(value=”mycache”) 或者 @Cacheable(value={”cache1”,”cache2”} |
key | 缓存的key值,可为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合 | @Cacheable(value=”testcache”,key=”#userName”) |
condition | 缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才进行缓存 | @Cacheable(value=”testcache”,condition=”#userName.length()>2”) |
4.2 @CachePut注解的配置与用法
@CachePut根据方法的请求参数对其结果进行缓存
每次请求会先调用方法,然后将返回值进行缓存(类似于update操作)
4.3 @CacheEvict注解的配置与用法
@CachEvict,能够根据一定的条件对缓存进行清空(类似于delete操作)
主要参数 | 参数含义 | 示例 |
---|---|---|
value | 缓存的名称,在 spring 配置文件中定义,必须指定至少一个 | @CachEvict(value=”mycache”) 或者 @CachEvict(value={”cache1”,”cache2”} |
key | 缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合 | @CachEvict(value=”testcache”,key=”#userName”) |
condition | 缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才清空缓存 | @CachEvict(value=”testcache”, condition=”#userName.length()>2”) |
allEntries | 是否清空所有缓存内容,缺省为 false,如果指定为 true,则方法调用后将立即清空所有缓存 | @CachEvict(value=”testcache”,allEntries=true) |
beforeInvocation | 是否在方法执行前就清空,缺省为 false,如果指定为 true,则在方法还没有执行的时候就清空缓存,缺省情况下,如果方法执行抛出异常,则不会清空缓存 | @CachEvict(value=”testcache”,beforeInvocation=true) |