基于spring注解@cacheable等使用redis缓存

搭建步骤

  1. pom文件引入spring-data-redis依赖。
	<dependency>
         <groupId>org.springframework.data</groupId>
         <artifactId>spring-data-redis</artifactId>
         <version>${sdr.version}</version>
     </dependency>

2.配置redis.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
                        http://www.springframework.org/schema/beans/spring-beans-4.0.xsd  
                        http://www.springframework.org/schema/context  
                        http://www.springframework.org/schema/context/spring-context-4.0.xsd">
	<!-- Jedis线程 -->
	<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
		<property name="maxIdle" value="${redis.maxIdle}" />
		<property name="minIdle" value="${redis.minIdle}" />
		<property name="maxTotal" value="${redis.maxTotal}" />
		<property name="testOnBorrow" value="true" />
	</bean>
	<bean id="jedisShardInfo" class="redis.clients.jedis.JedisShardInfo">
		<constructor-arg index="0" value="${redis.host}" />
		<constructor-arg index="1" value="${redis.port}" type="int" />
		<!-- Windows下不需要配置密码  Linux下配置密码 -->
		<!-- <property name="password" value="${redis.password}" /> -->
	</bean>
	<bean id="shardedJedisPool" class="redis.clients.jedis.ShardedJedisPool">
		<constructor-arg index="0" ref="jedisPoolConfig" />
		<constructor-arg index="1">
			<list>
				<ref bean="jedisShardInfo" />
			</list>
		</constructor-arg>
	</bean>
	<!-- Redis连接 -->
	<bean id="jedisConnectionFactory"
		class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
		p:shard-info-ref="jedisShardInfo" p:pool-config-ref="jedisPoolConfig" />
    <!-- 缓存序列化方式 -->
    <bean id="keySerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer" />
	<bean id="valueSerializer" class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer" />
    <!-- 缓存 -->
	<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
		<property name="connectionFactory" ref="jedisConnectionFactory" />
		<property name="keySerializer" ref="keySerializer" />
		<property name="valueSerializer" ref="valueSerializer" />
		<property name="hashKeySerializer" ref="keySerializer" />
		<property name="hashValueSerializer" ref="valueSerializer" />
	</bean>
	<bean id="redisCacheManager" class="org.springframework.data.redis.cache.RedisCacheManager">
		<constructor-arg index="0" ref="redisTemplate" />
		<property name="defaultExpiration" value="${redis.expiration}" />
	</bean>
</beans>

3.使用注解

@Override
	@CachePut(cacheManager="redisCacheManager", value="sysApi", key="#sysApi.id")
	public SysApi addOne(SysApi sysApi) {
		logger.info("");
		sysApiMapper.insert(sysApi);
		return sysApi;
	}
	@Override
	@Cacheable(cacheManager="redisCacheManager", value="sysApi", key="#sysApi.id")
	public SysApi queryOne(SysApi sysApi) {
		System.out.println("走我了---------------");
		return sysApiMapper.selectByPrimaryKey(sysApi.getId());
	}

4.编写测试类

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:Spring-config.xml")
//@WebAppConfiguration
//@ActiveProfiles("single") // 设置profile
public class SpringCacheAnnotationTests {

	@Autowired
	SysApiProvider sysApiProvider;
    // ---------------spring cache注解演示
    // get
	@Test
	public void addOne(){
		SysApi sysApi = new SysApi();
		sysApi.setId("11111111111111");
		sysApi.setName("testRedis");
		sysApi.setUri("/redis/redis");
		sysApiProvider.addOne(sysApi);
	}
	
	@Test
	public void queryOne(){
		SysApi sysApi = new SysApi();
		sysApi.setId("11111111111111");
		SysApi queryOne = sysApiProvider.queryOne(sysApi);
		System.out.println(queryOne);
	}
}

5.登录redis客户端,flushdb清空数据
在这里插入图片描述
6.运行测试单元,添加一条记录,查看redis数据

在这里插入图片描述
说明:使用spring-data-redis 1.7.2版本会生成以上两个key
其中第一个是sorted-set类型,由@cachePut的value值和“~keys”拼接而成,第二个key是string,由@cachePut的key生成。第二个key是第一个key的一条记录,需要配合使用才能查出缓存
基于spring注解@cacheable等使用redis缓存_第1张图片
而在spring-data-redis 2.1.5中会直接生成一个string类型,key是有@cacheable的value值加上“::”和key值拼接而成,值就是缓存值。

7.运行测试单元查看一条记录是否执行了数据库操作
基于spring注解@cacheable等使用redis缓存_第2张图片
基于spring注解@cacheable等使用redis缓存_第3张图片
第一次因为redis中没有该数据,故走了数据库,第二次因为redis有改数据,直接从redis中拿到数据直接返回了。

踩坑

  1. @cachePut存储的缓存是方法的return值,所以新增数据记录或者更新时要return实体,而不是平时用的int。

你可能感兴趣的:(redis)