记录使用redis作为项目缓存踩的坑

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)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值