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

2020-09-21 15:23:33 +08:00
 qwerthhusn

比如,用的 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[]返回给客户端,省掉一次反序列化和序列化的流程。但是这样写的感觉可读性不强,而且写法也比较麻烦。

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

1788 次点击
所在节点    程序员
6 条回复
canbingzt
2020-09-21 16:13:34 +08:00
qwerthhusn
2020-09-21 16:21:54 +08:00
Cacheable 只是简化了获取逻辑,但是还是需要进行反序列化和二次序列化的
@canbingzt
joesonw
2020-09-21 17:31:33 +08:00
这种 get 一下的请求, encode/decode 的 cpu 消耗很小的. 而且万一请求后面还有 filter, 例如数据字段脱敏呢?
doufum
2020-09-21 17:40:08 +08:00
1. spring 的 redisTemplate,配置的时候加上 value 序列化方式,取的时候转型一下就行了啥
2. 自己写 Redis 工具类的化,重载一下 get 方法,对 value 的序列化 /反序列化加入到重载的方法里面,入参 class 泛型,返回直接接受
3. 接口加注解,统一 AOP 处理,在 AOP 的方法里面处理转型、序列化、反序列化(配合 1,2 )
qwerthhusn
2020-09-21 17:56:27 +08:00
@joesonw 是的,突然这么一想也对,相对于耗时的 IO 操作,执行一些 CPU 和内存任务很快,这点点优化基本上没太多意义。系统的瓶颈也不会出现在这里。。。。。。这么理解没错吧
yejianmail
2020-09-21 18:37:16 +08:00
你这里可以直接用 String 的 redisTemplate

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/709054

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX