网站缓存数据实时更新的实现

一个网站的实现不可避免的需要处理大量的内存数据,这大多都出于网站性能的考虑和解决I/O瓶颈问题,如JavaEye网站的首页排名数据和博客频道的排名等数据,都进行了缓存处理,而且并非是实时的,特别是首页的排名数据几乎是一天才会更新一次的,同样,QQ等门户网站也存在大量静态化内存数据,所以一个网站缓存的处理是至关重要的,并且好的架构需要做到代码无侵入性,也就是说内存的更新,日志的记录等操作都应该是“切面”处理,在我后来的网站开发中,我一般都会定义一个缓存类,如下:

Java代码

public static LinkedList<Login> regRecentUser=new LinkedList(); //最近注册人员
 public static LinkedList<Login> regLoginedUser=new LinkedList();//最近登录人员
 public static List<Topic> hotTopic=new ArrayList();//最热发表话题

并且会自己实现对象的排序接口,如最热门的话题,可能是按话题对象的某几个属性的权重分配来实现的,类似代码如下:

Java代码

public class TopicCompare implements Comparator{
    //热门的话题与顶的数目和评论的数目有关,权重分配比例为4:6 
 public int compare(Object arg0, Object arg1) {
 if((arg0 instanceof Topic) && (arg1 instanceof Topic)){
  double y=((Topic)arg0).getAgreeit()*0.4 + ((Topic)arg0).getCmtnum()*0.6;
  double h=((Topic)arg1).getAgreeit()*0.4 + ((Topic)arg1).getCmtnum()*0.6;
  if(y==h) return 0;
  else if(y>h) return 1;
  else return -1;
 }
 return 0;
 }

}

缓存的切面更新一般我喜欢使用Spring AOP,简单而实用,一般需求都能满足,Aspect语法比较复杂,没时间看,呵呵

Java代码

import java.lang.reflect.Method;

import org.springframework.aop.AfterReturningAdvice;

import com.common.cache.WebCacheUtils;
import com.cxlh.dao.hibernate.Login;

public class LoginAdvice implements AfterReturningAdvice {
 public void afterReturning(Object returnValue, Method method, Object[] args,
  Object target) throws Throwable {
 if(method.getName().equalsIgnoreCase("checkUserLogin") && !returnValue.toString().equalsIgnoreCase("null")){
  //最近登录用户缓存更新
  System.out.println("=======update login cache");
  WebCacheUtils.addRegLoginedUser((Login)returnValue);
 }else if(method.getName().equalsIgnoreCase("addUser")){
  //更新最新注册用户缓存
  System.out.println("=======update add user cache");
  WebCacheUtils.addRegRecentUser((Login)args[0]);
 }
 }
}

这样,最近登录和最新注册用户的缓存数据都会按自定义排序规则进行实时的缓存更新了,不知道这样的实时缓存处理对于大并发量的网站是否能满足要求,没有进行过性能测试!慎用!!!

时间: 2024-11-05 16:40:53

网站缓存数据实时更新的实现的相关文章

使用php+swoole对client数据实时更新(二) (转)

上一篇提到了swoole的基本使用,现在通过几行基本的语句来实现比较复杂的逻辑操作: 先说一下业务场景.我们目前的大多数应用都是以服务端+接口+客户端的方式去协调工作的,这样的好处在于不论是处在何种终端的情况下,都可以完美的和服务端兼容.这样就轻松实现了MVC各个部分的真正解耦.但是提高程序的友好性还是有很多路要走,其中一个大家都会遇到的就是数据实时更新的问题.比如一个用户在手机上做了添加操作,这时候其他的终端也应该及时显示数据的变化情况.这个对于手机来说还算好办,因为现在的各种推送服务完全可以

shell实现定期清理网站缓存数据

如果第一个脚本不行,可以尝试第二个脚本方案! 网站采用了一些方法进行加速(redis\cdn),这样就降低用户访问后端mysql的压力.以及前端速度不太好的问题,对用户请求到的所有页面进行了缓存,既然数据缓存了,解决用户看到的页面是否为最新页面就提上日程,下面这个脚本就诞生了. #!/bin/bash # Author:Byrd # Version:0.1 # Site:www.111cn.net # Contact:root#111cn.net # define category for ca

