0%
这是一片思考的空间 -- arthinking
Spring 重构&代码整洁之道 软件设计 JVM 并发编程 数据结构与算法 分布式 存储 网络 微服务 设计模式
Java技术栈 - 涉及Java技术体系

瀑布流向下拉取加载更多导致的数据重复问题

在按照id或创建时间倒序分页查询的时候,如果列表有新增数据,翻到第二页的时候会出现跟第一页重复的数据,原因就是数据表添加了数据导致的。

在普通的分页中还是不会太影响体验的,随着瀑布流动态刷新加载的普及,越来越多的应用都采用了这种交互模式,当刷新获取下一页数据的时候,追加到列表中,如果有重复的数据就很容的观察到了。

解决这种问题的思路:

在有缓存的情况下,当页面都是读取同一时间缓存的数据时没有问题的,但是当第二页的缓存数据失效的时候,问题就来了,还是会有重复的问题的;

而在没有缓存的情况下,添加了新的 数据之后必然也会出现重复的数据;

使用缓存:

可以定时的把n页缓存到数据库中,这样获取前面n页的时候就不会有重复的问题了,但是后面的分页内容还是无法保证不重复。

使用id作为限定进行分页:

客户端记录当前分页的最后一条记录的id,然后在请求下一页的时候,从这个id开始算起进行获取一页大小的内容,比如分页大小为20,按照id倒序获取列表内容:

select * from tablename where id

优点:这种方式可以确保不会获取到重复的数据;

缺点:需要调整服务器端和客户端的分页方法,通过当前记录id和pageSize去请求服务器端。并且如果按照其他字段而不是id进行的话要确保该字段不会被修改,并且不会有重复,考虑到性能,最好加上索引,推荐使用整型字段:

select * from tablename where 排序字段<:排序字段当前记录值 order by 排序字段 desc limit 0, 20;

另外,如果需要加列表缓存,只能按照当前页的最后一条记录的ID作为key的标示,这样缓存需要的存储空间需要很多,如果列表添加数据很快,用户访问第一页的时候,总是会获取到新的数据,这样会不断的读数据库,然后写缓存,缓存利用率不高。(而类似于Hibernate的列表缓存,都是在数据表有增删改操作的时候,让列表缓存失效的,我猜也是出于数据库数据有改动的情况下缓存命中率不高,所以让列表缓存失效的,以便节省内存空间。)

客户端去重:

通过在客户端中保存已加载记录的id,进行数据去重,如果被去重的数据比较多,则可以考虑再请求下一页的数据。

优点:这种方法能确保不会出现重复的数据,并且不改动服务器端的原有逻辑;

缺点:当列表数据增加很快的情况下,比如日志记录表,获取下一页的数据会有很多的重复记录,不适合这种场景,适用于列表数据添加不是很频繁的场景;

即使是使用到了缓存,当缓存时间比较长,或者新增数据比较快时,在缓存失效之后,重新获取分页数据的时候也会有大量的重复内容的。

欢迎关注我的其它发布渠道

订阅IT宅
内功修炼
Java技术栈
Java架构杂谈是IT宅精品文章公众号,欢迎订阅:
📄 网络基础知识:两万字长文50+张趣图带你领悟网络编程的内功心法 📄 HTTP发展史:三万长文50+趣图带你领悟web编程的内功心法 📄 HTTP/1.1:可扩展,可靠性,请求应答,无状态,明文传输 📄 HTTP/1.1报文详解:Method,URI,URL,消息头,消息体,状态行 📄 HTTP常用请求头大揭秘 📄 HTTPS:网络安全攻坚战 📄 HTTP/2:网络安全传输的快车道 📄 HTTP/3:让传输效率再一次起飞 📄 高性能网络编程:图解Socket核心内幕以及五大IO模型 📄 高性能网络编程:三分钟短文快速了解信号驱动式IO 📄 高性能网络编程:彻底弄懂IO复用 - IO处理杀手锏,带您深入了解select,poll,epoll 📄 高性能网络编程:异步IO:新时代的IO处理利器 📄 高性能网络编程:网络编程范式 - 高性能服务器就这么回事 📄 高性能网络编程:性能追击 - 万字长文30+图揭秘8大主流服务器程序线程模型
📄 Java内存模型:如果有人给你撕逼Java内存模型,就把这些问题甩给他 📄 一文带你彻底理解同步和锁的本质(干货) 📄 AQS与并发包中锁的通用实现 📄 ReentrantLock介绍与使用 📄 ReentrantReadWriteLock介绍与使用 📄 ReentrantLock的Condition原理解析 📄 如何优雅的中断线程 📄 如何优雅的挂起线程 📄 图解几个好玩的并发辅助工具类 📄 图解BlockingQueue阻塞队列
📄 消息队列那么多,为什么建议深入了解下RabbitMQ? 📄 高并发异步解耦利器:RocketMQ究竟强在哪里? 📄 Kafka必知必会18问:30+图带您看透Kafka
📄 洞悉MySQL底层架构:游走在缓冲与磁盘之间 📄 SQL运行内幕:从执行原理看调优的本质 📄 洞悉Redis技术内幕:缓存,数据结构,并发,集群与算法