Redis学习之旅--与SpringBoot的结合

Posted 赵jc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis学习之旅--与SpringBoot的结合相关的知识,希望对你有一定的参考价值。


在学习SpringBoot整合Redis之前我们先来了解一下Jedis。

Jedis

概念

Jedis 是 Redis 官方推荐的 java连接开发工具! 使用Java 操作Redis 中间件!如果你要使用java操作redis,那么一定要对Jedis 十分的熟悉!

使用

  • 1、导入对应的依赖
 <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>4.0.1</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.38</version>
 </dependency>
  • 2、编码测试:

连接数据库
操作命令
断开连接!
代码

/**
 * 测试Jedis连接
 */
public class TestPing 
    public static void main(String[] args) 
        //1.new Jedis对象即可
        Jedis jedis = new Jedis("127.0.0.1",6379);
         //测试连接
        System.out.println(jedis.ping());
    


常用的API,所有的api命令与Redis没有区别。这里重点讲一下事务的相关API,其他的API使用可以参考这里:

public class TestMulti 
    public static void main(String[] args) 
        //创建客户端连接服务端,redis服务端需要被开启
        Jedis jedis = new Jedis("127.0.0.1", 6379);
        jedis.flushDB();

        JSONObject jsonObject = new JSONObject();
        jsonObject.put("hello", "world");
        jsonObject.put("name", "java");
        //开启事务
        Transaction multi = jedis.multi();
        String result = jsonObject.toJSONString();
        try 
            //向redis存入一条数据
            multi.set("json", result);
            //再存入一条数据
            multi.set("json2", result);
            //这里引发了异常,用0作为被除数
            int i = 100/0;
            //如果没有引发异常,执行进入队列的命令
            multi.exec();
         catch (Exception e) 
            e.printStackTrace();
            //如果出现异常,回滚
            multi.discard();
         finally 
            System.out.println(jedis.get("json"));
            System.out.println(jedis.get("json2"));
            //最终关闭客户端
            jedis.close();
        
    

SpringBoot

SpringBoot 操作数据:spring-data jpa jdbc mongodb redis!
SpringData 也是和 SpringBoot 齐名的项目!
说明: 在 SpringBoot2.x 之后,原来使用的jedis 被替换为了 lettuce?

  • jedis : 采用的直连,多个线程操作的话,是不安全的,如果想要避免不安全的,使用 jedis pool 连接 池! 更像 BIO 模式
  • lettuce : 采用netty,实例可以再多个线程中进行共享,不存在线程不安全的情况!可以减少线程数据 了,更像 NIO 模式

配置文件源码分析:

 @Bean
    @ConditionalOnMissingBean(
        name = "redisTemplate"
    )
    //ConditionalOnSingleCandidate 如果没有这个类,则使用这个类
    //我们可以自己定义一个redisTemplate来替换这个默认的!
 @ConditionalOnSingleCandidate(RedisConnectionFactory.class)
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) 
    //默认的 RedisTemplate 没有过多地设置,redis对象都是需要序列化的!
    //两个泛型都是 Object类型,我们之后使用需要强制类型转换 <String Object>
        RedisTemplate<Object, Object> template = new RedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    

    @Bean
    @ConditionalOnMissingBean
    //由于string 是redis中最常使用的类型,所以说单独提出来了一个bean!@ConditionalOnSingleCandidate(RedisConnectionFactory.class)
    public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) 
        return new StringRedisTemplate(redisConnectionFactory);
    

整合测试

1、导入依赖

		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

2、配置连接

# 配置redis 
spring.redis.host=127.0.0.1 
spring.redis.port=6379

3、测试!

@SpringBootTest
class RedisSpringbootApplicationTests 

    @Autowired
    private RedisTemplate<String,String> redisTemplate;

    @Test
    void contextLoads() 
        // redisTemplate 操作不同的数据类型,api和我们的指令是一样的
        // opsForValue 操作字符串 类似String
        // opsForList 操作List 类似List
        // opsForSet
        // opsForHash
        // opsForZSet
        // opsForGeo
        // opsForHyperLogLog
        // 除了进本的操作,我们常用的方法都可以直接通过redisTemplate操作,比如事务,和基本的 CRUD
        // 获取redis的连接对象
//        RedisConnection connection = redisTemplate.getConnectionFactory().getConnection();
//        connection.flushDb();
//        connection.flushAll();
        redisTemplate.opsForValue().set("key","myValue");
        System.out.println(redisTemplate.opsForValue().get("key"));
    


自己的 RedisTemplete

因为默认的序列化方式是JDK序列化,我们可能会用到Json来序列化,我们来编写一个自己的 RedisTemplete,方便使用

@Configuration
public class RedisConfig 

  @Bean
  @SuppressWarnings("all")
  public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) 
      RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
      template.setConnectionFactory(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);
      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;
  
  

以上是关于Redis学习之旅--与SpringBoot的结合的主要内容,如果未能解决你的问题,请参考以下文章

Java学习路线!java官方入门教程pdf

SpringBoot 结合RabbitMQ与Redis实现商品的并发下单SpringBoot系列12

Java开发手册!java初级面试题框架

Redis学习之旅--订阅与发布

Java开发者!switch语法结构java

业内“大师级Dubbo实战笔记”面世,年薪60W必备