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 }
RedisConfig 

相关文章: