SpringBoot2.0整合Redis

【1】pom依赖

添加redis依赖如下:

<!--整合redis-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    <!-- 1.5的版本默认采用的连接池技术是jedis  2.0以上版本默认连接池是lettuce,
    在这里采用jedis,所以需要排除lettuce的jar -->
    <exclusions>
        <exclusion>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
        </exclusion>
        <exclusion>
            <groupId>io.lettuce</groupId>
            <artifactId>lettuce-core</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<!-- 添加jedis客户端 -->
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
</dependency>
<!--spring2.0集成redis所需common-pool2 必须加上,jedis依赖此 -->
<!-- spring boot 2.0 的操作手册有标注
地址是:https://docs.spring.io/spring-boot/docs/2.0.3.RELEASE/reference/htmlsingle/-->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
    <version>2.5.0</version>
    <!--<version>2.4.2</version>-->
</dependency>

【2】yml配置

yml中对redis配置如下:

spring:
    redis:
      host: 127.0.0.1
      port: 6379
      password: admin
      jedis:
        pool:
          #最大连接数
          max-active: 1024
          #最大阻塞等待时间(负数表示没限制)
          max-wait: 20000
          #最大空闲
          max-idle: 200
          #最小空闲
          min-idle: 10
      #连接超时时间
      timeout: 10000

注意,与SpringBoot1.X整合Redis配置不同。


【3】Redis配置类

MyRedisConfig如下:

@Configuration// 必须加,使配置生效
@EnableCaching
public class MyRedisConfig extends CachingConfigurerSupport {
    /**
     * Logger
     */
    private static final Logger log = LoggerFactory.getLogger(MyRedisConfig.class);


    @Autowired
    private JedisConnectionFactory jedisConnectionFactory;


    @Bean
    @Override
    public CacheManager cacheManager() {
        // 初始化缓存管理器,在这里我们可以缓存的整体过期时间什么的,我这里默认没有配置
        log.info("初始化 -> [{}]", "CacheManager RedisCacheManager Start");
        RedisCacheManager.RedisCacheManagerBuilder builder = RedisCacheManager
                .RedisCacheManagerBuilder
                .fromConnectionFactory(jedisConnectionFactory);
        return builder.build();
    }

    @Bean
    public RedisTemplate<String, Object> redisTemplate(JedisConnectionFactory jedisConnectionFactory ) {
        //设置序列化
        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);
        // 配置redisTemplate
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
        redisTemplate.setConnectionFactory(jedisConnectionFactory);
        RedisSerializer stringSerializer = new StringRedisSerializer();
        redisTemplate.setKeySerializer(stringSerializer); // key序列化
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); // value序列化
        redisTemplate.setHashKeySerializer(stringSerializer); // Hash key序列化
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer); // Hash value序列化
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }

    @Override
    @Bean
    public CacheErrorHandler errorHandler() {
        // 异常处理,当Redis发生异常时,打印日志,但是程序正常走
        log.info("初始化 -> [{}]", "Redis CacheErrorHandler");
        CacheErrorHandler cacheErrorHandler = new CacheErrorHandler() {
            @Override
            public void handleCacheGetError(RuntimeException e, Cache cache, Object key) {
                log.error("Redis occur handleCacheGetError:key -> [{}]", key, e);
            }

            @Override
            public void handleCachePutError(RuntimeException e, Cache cache, Object key, Object value) {
                log.error("Redis occur handleCachePutError:key -> [{}];value -> [{}]", key, value, e);
            }

            @Override
            public void handleCacheEvictError(RuntimeException e, Cache cache, Object key)    {
                log.error("Redis occur handleCacheEvictError:key -> [{}]", key, e);
            }

            @Override
            public void handleCacheClearError(RuntimeException e, Cache cache) {
                log.error("Redis occur handleCacheClearError:", e);
            }
        };
        return cacheErrorHandler;
    }

}

其实这里主要是注入了自定义的redisTemplate,替换了默认的jdk 序列化机制,使存入redis中的value json化,体验更友好。


【4】测试实例

测试value为String和Object的存取。

    @Autowired
    StringRedisTemplate stringRedisTemplate;

    @Autowired
    RedisTemplate redisTemplate;

    @Test
    public void testRedis(){
        // 测试redis
        if(stringRedisTemplate.hasKey("hello")){
            String hello = stringRedisTemplate.opsForValue().get("hello");
            System.out.println("从redis中获取 key-hello--value : "+hello);
            stringRedisTemplate.opsForValue().set("jane","is a boy");

        }
        SysApk sysApk = sysApkMapper.selectByPrimaryKey(1L);
        redisTemplate.opsForValue().set("sysApk",sysApk);
        SysApk sysApk2 = (SysApk) redisTemplate.opsForValue().get("sysApk");
        System.out.println(sysApk2);
    }

参考博客:

Spring缓存默认配置与运行流程
缓存入门与注解使用示例
SpringBoot1.5使用Redis详解
Redis安装与详解系列

猜你喜欢

转载自blog.csdn.net/J080624/article/details/81534341