1,Spring连接Redis:
1.1,前提:启动redis并登录,将这段代码放入.bat中,双击就会启动Redis(D:\dev\redis是Redis安装路径),之后另开一个CMD,简单登录,输入:redis-cli -h 127.0.0.1 -p 6379
pushd D:\dev\redis
redis-server.exe redis.windows.conf
pause
1.2,Spring提供了四种为Redis客户端提供连接的Redis连接工厂:
。JedisConnectionFactory
。JredisConnectionFactory
。LettuceConnectionFactory
。SrpConnectionFactory
使用其中一种,这样Redis连接工厂的bean就被注入到Spring容器中:
@Bean
public RedisConnectionFactory hadRedisCF(){
JedisConnectionFactory cf=new JedisConnectionFactory();
cf.setHostName("127.0.0.1");
cf.setPort(6379);
return cf;
}
其实到了这一步,就能使用连接工厂进行Redis数据的访问了,为了不受数据结构的限制,Spring提供了两种模板来操作Redis的Key-Value:
。RedisTemplate(操作key-value是更丰富的数据结构,比如对象,集合等)
。StringRedisTemplate(扩展自RedisTemplate,只适用于key,value都是String类型的)
定义RedisTemplate的bean:
@Bean
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory cf){
RedisTemplate<String,Object> redis=new RedisTemplate<String,Object>();
redis.setConnectionFactory(cf);
//适用序列化器自定义key-value的序列化方式
StringRedisSerializer srs=new StringRedisSerializer();
redis.setKeySerializer(srs);
redis.setHashKeySerializer(srs);
redis.setValueSerializer(srs);
redis.setHashValueSerializer(srs);
return redis;
}
到这里就能访问进行key-value的操作了:
//从javaconfig启动Spring容器
AnnotationConfigApplicationContext aa=
new AnnotationConfigApplicationContext(RedisConfig.class);
//获取Redistemplate对象
RedisTemplate RT=(RedisTemplate)aa.getBean("redisTemplate");
设置key-value:
RT.opsForValue().set("go","走了"); //设置key=go,value="走了"
获取value:
RT.opsForValue().get("go"); //返回值就是"走了"
提醒:
1,一定要先了解Redis的每种数据结构:String,List,Set,zSet,Hash;每种数据结构都有对应的方法来操作,不能混用。 2,1中的方法会对应着RedisTemplate的方法,比如opsForValue对应String,opsForList对应List。 3,关于序列化器,RedisTemplate默认使用JdkSerializationRedisSerializer序列化器对key和value进行序列化,Spring提供了如下序列化器:(都实现了RedisSerializer接口): 。GenericToStringSerializer,使用Spring转换服务进行序列化 。JacksonJsonRedisSerializer,使用Jackson 1将对象序列化为JSON 。Jackson2JsonRedisSerializer,使用Jackson 2将对象序列化为JSON 。JdkSerializationRedisSerializer,使用java序列化 。OxmSerializer,使用Spring O/X映射的编排器和解排器实现序列化,用于XML序列化 。StringRedisSerializer,用于序列化String类型的Key和value 4,如果value代表对象,那么对象一定要支持序列化,简单的就是实现接口:Serializer |
2,使用注解式的Redis缓存:
2.1,如果不想用注解,那么就用上述的设置方法来将数据存入Redis。只不过设置的过程比较繁琐,而用注解,就会利用到AOP的切面来使用缓存,不想使用XML的原因是配置繁琐,javaconfig会更nice.
2.2,缓存注解不是默认启动的,需要注解驱动缓存,给配置类加上:@EnableCaching就可以了;
2.3,Spring3.2提供了多种缓存管理器,缓存管理器是注解式缓存的基础:
SimpleCacheManager NoOpCacheManager ConcurrentMapCacheManager CompositeCacheManager EhCacheCacheManager RedisCacheManager GemfireCacheManager |
由于使用过Redis作为缓存,那么就用RedisCacheManager,
2.4,配置javaconfig:
@Bean //配置一个缓存管理器
public CacheManager cacheManager(RedisTemplate redisTemplate){
return new RedisCacheManager(redisTemplate); //声明缓存管理器,
}
@Bean //RedisTemplate bean
public RedisTemplate<String,String> redisTemplate(RedisConnectionFactory redisCF){
RedisTemplate<String,String> redisTemplate =new RedisTemplate<String,String>();
StringRedisSerializer srs=new StringRedisSerializer();
//序列化器
redisTemplate.setValueSerializer(srs);
redisTemplate.setKeySerializer(srs);
redisTemplate.setHashKeySerializer(srs);
redisTemplate.setHashValueSerializer(srs);
redisTemplate.setConnectionFactory(redisCF);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
注意这段代码相较于1中的,多了redisTemplate.afterPropertiesSet();这个方法必须要有,书上也没介绍,但是一定要settter设置完参数后在执行这个,(似乎是调用这个方法了才能初始化注解的缓存)
2.5,为方法添加注解以支持缓存:
Spring提供了了四个注解: @Cacheable,在调用方法之前,首先在缓存中查找方法的返回值,如果能够找到,就会返回缓存的值(不调用方法了),否则方法会被调用,且返回值会放入缓存(适用于返回值不会发生变化的方法)。 @CachePut,将方法的返回值放入到缓存中,调用前不检查缓存 @CacheEvict,应该在缓存中清除一个或多个缓存条目 @Caching,分组注解,能够同时应用多个其他缓存注解 |
2.6,示例
@Cacheable(value = "RedisTemplate",key="#name+#age")
public String sayHello(String name,int age){
String name1=name;
int age1=age;
name1=name.toLowerCase();
return name1+age ;
}
这个示例设置自定义的key:name+age,value就是函数的返回值(切记别用默认的生成key策略),
假设是无参数方法:则用{#result},关于这几个注解的其余属性我就不多谈了。