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

本文继上文开始讲述了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然后反序列化为实体类对象   的过程。 

  • 13
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Redis是一种开源的高性能键值存储系统,它支持丰富的数据结构,包括字符串、哈希、列表、集合和有序集合。在使用Redis时,我们可能会遇到一些问题,下面是一些常见的Redis问题及其解答。 1. Redis支持哪些数据结构? - Redis主要支持五种数据结构:字符串、哈希、列表、集合和有序集合。每种数据结构都有对应的操作命令,可以灵活地进行数据的存储和操作。 2. Redis如何保证数据的持久化? - Redis提供了两种方式来保证数据的持久化:RDB持久化和AOF持久化。RDB持久化是将数据以快照的方式保存到磁盘,AOF持久化是将写命令追加到文件末尾。可以根据需求选择适合的持久化方式。 3. Redis的主从复制是什么? - 主从复制是指将一个Redis服务器的数据复制到多个从服务器上,以实现数据的备份和读写分离等功能。主服务器将写操作同步到从服务器,从服务器只负责读操作,提高系统的并发性能和可靠性。 4. Redis如何解决并发访问的问题? - Redis采用单线程的方式处理客户端请求,通过使用非阻塞I/O和多路复用技术,实现高并发的处理能力。同时,Redis内部使用队列和锁等机制来保证并发访问的安全性。 5. Redis的数据存储位置在哪里? - Redis的数据存储在内存,这也是其高性能的主要原因之一。同时,Redis也提供RDB和AOF两种持久化机制,将数据保存到磁盘上,以防止数据丢失。 总之,掌握Redis的基本使用和原理,并了解一些常见问题的解决方法,可以更好地使用Redis来构建高性能和可靠的应用系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值