zoukankan      html  css  js  c++  java
  • 29. SpringBoot Redis 非注解

    1. 引入依赖

    <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.0.3.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
    
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <java.version>1.8</java.version>
            <spring.data.redis.version>2.0.8.RELEASE</spring.data.redis.version><!--1.8.7.RELEASE-->
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-redis</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
    
    
            <dependency>
                <groupId>org.springframework.data</groupId>
                <artifactId>spring-data-redis</artifactId>
                <version>${spring.data.redis.version}</version>
            </dependency>
    
            <dependency>
                <groupId>redis.clients</groupId>
                <artifactId>jedis</artifactId>
                <version>2.9.0</version>
            </dependency>
    
        </dependencies>

    2. application.yml中添加配置

    spring:
        redis:
          #数据库索引
          database: 0
          host: 127.0.0.1
          port: 6379
          password:
          jedis:
            pool:
              #最大连接数
              max-active: 8
              #最大阻塞等待时间(负数表示没限制)
              max-wait: -1
              #最大空闲
              max-idle: 8
              #最小空闲
              min-idle: 0
          #连接超时时间
          timeout: 10000

    3. RedisConfiguration

    @Configuration
    @EnableCaching
    public class RedisConfiguration extends CachingConfigurerSupport {
    
    
        @Bean
        public KeyGenerator keyGenerator() {
            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 CacheManager cacheManager(RedisTemplate redisTemplate) {
    //        RedisCacheManager redisCacheManager = new RedisCacheManager(redisTemplate);
    //        return redisCacheManager;
    //    }
    //
    //
    //    @Bean
    //    public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
    //        ////解决键、值序列化问题
    //        StringRedisTemplate template = new StringRedisTemplate(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);
    //        template.setValueSerializer(jackson2JsonRedisSerializer);
    //        template.afterPropertiesSet();
    //        return template;
    //    }
    
    
    
    
    
        /*
        spring-data-redis  版本不同,方法也不一样
        上面是1.5
        下面是2.0
        */
    
        @Bean
        public CacheManager cacheManager(RedisConnectionFactory connectionFactory) {
            RedisCacheManager redisCacheManager = RedisCacheManager.builder(connectionFactory).build();
            return redisCacheManager;
        }
    
        /**
         * @Description: 防止redis入库序列化乱码的问题
         * @return     返回类型
         * @date 2018/4/12 10:54
         */
        @Bean
        public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
            RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<Object, Object>();
            redisTemplate.setConnectionFactory(redisConnectionFactory);
            redisTemplate.setKeySerializer(new StringRedisSerializer());//key序列化
            redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer(Object.class));  //value序列化
    
            redisTemplate.setHashKeySerializer(new StringRedisSerializer());
            redisTemplate.setHashValueSerializer(new JdkSerializationRedisSerializer());
    
            redisTemplate.afterPropertiesSet();
            return redisTemplate;
        }

    4. RedisService

    @Component
    public class RedisService<HK, V> {
    
        // 在构造器中获取redisTemplate实例, key(not hashKey) 默认使用String类型
        private RedisTemplate<String, V> redisTemplate;
        // 在构造器中通过redisTemplate的工厂方法实例化操作对象
        private HashOperations<String, HK, V> hashOperations;
        private ListOperations<String, V> listOperations;
        private ZSetOperations<String, V> zSetOperations;
        private SetOperations<String, V> setOperations;
        private ValueOperations<String, V> valueOperations;
    
        // IDEA虽然报错,但是依然可以注入成功, 实例化操作对象后就可以直接调用方法操作Redis数据库
        @Autowired
        public RedisService(RedisTemplate<String, V> redisTemplate) {
            this.redisTemplate = redisTemplate;
            this.hashOperations = redisTemplate.opsForHash();
            this.listOperations = redisTemplate.opsForList();
            this.zSetOperations = redisTemplate.opsForZSet();
            this.setOperations = redisTemplate.opsForSet();
            this.valueOperations = redisTemplate.opsForValue();
        }
    
    
        public void hashPut(String key, HK hashKey, V value) {
            hashOperations.put(key, hashKey, value);
        }
    
        public Map<HK, V> hashFindAll(String key) {
            return hashOperations.entries(key);
        }
    
        public V hashGet(String key, HK hashKey) {
            return hashOperations.get(key, hashKey);
        }
    
        public void hashRemove(String key, HK hashKey) {
            hashOperations.delete(key, hashKey);
        }
    
        public Long listPush(String key, V value) {
            return listOperations.rightPush(key, value);
        }
    
        public Long listUnshift(String key, V value) {
            return listOperations.leftPush(key, value);
        }
    
        public List<V> listFindAll(String key) {
            if (!redisTemplate.hasKey(key)) {
                return null;
            }
            return listOperations.range(key, 0, listOperations.size(key));
        }
    
        public V listLPop(String key) {
            return listOperations.leftPop(key);
        }
    
        public void setValue(String key, V value) {
            valueOperations.set(key, value);
        }
    
        public void setValue(String key, V value, long timeout) {
            ValueOperations<String, V> vo = redisTemplate.opsForValue();
            vo.set(key, value, timeout, TimeUnit.MILLISECONDS);
        }
    
    
        public V getValue(String key) {
            return valueOperations.get(key);
        }
    
        public void remove(String key) {
            redisTemplate.delete(key);
        }
    
        public boolean expire(String key, long timeout, TimeUnit timeUnit) {
            return redisTemplate.expire(key, timeout, timeUnit);
        }

    5. test

    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class RedisTest {
        @Autowired
        RedisService redisService;
    
        @Test
        public void findAllUsers()  {
            redisService.setValue("key","hello");
        }
    
    
        @Test
        public void findAllUsers2()  {
            System.out.println("get key value:"+ redisService.getValue("key"));
        }
     }

    说明

      1. 以上是具体的配置,如果没有引入redis.clients.jedis 依赖,则会报No beans of 'RedisConnectionFactory' type found.
        版本则2.9.0 如果 版本低,则会报其它错误
      2. spring-data-redis 这个版本分为 1.x 和 2.x 版本变动挺多,不同版本方法也不一样
  • 相关阅读:
    ProGuard代码混淆
    电影资源网站分享
    mvn高级构建
    BeanUtils对象属性copy的性能对比以及源码分析
    你可能用到的Spring工具类?
    搭建K8s集群
    IDEA部署Spring-boot到Docker容器
    搭建团队协作办公wiki (confluence)
    Linux中关闭SSH的DNS解析
    责任链异步处理设计模型
  • 原文地址:https://www.cnblogs.com/guchunchao/p/10329637.html
Copyright © 2011-2022 走看看