V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
qwerthhusn
V2EX  ›  程序员

很多业务用 Redis 做了缓存,假如客户端命中的缓存,那还需要先从 Redis 中读取的数据反序列化成对象再序列化成 JSON 给前端吗?

  •  
  •   qwerthhusn · 2020-09-21 15:23:33 +08:00 · 1787 次点击
    这是一个创建于 1526 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如,用的 Spring Web RestController

    @GetMapping("/data")
    public Data get() {
      byte[] dataBS = redis.get("key");
      if (dataBS == null) {
        return getFromDB();
      } else {
        // 可能用了 Kryo 或者 FST 或者 Protobuf 等序列化协议
        Data data = deserialize(dataBS, Data.class);
        return data;
      }
    }
    

    总感觉可以直接存 JSON,然后从 Redis 中直接取出 byte[]返回给客户端,省掉一次反序列化和序列化的流程。但是这样写的感觉可读性不强,而且写法也比较麻烦。

    请问大佬们,一般遇到这种情形,你们都是咋做的?

    6 条回复    2020-09-21 18:37:16 +08:00
    canbingzt
        1
    canbingzt  
       2020-09-21 16:13:34 +08:00
    qwerthhusn
        2
    qwerthhusn  
    OP
       2020-09-21 16:21:54 +08:00
    Cacheable 只是简化了获取逻辑,但是还是需要进行反序列化和二次序列化的
    @canbingzt
    joesonw
        3
    joesonw  
       2020-09-21 17:31:33 +08:00   ❤️ 1
    这种 get 一下的请求, encode/decode 的 cpu 消耗很小的. 而且万一请求后面还有 filter, 例如数据字段脱敏呢?
    doufum
        4
    doufum  
       2020-09-21 17:40:08 +08:00
    1. spring 的 redisTemplate,配置的时候加上 value 序列化方式,取的时候转型一下就行了啥
    2. 自己写 Redis 工具类的化,重载一下 get 方法,对 value 的序列化 /反序列化加入到重载的方法里面,入参 class 泛型,返回直接接受
    3. 接口加注解,统一 AOP 处理,在 AOP 的方法里面处理转型、序列化、反序列化(配合 1,2 )
    qwerthhusn
        5
    qwerthhusn  
    OP
       2020-09-21 17:56:27 +08:00
    @joesonw 是的,突然这么一想也对,相对于耗时的 IO 操作,执行一些 CPU 和内存任务很快,这点点优化基本上没太多意义。系统的瓶颈也不会出现在这里。。。。。。这么理解没错吧
    yejianmail
        6
    yejianmail  
       2020-09-21 18:37:16 +08:00 via Android
    你这里可以直接用 String 的 redisTemplate
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3201 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 00:38 · PVG 08:38 · LAX 16:38 · JFK 19:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.