华师大开通法文网站 实现信息实时更新

东方网1月28日报道:在中法建交49周年之际,由华东师范大学http://www.aliyun.com/zixun/aggregation/18870.html">自主研发的全国985高校首个法文网站正式开通. 网站由学校概况.校园生活.入学申请.院系设置.科研力量.国际合作六个固定信息版块和8206.html">实时更新的学校新闻栏目组成.在国际合作板块,华东师大的国际合作伙伴尤其是合作的法国高校和科研机构将得到呈现并能直接链入合作方的网站. 新闻栏目则与学校中文网.英文

使用php+swoole对client数据实时更新(一)_php实例

如果想对一个列表做实时的更新,传统的做法是采用轮询的方式.以web为例,通过Ajax定时请求服务端然后获取数据显示在页面.这种方式实现简单,缺点就是浪费资源. HTTP1.1新增加了对websocket的支持,这样就可以将被动展示转变为主动通知.也就是通过websocket与服务端保持持久链接,一旦数据发生变化,由server通知client数据有更新,然后再进行刷新等操作.这样就省去了很多不必要的被动请求,节省了服务器资源. 要实现一个webscoket的程序,首先需要使用支持html5的浏览

linux中利用shell定时清理网站缓存数据脚本

经过测试,脚本不成立!! 网站采用了一些方法进行加速(redis\cdn),这样就降低用户访问后端mysql的压力.以及前端速度不太好的问题,对用户请求到的所有页面进行了缓存,既然数据缓存了,解决用户看到的页面是否为最新页面就提上日程,下面这个脚本就诞生了.嘿嘿... Shell #!/bin/bash # Author:Byrd # Version:0.1 # Contact:root#t4x.org # define category for category in basic code d

gridview 数据实时更新的问题

问题描述 [img=http://static1.photo.sina.com.cn/middle/3e9c041444093b9b548d8&000][/img]上面点击入库后下面gridview马上在对应的项更新数据,这个怎么实现啊.帮忙教下我啊,谢谢. 解决方案 解决方案二:没图片了重新绑定解决方案三: 解决方案四:顶下解决方案五:提交入库后,重新刷新页面或者用<asp:UpdatePanel实现无刷新的gridview加载最新数据.解决方案六:服务器端动态加载客户端脚本stringm

在ASP.NET 2.0中操作数据之五十八:在程序启动阶段缓存数据_自学过程

导言: 前面2章考察了在表现层和缓存层缓存数据.在第56章,我们探讨了在表现层设置ObjectDataSource的相关cache属性来缓存数据.在第57章,我们探讨了创建一个单独的分开的缓存层.这2章都是采用"应激装载"(reactive loading)的模式来缓存数据.该模式下,每次请求数据时,系统先检查其是否在内存,如果没有,则从数据源--比如数据库,来获取数据,然后将其存储在内存里.该模式的优势在于执行起来很容易:而缺点之一在于应"请求"(requests

ASP.NET 2.0数据教程之六十:在程序启动阶段缓存数据

返回"ASP.NET 2.0数据教程目录" 导言: 前面2章考察了在表现层和缓存层缓存数据.在第58章,我们探 讨了在表现层设置ObjectDataSource的相关cache属性来缓存数据.在第59章,我 们探讨了创建一个单独的分开的缓存层.这2章都是采用"应激装载" (reactive loading)的模式来缓存数据.该模式下,每次请求数据时,系统先 检查其是否在内存,如果没有,则从数据源--比如数据库,来获取 数据,然后将其存储在内存里.该模式的优势在于执行

java-把常用高频访问数据从数据库加载到内存,数据库的变化能够自动实时更新内存。求大侠给思路

问题描述 把常用高频访问数据从数据库加载到内存,数据库的变化能够自动实时更新内存.求大侠给思路 把常用高频访问数据从数据库加载到内存,数据库的变化能够自动实时更新内存. 解决方案 其实数据库内部本身已经有这样的缓存机制,操作系统也有.你再做其实经常会弄巧成拙. 你知道"高频"数据的淘汰算法是什么么?这一点估计你写不过主流的数据库,那别的都是白扯. 解决方案二: 大型数据库本身带有很好的缓存机制,不需要咱们进行任何干预 解决方案三: 数据库更新的时候,把数据送到内存刷新换一下.