spring boot redis 接入笔记
1. 安装redis
redis官网地址:http://www.redis.io/
最新版本:2.8.3
在Linux下安装Redis非常简单,具体步骤如下(官网有说明):
1、下载源码,解压缩后编译源码。
$ wget http://download.redis.io/releases/redis-2.8.3.tar.gz $ tar xzf redis-2.8.3.tar.gz $ cd redis-2.8.3 $ make
2、编译完成后,在Src目录下,有四个可执行文件redis-server、redis-benchmark、redis-cli和redis.conf(在上一目录)。然后拷贝到一个目录下。
mkdir /usr/redis cp redis-server /usr/redis cp redis-benchmark /usr/redis cp redis-cli /usr/redis cp redis.conf /usr/redis cd /usr/redis
3、启动Redis服务。
$ redis-server redis.conf
4、然后用客户端测试一下是否启动成功。
$ redis-cli redis> set foo bar OK redis> get foo "bar"
http://www.cnblogs.com/silent2012/p/3499654.html
使用 ./redis-server redis.conf & 来后台启动redis服务
redis-cli -p 端口号 shutdown 关闭redis服务
从外部链接调试:
telnet xxx.xxx.xxx.xxx 6379
2. spring boot 接入 redis 客户端
http://wiselyman.iteye.com/blog/2184884
(1)maven依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-redis</artifactId> <version>1.3.1.RELEASE</version> </dependency>
(2)属性:
# Redis数据库索引(默认为0) spring.redis.database=0 # Redis服务器地址 spring.redis.host=xxx.xxx.xxx.xxx # Redis服务器连接端口 spring.redis.port=xxxx # Redis服务器连接密码(默认为空) spring.redis.password= # 连接池最大连接数(使用负值表示没有限制) spring.redis.pool.max-active=8 # 连接池最大阻塞等待时间(使用负值表示没有限制) spring.redis.pool.max-wait=-1 # 连接池中的最大空闲连接 spring.redis.pool.max-idle=8 # 连接池中的最小空闲连接 spring.redis.pool.min-idle=0 # 连接超时时间(毫秒) spring.redis.timeout=0
database 生产环境可设置为其他数字,区分测试环境
(3)代码注入:
@Configuration @EnableCaching @EnableRedisHttpSession public class RedisConfig extends CachingConfigurerSupport { @Bean public KeyGenerator wiselyKeyGenerator(){ return new KeyGenerator() { @Override public Object generate(Object target, Method method, Object... params) { StringBuilder sb = new StringBuilder(); sb.append(target.getClass().getName()); sb.append(method.getName()); for (Object obj : params) { sb.append(obj.toString()); } return sb.toString(); } }; } @Bean public static ConfigureRedisAction configureRedisAction() { return ConfigureRedisAction.NO_OP; } @Bean public CacheManager cacheManager( @SuppressWarnings("rawtypes") RedisTemplate<?,?> redisTemplate) { return new RedisCacheManager(redisTemplate); } @Bean public RedisTemplate<String, Object> stringRedisTemplate( RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<String, Object>(); template.setConnectionFactory(factory); StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); template.setValueSerializer(stringRedisSerializer); template.setKeySerializer(stringRedisSerializer); template.setHashKeySerializer(stringRedisSerializer); template.setHashValueSerializer(stringRedisSerializer); template.afterPropertiesSet(); return template; } @Bean public RedisTemplate<String, Object> jdkRedisTemplate( RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<String, Object>(); template.setConnectionFactory(factory); Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); JdkSerializationRedisSerializer jdkSerializationRedisSerializer = new JdkSerializationRedisSerializer(); StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); template.setValueSerializer(jdkSerializationRedisSerializer); template.setKeySerializer(stringRedisSerializer); template.setHashKeySerializer(stringRedisSerializer); template.setHashValueSerializer(jdkSerializationRedisSerializer); template.afterPropertiesSet(); return template; } }
这里同时注入了stringRedisTemplate 和 jdkRedisTemplate,未在@Bean处指定名称(@Bean(name="xxx")),直接取工厂方法名
业务装配时:
@Resource(name = "jdkRedisTemplate") private RedisTemplate<String, Object> jdkRedisTemplate; @Resource(name = "stringRedisTemplate") // if stringRedisTemplate, result in SmsCheck cannot be cast to java.lang.String private RedisTemplate<String, Object> stringRedisTemplate;
3. 简单使用调试
SmsCheck smsCheck = new SmsCheck(); smsCheck.setMobile("xxx"); // 设置缓存 jdkRedisTemplate.opsForValue().set("test",smsCheck); Object o = jdkRedisTemplate.opsForValue().get("test"); // if stringRedisTemplate result in SmsCheck cannot to String Exception stringRedisTemplate.opsForValue().set("testInt", new Integer(2));//报错
测试通过,更详细的使用在未来更新,如果此处装配的是stringRedisTemplate,则由于该bean以
template.setValueSerializer(stringRedisSerializer);作为value的序列化方案,所以会导致SmsCheck无法序列化为String,抛出一个
SmsCheck cannot be cast to java.lang.String异常
最后一行也报错,
java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
spring在序列化时抛出异常,Integer无法直接使用stringRedisTemplate序列化
4.相关推荐
http://www.jianshu.com/p/7bf5dc61ca06
如何使用RedisTemplate访问Redis数据结构
http://412887952-qq-com.iteye.com/blog/2294942