前端用什么技术,才能合理缓存分页结果?

2022-01-31 21:58:39 +08:00
 3dwelcome

举个例子,AJAX 返回了 200 条电影数据,我想把数据直接缓存到前端。

但问题是,当后台数据有更新,新数据怎么以最小的流量,以差分模式,同步到前端?

有点类似数据库的主从备份,有什么好的参考实现吗?

3356 次点击
所在节点    问与答
24 条回复
torenayto
2022-01-31 22:03:30 +08:00
wunonglin
2022-01-31 22:03:44 +08:00
我觉得你的实现想法有问题。原始需求是什么?
3dwelcome
2022-01-31 22:14:42 +08:00
@wunonglin 需求是 APP 需要展示 TOP 1000 条电影数据。

我希望只取一次数据到客户端,数据用 WebView 给缓存起来。

后续每次都向服务器查询有没有新数据,有的话就更新一下本地数据列表,没有的话就直接展示出来。
3dwelcome
2022-01-31 22:16:43 +08:00
@torenayto "https://swr.vercel.app/zh-CN"

这确实是分页,但我这个分页在前端。

而这网站提供的技术,好象是后端分页缓存方案。
agagega
2022-01-31 22:20:34 +08:00
你在本地带 ID 做一个 OrderedMap ,请求的时候做 merge 就可以了。如果要实现你想的「最小的请求」,需要后端 API 也做配合,比如加一个 newer_than 参数,只返回比这个元素更新创建的所有元素。
wunonglin
2022-01-31 22:21:22 +08:00
@3dwelcome #3 这种需求 http 缓存不就好了么。https://zhuanlan.zhihu.com/p/64694485
vanton
2022-01-31 22:22:34 +08:00
传递一个 ID 列表。

两个方案:
1 、前端发送一个当前列表给后端,后端发送差分数据给前端。
2 、后端发送列表,前端对比后给一个差分请求,后端返回实际数据。

两个方案各有优势,看你是什么需求。
wunonglin
2022-01-31 22:27:49 +08:00
@3dwelcome #3 再说。你这样要么用 http 的缓存,要么每次都要向后端请求 ver 之类的信息去检查。

每次请求的话可以传个 map 去检查{index: id},然后返回对应新的{index: id}。然后你再比较那个电影详情数据没获取,你再单独获取那个电影的信息就行了。
3dwelcome
2022-01-31 22:28:28 +08:00
@vanton 我用的是第一个方案,想找一些类似参考代码,自己写差分算法,总觉得很山寨。

可惜好像大家很少这样做,代码不太好找。
3dwelcome
2022-01-31 22:30:49 +08:00
@wunonglin 我是想把这个功能给抽象出来,未来适配所有的列表查询代码。

在移动互联网时代,能减少一点网络流量,那也是好的。
cp19890714
2022-01-31 22:50:37 +08:00
你提供的信息有点少。我只能根据我看到的提出我的方案。
## 后段接口:
* 参数:updatTime-已有数据的最大更新时间。
* 逻辑:
1. 如果 updateTime 不是空,则查询数据时,根据 updateTime 筛选,并给出最大的 updateTime 。
2. 如果 updateTime 是空,则响应 1000 条数据,并给出最大的 updateTime 。
当有数据更新时,需要更新数据的 updateTime

## 前段
* 首次请求,没有 updateTime 参数,会得到 1000 条数据,以及 updateTime 。
* 下次请求,把 updateTime 传给后段,得到差异数据。并在此缓存 updateTime 。
cp19890714
2022-01-31 22:51:53 +08:00
@cp19890714 抱歉,用平板打字,好多错字
3dwelcome
2022-01-31 23:03:58 +08:00
@cp19890714 updateTime 可以查询有没有新数据。

可如果服务器删除了 1000 条里其中几条记录,怎么去通知前端也删除呢?
enki0423
2022-01-31 23:39:21 +08:00
@3dwelcome websocket
cp19890714
2022-01-31 23:43:58 +08:00
@3dwelcome
后端删除通常是逻辑删除,那么还是会有更新时间的。
如果你的后端必须是物理删除,那么就需要传所有数据的 id ,进行对比了。
------------------------
另外,我认为这个需求是伪需求。
1. 使用压缩算法后,响应流量可以大大减少,1000 条数据,应该不会耗费多少流量。
2. 即使每条数据有 100 个字段,流量真的较大,那么应该分为两个接口,1 个接口拿列表,1 个接口拿详情。列表接口的响应流量还是会极少,详情接口的结果进行缓存。
lrvinye
2022-02-01 01:28:14 +08:00
react-query 有实现
micean
2022-02-01 09:25:49 +08:00
都展示 top 1k 了,就没考虑流量问题啊,也不知道考虑过 filter 的问题没有。
维护 2 个数据集,一个是 top 1k + version ,一个是变化数据( id|action|version ),剩下的懂的
weiyx
2022-02-01 10:43:45 +08:00
swr 了解一下
Rheinmetal
2022-02-01 11:39:52 +08:00
后端预先做好 delta 呗
cyrbuzz
2022-02-01 20:45:38 +08:00
可以做类似 304 缓存的查询吧,询问是否有更新,有更新则把缓存的 ID 都带上给后端做对比,返回差值,然后前端更新缓存。

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

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

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

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

© 2021 V2EX