Spring Boot 1.5.4集成Redis

作者: 49b57e65f0ca | 来源:发表于2017-07-21 08:47 被阅读1125次

    本文示例源码,请看这里

    如何安装与配置Redis,请看这里


    1. 首先添加起步依赖:
    <dependency>  
        <groupId>org.springframework.boot</groupId>  
        <artifactId>spring-boot-starter-data-redis</artifactId>  
    </dependency>  
    

    该依赖里默认包含了spring-data-redis和Jedis依赖,见这里

    1. 编辑application.properties,配置Redis
    # Redis 配置
    # Redis数据库索引(默认为0)
    spring.redis.database=0
    # Redis服务器地址
    spring.redis.host=192.168.10.128
    # Redis服务器连接端口
    spring.redis.port=6379
    # Redis服务器连接密码(默认为空)
    spring.redis.password=123qwe
    # 连接池最大连接数(使用负值表示没有限制)
    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
    
    1. 添加一个string类型的键值对,测试一下
    @RestController
    public class RedisController {
    
        @Autowired
        private StringRedisTemplate stringRedisTemplate;
    
        @RequestMapping(value = "/redis/string", method = RequestMethod.GET)
        public void insertString() {
            stringRedisTemplate.opsForValue().set("stringKey", "stringValue");
        }   
    }
    

    可以看到已经添加进去了:

    [root@localhost ~]# redis-cli
    127.0.0.1:6379> get stringKey
    "stringValue"
    

    如果这不是一个Spring Boot项目,要想使用spring-data-redis还至少需要进行下面的配置:

        @Bean
        public RedisConnectionFactory jedisConnectionFactory() {
            JedisConnectionFactory jcf = new JedisConnectionFactory();
            jcf.setHostName("192.168.10.128");
            jcf.setPort(6379);
            jcf.setPassword("123qwe");
            return jcf;
        }
    
        @Bean
        public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
            RedisTemplate<String, String> redisTemplate = new RedisTemplate<String, String>();
            redisTemplate.setConnectionFactory(jedisConnectionFactory());
            return redisTemplate;
        }
    

    但是,从springboot的Redis自动配置类RedisAutoConfiguration.java里可以看到,springboot已经帮我们配置好了。

    Spring Data Redis提供了两个模板:

    • RedisTemplate
    • StringRedisTemplate

    RedisTemplate会使用JdkSerializationRedisSerializer,这意味着key和value都会通过Java进行序列化。 StringRedisTemplate默认会使用StringRedisSerializer

    所以要是操作字符串的话,用StringRedisTemplate就可以了。但要是想要存储一个对象(比如:User),我们就需要使用RedisTemplate,并对key采用string序列化方式,对value采用json序列化方式,这时候就需要对redisTemplate自定义配置了:

    @Bean
        public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
            RedisTemplate<String, String> redisTemplate = new RedisTemplate<String, String>();
    
            redisTemplate.setConnectionFactory(factory);
            redisTemplate.afterPropertiesSet();
            setSerializer(redisTemplate);
            return redisTemplate;
        }
    
        private void setSerializer(RedisTemplate<String, String> template) {
            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);
            template.setKeySerializer(new StringRedisSerializer());
            template.setValueSerializer(jackson2JsonRedisSerializer);
        }
    

    添加一条数据,测试效果:

        @RequestMapping(value = "/redis/string/object", method = RequestMethod.GET)
        public void insertStringObject() {
            User user = new User();
            user.setUserId(1);
            user.setUsername("user1");
            user.setPassword("password1");
            redisTemplate.opsForValue().set("stringKeyObject", user);
        }
    

    在redis-cli里查看一下:

    127.0.0.1:6379> get stringKeyObject
    "[\"com.ansel.testall.mybatis.model.User\",{\"userId\":1,\"username\":\"user1\",\"password\":\"password1\"}]"
    

    使用代码获取刚才存储的对象:

        @RequestMapping(value = "/redis/string/object/get", method = RequestMethod.GET)
        public User getStringObject() {
            User user = (User) redisTemplate.opsForValue().get("stringKeyObject");
            return user;
        }
    
    image

    更多方法详见下表:

    方  法 子API接口 描  述
    opsForValue() ValueOperations<K, V> 操作具有简单值的条目
    opsForList() ListOperations<K, V> 操作具有list值的条目
    opsForSet() SetOperations<K, V> 操作具有set值的条目
    opsForZSet() ZSetOperations<K, V> 操作具有ZSet值(排序的set)的条目
    opsForHash() HashOperations<K, HK, HV> 操作具有hash值的条目
    boundValueOps(K) BoundValueOperations<K,V> 以绑定指定key的方式,操作具有简单值的条目
    boundListOps(K) BoundListOperations<K,V> 以绑定指定key的方式,操作具有list值的条目
    boundSetOps(K) BoundSetOperations<K,V> 以绑定指定key的方式,操作具有set值的条目
    boundZSet(K) BoundZSetOperations<K,V> 以绑定指定key的方式,操作具有ZSet值(排序的set)的条目
    boundHashOps(K) BoundHashOperations<K,V> 以绑定指定key的方式,操作具有hash值的条目

    相关文章

      网友评论

      • Nathans:这个样子的话缓存信息同样带了对象的全路径,路径发生变化或者其他应用使用此缓存不会出现问题吗
        Nathans:@x113773 你现在配置的jacjson的方式,存储到redis难道没有路径???我说的是值,朋友。
        49b57e65f0ca:你说的是http://www.jianshu.com/p/fce2dd05c429这篇文章吧,刚开始我是用的方法全路径,后来做缓存更新删除的时候,改成了缓存名称+主键的方式

      本文标题:Spring Boot 1.5.4集成Redis

      本文链接:https://www.haomeiwen.com/subject/zoyskxtx.html