• redis 无法存储Java对象的两种解决方案


    1.情景展示

      由上一篇,我们了解到redis不能直接存储Java对象,这对于我们Java语言是非常非常不友好的,因为我们经常进行数据的操作是通过对象来完成的。如何解决这个痛点问题? 

    2.方案一:序列化与反序列化

      因为Redis 只能支持六种数据类型(string/hash/list/set/zset/hyperloglog)的操作,导致我们无法直接将对象直接存入 Redis 内存中,所以在需要 Redis 存储的六中数据类型与 Java 对象之间进行转换;

      最常见的一种替代方案就是:通过序列化和反序列化来实现,即:

      我们可以把对象序列化之后存入Redis缓存中,然后在取出的时候又通过转换器,将序列化之后的对象反序列化回对象,这样就完成了我们的要求。

      序列化和反序列化听不懂?用大白话翻译一下:

      序列化:将Java对象转成json字符串;反序列化:将json字符串转Java对象。

      通过这种方式,来达到曲线救国的目的。

      具体代码,我这里没有,因为这种方式我是不推荐使用的,理由是:太复杂,而且序列化和反序列化自己手动来封装的话,也容易出问题!!!

      对于redis缓存的操作,还是通过注入StringRedisTemplate来完成。

    3.方案二:spring注解

      弃用通过StringRedisTemplate的方式操作redis,改用原生注解@CachePut,@Cacheable,@CacheEvict来操作redis;

      可能你不知道,使用spring自带的缓存也是可以实现Java对象的存取,下篇文章会详解介绍;

      事实上,经过实际测试发现:通过这三个原生的缓存注解,足以化解redis不能存储Java对象的尴尬,一起来看一下:

      前提:开启spring缓存

    @EnableCaching
    

      要想使用spring缓存,就必须先开启缓存:在springboot启动项目的Java类加上此注解。

      关于返回值是map,而不是Java对像的说明:

      这里,我已经用红框进行了标注,我再次用的是Map,而没用Java实体类,并不是博主睁着眼睛说瞎话,而是我懒得改了,你把这里换成实体类,同样会被存进redis中的;

      不信自己可以试试,或在下篇文章也能找到答案,一起来看redis的存储数据结果:

      上面的x**代表的是中文字符。

      下一步:怎么证明二次请求是从缓存中读取的数据,而不是从数据库获取的呢?

      双管齐下:

      在从数据库获取数据的地方加个断点

      (我现在就是以debug模式启动的,这是一个好习惯,方便在想要调试的时候,不用再以debug模式重启项目)

      这是第一次执行方法后输出的SQL语句(这也就证明了当时redis里是没有这个key的)

      清空控制台日志记录,此时,我们再从前端发送一次请求,我们会发现:

      既没有走断点,控制台也没有SQL输出。

      这样,就证明了:数据是从redis缓存中拿到的。 

      至此,就证明了通过spring原生缓存注解就能够完成Java对象与redis存储数据之间的自由转化。 

      哪种方案更加方便,相信大家都得出了结论。这篇文章到此也就结束啦。

      你可能会说:@CachePut和@CacheEvict还没有讲呢,我想说的是:这三个原生的spring缓存原生注解,其实和redis没有任何关系,脱离了redis照样可以使用;

      反倒是redis依赖它们三个,对于我们开发来说将会方便许多;

      所以,我单处写了一篇文章,讲解了它们三个如何完成对缓存库的增删改查,见文末推荐。

    写在最后

      哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!

     相关推荐:

  • 相关阅读:
    软件需求与建模 复习笔记
    Autoware 笔记No.9,SSD车辆、行人(障碍物)识别(ssd vision detect)
    Autoware 笔记No.8 ENet 障碍物识别(vision segment ENet detect)
    Autoware 1.14 完整安装
    Autoware 笔记No.7, CNN障碍物检测(CNN LiDAR Baidu Object Segmenter)
    iOS 使用局部block处理接口依次调用需求
    阿里一面凉经
    Codeforces round #717 D.Cut(m询问求区间[L,R]能被至少分成多少个区间让每个小区间各数的乘积==各数的LCM)
    2018-2020 国家集训队论文选读
    GDOI 2021 游记
  • 原文地址:https://www.cnblogs.com/Marydon20170307/p/14125362.html
Copyright © 2020-2023  润新知