项目是做一个问题社区,前端进行分页展示。这些问题数据以问题ID(自动递增)为score,存放到redis的ZSet中。前端发送请求的规则为xxx?page=x&size=y,其中page为要访问的页码,size为每页展示多少条数据。问题来了,假设现在redis中没有任何数据,那么前端发送请求xxx?page=2&size=5,这样就跳过了第一页的访问,直接访问了第二页的数据,并且将第二页的数据放到了redis的ZSet中。那么现在又有人访问第一页,但是由于代码我写的代码的问题,程序会将这第二页的数据当成第一页的数据来展示,然后如果再访问第二页时,缓存中是有第二页的数据,但是却因为代码问题需要去查数据库。这个bug我一直没想出来有什么比较好的办法解决。下面是我的部分代码。
findQuestion(int page,int size){
redisUtil.zrevrange("key",(page-1)×size,page×size);
........
}
findQuestion(int page,int size){
redisUtil.zrevrange("key",(page-1)×size,page×size);
........
}
解决方案 »
- 用eclipse启动tomcat报错.
- SSH框架,抛出异常java.lang.NullPointerException 是怎么回事?求大师指导
- fckeditor + jsp 实例
- 关于聊天纪录的数据库设计
- SQL存储过程中有两个结果集,如何使用JDBC技术得到两个结果集呢
- 高手一定要看
- tomcat服务器安全域的问题,在线等,请各位老大帮忙
- Tomcat5.0不能运行的网页,打包成.war后发布到weblogic运行正常。。。问题所在?
- java是否有加密解密API函数,高手请进
- 我使用apache+resin,想结合jb7来做jsp,但debug的时候出错(100分即给)
- 创建相册,要求使用Jquery
- 求大神给个指导思路
目前我是通过再添加一个hash来记录每一页数据的第一条数据ID和最后一条数据ID,然后在访问时,先取出当页的第一条数据ID和最后一条数据ID,然后通过zrevrangeByScore来获取数据。这种方式对于固定的size请求可能会正常响应,如果不是固定的size请求,可能会出BUG。我目前想不到更好的方法,先用这种方法代替吧。
比如你查询列A = 1的数据,但修改A=2,你只能同步缓存的A的值为A,但实际的查询结果不应该包括A=2这条记录了
缓存列表查询就按我说的那种,缓存个几秒,并发高还是有用,但不能太久,毕竟会数据不一致,就看容忍度了
如果要长期的话,一条一条去缓存,主键为key,结果集不会因为其他记录修改而改变