一个话题topic对象,有很多属性,比如:主键id、回复数replyCount、标题title、楼层数floor、浏览数views等等,相对应的,数据库里面也有一个topic表,保存这些属性字段。topic对象放在缓存里,缓存找不到,再去DB找。当topic对象有属性更改时,清空缓存,以保证数据一致性。
下面主要说说浏览数views和回复数replyCount这两个属性是怎么读写分离的,下面的"帖子"也就是"话题"的意思。
对于论坛来说,一般网友只是看帖不回帖,也就是说,一个帖子对象,大多数情况下,只有views这个字段值被频繁地增加,如果每次DB里面views增加1都要清空topic缓存的话,下次找topic对象,缓存找不到,再去DB找,多少会增加服务器负担。
一个改进的作法是
(1)另外建一个表,比如叫topic_counter,保存topic的主键id和总的浏览数count
(2)用一个缓冲区计数器count,每次帖子页面刷新,缓冲计数器count+1,增加缓存中topic的浏览数,而页面读取浏览数,也只是到缓存里面读
(3)帖子页刷新到一个指定的数量比如400之后,就是说缓冲区计数器count等于400的时候,把缓存中的记录直接同步到DB的topic_counter表中,然后用定时任务(独立于web程序之外的groovy脚本之类),把topic_counter表的浏览数count同步到topic表的views字段中。
或者,缓冲区计数器count刷新到400之后,把缓存中浏览数的记录写到一个文件上,然后再用定时任务同步文件的数据到topic_counter表和topic表中。定时任务可以每15分钟跑一次。
(4)最后,缓冲区计数器count重置为0,重新开始计数。
(5)页面显示浏览数的时候,可以用js后出的方式显示,以便加快页面加载速度。
上面为了读取帖子性能增强,关于帖子浏览数的读写操作确实有点绕,也是无奈做法,当然,可能还更好的方案,暂时没研究那么深入。这个方案的帖子浏览数数据可能是不准确的,比如说断电缓存丢失什么的,对于论坛这种数据准确性要求不是很高的情况下,是可以接受的。
还有,数据量大的时候,还有注意topic分表和topic_counter分表的准确性。
相关推荐
springboot结合mysql主从来实现读写分离 一、实现的功能 1、基于springboot框架,application.yml配置多个数据源,使用AOP以及AbstractRootingDataSource、ThreadLocal来实现多数据源切换,以实现读写分离。mysql...
读写分离就是对于一条SQL该选择哪一个数据库去执行,至于谁来做选择数据库这件事,有两个,要么使用中间件帮我们做,要么程序自己做。一般来说,读写分离有两种实现方式。第一种是依靠中间件MyCat,也就是说应用程序...
oracle11g读写分离配置文档,Mycat软件及相关linux安装adg方式的rpm插件包
文档中包括mysql的读写分离,与mycat的读写分离,因为mycat读写是基于mysql的,所以首先需要部署mysql读写
本代码为C#语言实现Redis数据库读写分离的实例。
MyBatis做读写分离
Mybatis读写分离,支持n多的从库,简单的负载均衡。数据库是mysql,采用druid连接池。 读写分离采用插件的形式实现的,优点是不需要写源注解,不需要写分开的Mapper.xml。 如果只有主库的话,那么会创建两个地址相同...
springBoot+mybatis+AOP实现读写分离,在代码层面直接实现,无需任何插件,简单易懂,非常适合作为解决数据库并发大的解决方案
基于Mycat的读写分离教程。一步一步带你实现主从复制读写分离。
mycat 读写分离 优化
基于Mycat的Mysql主从复制读写分离配置详解与示例,DBA必看的
MYSQL读写分离最佳实战,面对越来越大的访问压力,单台的服务器的性能成为瓶颈,需要分担负载
简单的redis读写分离demo 用的是依赖注入的方式,redis用的是主从复制
mysql 读写分离软件
• 读写分离,解决“数据库读性能瓶颈”问题 • 水平切分,解决“数据库数据量大”问题 • 对于互联网大数据量,高并发量,高可用要求高,一致性要求高,前端面向用户的业务场景,微服务缓存架构,可能比数据库读写...
springboot数据库读写分离,代码实现一主两从的读写分离,业务代码不影响,正常写就可以。可以根据自己需要修改
Spring实现数据库读写分离/spring事务配置解释(Annotation/Spring AOP/Reflection)的辅助sql
springaop多数据库读写分离
springboot+mybatis+mysql实现读写分离 先在建好mysql主从数据库的配置,然后在代码中根据读写分离或强制读取master数据库中的数据 mysql数据库设置主从,参考: ...
java mysql 读写分离demo mybatis作为数据库访问层,实现数据库读写分离的解决方案