zoukankan      html  css  js  c++  java
  • SpringBoot整合Redis

    SpringBoot整合

    在SpringBoot2.x之后,原来使用的Jedis被替换成了Lettuce

    Jedis:采用的直连,多个线程操作,是不安全的,如果想要避免需要使用Jedis pool连接池!更像 BIO

    Lettuce:采用entty,实例可以在多个线程中进行共享,不存在线程不安全的情况,可以减少线程数据,更像 NIO

    源码分析:

    RedisAutoConfiguration.java

    @Bean
    @ConditionalOnMissingBean(name = "redisTemplate") //可以自定义redisTemplate来替换默认的
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)
          throws UnknownHostException {
        //默认的RedisTemplate没有过的设置,redis对象都是需要序列化的
        //两个泛型都是<Object, Object>的类型,使用的时候要强制转化<String, Object>
       RedisTemplate<Object, Object> template = new RedisTemplate<>();                 
       template.setConnectionFactory(redisConnectionFactory);
       return template;
    }
    
    @Bean
    @ConditionalOnMissingBean	//由于String 是Redis中常用的类型,所以单独设置一个Bean
    public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory)
          throws UnknownHostException {
       StringRedisTemplate template = new StringRedisTemplate();
       template.setConnectionFactory(redisConnectionFactory);
       return template;
    }
    

    整合测试

    • 导入依赖

      <!--Redis-->
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-data-redis</artifactId>
      </dependency>
      
    • 配置连接

      相关配置可以在RedisProperties类中查看

      # 配置Redis
      spring.redis.host=127.0.0.1
      spring.redis.port=6379
      
    • 连接测试

      @SpringBootTest
      class Redis02SpringbootApplicationTests {
      
          @Autowired
          private RedisTemplate redisTemplate;
      
          @Test
          void contextLoads() {
              /*
               *  redisTemplate  操作不同的数据类型,api和指令是一样的
               *  opsForValue    操作字符串,类似String
               *  opsForList     操作list,类型list
               *  opsForSet
               *  opsForHash
               *  opsForZSet
               *  opsForGeo
               *  opsForHyperLogLog
               *
               *  常用方法可以直接通过redisTemplate操作。比如:事务、CRUD
               */
              //获取Redis连接对象
              RedisConnection connection = redisTemplate.getConnectionFactory().getConnection();
              System.out.println(connection.ping());
              connection.flushDb();
      
              //redisTemplate.opsForValue().set("name","Beloved");
              redisTemplate.opsForValue().set("name","张三");
              System.out.println(redisTemplate.opsForValue().get("name"));
      
          }
      
      }
      

    image-20200506145736010

    关于序列化

    Redis存入所以的对象都要序列化,否则会产生中文乱码

    image-20200506145917460

    image-20200506150112439

    image-20200506151102775

    编写RedisTemplate

    //编写RedisTemplate
    @Bean
    @SuppressWarnings("all")
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory){
    
        //一般使用<String, Object>类型
        RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
        template.setConnectionFactory(factory);
    
        //Json序列化配置
        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);
    
        //String序列化配置
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
    
        //key采用String的序列化方式
        template.setKeySerializer(stringRedisSerializer);
        //hash的key采用String的序列化
        template.setHashKeySerializer(stringRedisSerializer);
        //value采用jackson序列化方式
        template.setValueSerializer(jackson2JsonRedisSerializer);
        //hash的value采用jackson序列化方式
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        template.afterPropertiesSet();
    
        return template;
    }
    

    测试

    image-20200506153438932

    image-20200506153500628

  • 相关阅读:
    Codeforces 177G2 Fibonacci Strings KMP 矩阵
    Codeforces Gym100187C Very Spacious Office 贪心 堆
    Codeforces 980F Cactus to Tree 仙人掌 Tarjan 树形dp 单调队列
    AtCoder SoundHound Inc. Programming Contest 2018 E + Graph (soundhound2018_summer_qual_e)
    BZOJ3622 已经没有什么好害怕的了 动态规划 容斥原理 组合数学
    NOIP2016提高组Day1T2 天天爱跑步 树链剖分 LCA 倍增 差分
    Codeforces 555C Case of Chocolate 其他
    NOIP2017提高组Day2T3 列队 洛谷P3960 线段树
    NOIP2017提高组Day2T2 宝藏 洛谷P3959 状压dp
    NOIP2017提高组Day1T3 逛公园 洛谷P3953 Tarjan 强连通缩点 SPFA 动态规划 最短路 拓扑序
  • 原文地址:https://www.cnblogs.com/ndbxy/p/12850934.html
Copyright © 2011-2022 走看看