Redis学习篇2:Redis在IEDA中的应用

本文继上文开始讲述了Redis在IDEA中如何应用以及集成进入spring开发环境,以及如何使用Redis客户端。上一个文章:Redis学习篇1:初识Redisicon-default.png?t=N7T8https://blog.csdn.net/jialuosi/article/details/139057088

一、Redis在java中的客户端

二、SpringDataRedis

三、SpringDataRedis快速入门

3.1、使用SpringDataRedis

3.2、序列化与反序列化

3.3、StringRedisTemplate


一、Redis在java中的客户端

  • Jedis和Lettuce:这两个主要是提供了Redis命令对应的API,方便我们操作Redis,而SpringDataRedis又对这两种做了抽象和封装,因此我们后期会直接以SpringDataRedis来学习。

  • Redisson:是在Redis基础上实现了分布式的可伸缩的java数据结构,例如Map.Queue等,而且支持跨进程的同步机制:Lock.Semaphore等待,比较适合用来实现特殊的功能需求。

上述两种是相当于原生的java客户端,在目前大部分都是spring的开发环境下,早已不流行使用,接下来我们着重的讲一下SpringDataRedis。

二、SpringDataRedis

SpringData是Spring中数据操作的模块,包含对各种数据库的集成,其中对Redis的集成模块就叫做SpringDataRedis,官网地址:Spring Data Redis

  • 提供了对不同Redis客户端的整合(Lettuce和Jedis)

  • 提供了RedisTemplate统一API来操作Redis

  • 支持Redis的发布订阅模型

  • 支持Redis哨兵和Redis集群

  • 支持基于Lettuce的响应式编程

  • 支持基于JDK.JSON.字符串.Spring对象的数据序列化及反序列化

  • 支持基于Redis的JDKCollection实现

我们在学习篇1中曾经提到过,Redis不同于MySQL,他在不同的环境下查询语句并不相同,之前操作String用set,get等,操作Hash用hset,hget等,但是在SpringDataRedis中提供了RedisTemplate工具类,其中封装了各种对Redis的操作。并且将不同数据类型的操作API封装到了不同的类型中:

关说不练没意义,我们继续往下看如何在项目中集成SpringDataRedis。

三、SpringDataRedis快速入门

3.1、使用SpringDataRedis

想要使用SpringDataRedis非常简单,只需要执行以下三个使用步骤:

  • 引入spring-boot-starter-data-redis依赖

    • <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
      </dependency>
  • 在application.yml配置Redis信息

    • server:
        port: 8081
      spring:
        redis:
          host: 127.0.0.1
          port: 6379 
          password: 123456 #没有则不用填
          lettuce:
            pool:
              max-active: 8  #最大连接
              max-idle: 8   #最大空闲连接
              min-idle: 0   #最小空闲连接
              max-wait: 100ms #连接等待时间
  • 注入RedisTemplate

    • @SpringBootTest
      class RedisDemoApplicationTests {
      
          @Autowired
          private RedisTemplate<String, Object> redisTemplate;
      
          @Test
          void testString() {
              // 写入一条String数据
              redisTemplate.opsForValue().set("name", "jialuosi");
              // 获取string数据
              Object name = redisTemplate.opsForValue().get("name");
              System.out.println(name);
          }
      }

3.2、序列化与反序列化

        RedisTemplate可以接收任意Object作为值写入Redis,只不过写入前会把Object序列化为字节形式,默认是采用JDK序列化,得到的结果是这样的:(值就是我们存入的name的value:jialuosi)

这种序列化的方式,其缺点已经非常的明显:可读性非常差,内存占用较大。所以该如何解决呢?

  • 方案一:

    • 自定义RedisTemplate

    • 修改RedisTemplate的序列化器为GenericJackson2JsonRedisSerializer

    • 缺点:为了在反序列化时知道对象的类型,JSON序列化器会将类的class类型写入json结果中,存入Redis,会带来额外的内存开销。

  • 方案二:

    • 使用StringRedisTemplate

    • 写入Redis时,手动把对象序列化为JSON

    • 读取Redis时,手动把读取到的JSON反序列化为对象

因为种种原因,方案一也有很多的问题,所以我们之间讲解方案二、避免白雪。

3.3、StringRedisTemplate

        为了减少内存的消耗,我们可以采用手动序列化的方式,换句话说,就是不借助默认的序列化器,而是我们自己来控制序列化的动作,同时,我们只采用String的序列化器,这样,在存储value时,我们就不需要在内存中就不用多存储数据,从而节约我们的内存空间。

        这种用法比较普遍,因此SpringDataRedis就提供了RedisTemplate的子类:StringRedisTemplate,它的key和value的序列化方式默认就是String方式。

而关于如何序列化以及反序列化可以看我的这篇文章:JAVA:浅谈JSON与JSON转换icon-default.png?t=N7T8https://blog.csdn.net/jialuosi/article/details/139005572

下面是实操代码,其中实体类只赋值了ID以及名字,从   序列化为JSON数据存入Redis   到    从Redis中取出JSON然后反序列化为实体类对象   的过程。 

猜你喜欢

转载自blog.csdn.net/jialuosi/article/details/139064320