java代码操作Redis,需要使用Jedis,也就是redis支持java的第三方类库 注意:Jedis2.7以上的版本才支持集群操作
maven配置
新建SpringBoot2.0.3的WEB工程,在MAVEN的pom.xml文件中加入如下依赖
<dependencies> <!--默认是lettuce客户端--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!-- redis依赖commons-pool 这个依赖一定要添加 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> </dependency> <!-- 测试库依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
配置文件配置
spring:
redis:
port: 6379
password: 123456
host: 192.168.20.135
lettuce:
pool:
max-active: 8 # 连接池大连接数(使用负值表示没有限制)
max-idle: 8 # 连接池中的大空闲连接
min-idle: 0 # 连接池中的小空闲连接
max-wait: 1000 # 连接池大阻塞等待时间(使用负值表示没有限制)
shutdown-timeout: 100 # 关闭超时时间
redis配置类
JdbcTemplate-->JDBC 进一步封装。 RedisTemplate-->redis进行了进一步封装 (lettuce)
简介
编写缓存配置类RedisConfig用于调优缓存默认配置,RedisTemplate<String, Object>的类型兼容性更高
大家可以看到在redisTemplate()这个方法中用JacksonJsonRedisSerializer更换掉了Redis默认的序列化方 式:JdkSerializationRedisSerializer spring-data-redis中序列化类有以下几个:
GenericToStringSerializer:可以将任何对象泛化为字符创并序列化 Jackson2JsonRedisSerializer:序列化 Object对象为json字符创(与JacksonJsonRedisSerializer相同) JdkSerializationRedisSerializer:序列化java 对象 StringRedisSerializer:简单的字符串序列化 JdkSerializationRedisSerializer序列化被序列化对象必须实现Serializable接口,被序列化除属性内容还有其他 内容,长度长且不易阅读,默认就是采用这种序列化方式
存储内容如下:
"\xac\xed\x00\x05sr\x00!com.oreilly.springdata.redis.User\xb1\x1c \n\xcd\xed%\xd8\x02\x00\x02I\x00\x03ageL\x00\buserNamet\x00\x12Ljava/lang/String;xp\x00\x00\x00\ x14t\x00\x05user1"
<artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
spring: redis: port: 6379 password: guoweixin host: 192.168.20.135 lettuce: pool: max-active: 8 # 连接池大连接数(使用负值表示没有限制) max-idle: 8 # 连接池中的大空闲连接 min-idle: 0 # 连接池中的小空闲连接 max-wait: 1000 # 连接池大阻塞等待时间(使用负值表示没有限制) shutdown-timeout: 100 # 关闭超时时间
JacksonJsonRedisSerializer序列化,被序列化对象不需要实现Serializable接口,被序列化的结果清晰,容易阅 读,而且存储字节少,速度快
存储内容如下:
"{"userName":"guoweixin","age":20}" StringRedisSerializer序列化
一般如果key、value都是string字符串的话,就是用这个就可以了
RedisConfig 类
1 package com.xq.redis; 2 3 import com.fasterxml.jackson.annotation.JsonAutoDetect; 4 import com.fasterxml.jackson.annotation.PropertyAccessor; 5 import com.fasterxml.jackson.databind.ObjectMapper; 6 import org.springframework.cache.CacheManager; 7 import org.springframework.cache.annotation.CachingConfigurerSupport; 8 import org.springframework.cache.interceptor.KeyGenerator; 9 import org.springframework.context.annotation.Bean; 10 import org.springframework.context.annotation.Configuration; 11 import org.springframework.data.redis.cache.RedisCacheConfiguration; 12 import org.springframework.data.redis.cache.RedisCacheManager; 13 import org.springframework.data.redis.cache.RedisCacheWriter; 14 import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; 15 import org.springframework.data.redis.core.RedisTemplate; 16 import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; 17 import org.springframework.data.redis.serializer.StringRedisSerializer; 18 19 import java.lang.reflect.Method; 20 21 @Configuration 22 public class RedisConfig extends CachingConfigurerSupport { 23 /** 24 * 自定义缓存key的生成策略。默认的生成策略是看不懂的(乱码内容) 通过Spring 的依赖注入特性进行自定义的 配置注入并且此类是一个配置类可以更多程度的自定义配置 25 * 26 * @return 27 */ 28 @Bean 29 @Override 30 public KeyGenerator keyGenerator() { 31 return new KeyGenerator() { 32 @Override 33 public Object generate(Object target, Method method, Object... params) { 34 StringBuilder sb = new StringBuilder(); 35 sb.append(target.getClass().getName()); 36 sb.append(method.getName()); 37 for (Object obj : params) { 38 sb.append(obj.toString()); 39 } 40 return sb.toString(); 41 } 42 }; 43 } 44 45 /** 46 * 47 * 缓存配置管理器 48 */ 49 @Bean 50 public CacheManager cacheManager(LettuceConnectionFactory factory) { 51 //以锁写入的方式创建RedisCacheWriter对象 52 RedisCacheWriter writer = RedisCacheWriter.lockingRedisCacheWriter(factory); 53 //创建默认缓存配置对象 54 RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig(); 55 RedisCacheManager cacheManager = new RedisCacheManager(writer, config); 56 return cacheManager; 57 } 58 59 @Bean 60 public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory factory) { 61 RedisTemplate<String, Object> template = new RedisTemplate<>(); 62 template.setConnectionFactory(factory); 63 Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); 64 ObjectMapper om = new ObjectMapper(); 65 om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); 66 om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); 67 jackson2JsonRedisSerializer.setObjectMapper(om); 68 StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); 69 // 在使用注解@Bean返回RedisTemplate的时候,同时配置hashKey与hashValue的序列化方式。 70 // key采用String的序列化方式 71 template.setKeySerializer(stringRedisSerializer); 72 // value序列化方式采用jackson 73 template.setValueSerializer(jackson2JsonRedisSerializer); 74 // hash的key也采用String的序列化方式 75 template.setHashKeySerializer(stringRedisSerializer); 76 // hash的value序列化方式采用jackson 77 template.setHashValueSerializer(jackson2JsonRedisSerializer); 78 template.afterPropertiesSet(); 79 return template; 80 } 81 }