Jack Frost

Redis系列(二)–缓存设计(整表缓存以及排行榜缓存方案实现)

抱歉,其实这篇应该几天前就出的,不过在这个项目中的lucene加载出bug了(虽然还没解决,但缓存的先记录下来,发出给大家)。

本系列:

(1)SSM框架构建积分系统和基本商品检索系统(Spring+SpringMVC+MyBatis+Lucene+Redis+MAVEN)(1)框架整合构建

(2)SSM框架构建积分系统和基本商品检索系统(Spring+SpringMVC+MyBatis+Lucene+Redis+MAVEN)(2)建立商品数据库和Lucene的搭建

(3)Redis系列(一)–安装、helloworld以及读懂配置文件


文章结构:(1)整表缓存;(2)排行榜缓存方案。

Redis文档


一、整表缓存:(演示禁言表的整表缓存)

整表缓存核心思想:我们使用的是普通的key-value数据结构。key对应我们普通的禁言id。value则对应这个id禁言过他人的列表的list。利用jsonarray和list之间的互换。形成这一整表缓存策略!!!

list里面则装载着禁言表的记录,每一行记录对应一个Gag。

(1)先编写好我们的接口

(2)编写业务接口实现类:

(3)我们写进缓存的string和读出来的string必须使用统一的转换方式:我这里使用的是fastjson这个库

(4)整表缓存的controller调用:

这里写图片描述


二、排行榜缓存方案(重头戏!!!)

方案一:(优雅方案):

1.第一次访问的时候,查数据库,查整个user表查出topN(使用sql排序),丢给redis(使用sorted set数据类型)。

2.排序在redis,redis自动排序。以后的用户访问:均访问redis。

3.只要每次积分变化判断的时候拿topN的最后一个判别,大于某个阈值则整个user丢进redis排序。

效率性能再优化:用户积分变动的时候,(守护线程)服务器预存一下变化的数量。。到一定量再通知。

4.积分变换的时候都往redis拿个第50名的积分进行判断。再往下去设定一个小距离为阈值。比如现在第50名的积分是100,那80分一下的应该就没必要扔给redis了吧?

注意:这个排行榜的用户是会不断增加的,比如1亿用户,如果刚开始只有前50,后5千万人的积分大于第50名,那么就会往redis加入这个用户的信息。(虽然看起来要存很多,其实一亿用户怎么存也就1G左右的内存,简单暴力优雅方案了)

实现:

(1)继续沿用JedisClient接口

(2)继续沿用JedisClientSingle实现类

(3)缓存加入,查询调用:(继续沿用上面的JsonUtils)

这里写图片描述

(4)我们缓存策略核心:修改了用户积分的时候就与缓存排行榜的我们限定的最后一名进行比较,大于就丢进redis排序,小于就不丢进去。所以只有第一次访问的时候是使用了数据库的sql排序查询。

注意的是:因为每个user序列化原因,每个user都有独特的标记,所以我们要从redis中拿user去判断,而不是新建一个user。这样的hash是不一样的!!!

这里写图片描述

就这样就完成我们的排行榜缓存策略了!!!


方案二:

只描述:(因为这个方案不是特别优雅,而且第一个方案已经基于第二方案进行改进了!!)

(1)用户访问排行榜接口,后台第一次是先查数据库,然后set进redis(sorted set或者普通key-value)。

(2)以后:只会访问redis。

(3)设置个定时器定时让redis去读取数据库topN。(排序在数据库)

ORDERBY 积分 DESC LIMIT 50

排行榜前50名,这样的条件


源码下载:Redis系列(二)–缓存设计(整表缓存以及排行榜缓存方案实现)Demo

好了,J2EE项目系列(四)–Redis系列(二)–缓存设计(整表缓存以及排行榜缓存方案实现)讲完了。本博客系列是我做其中一个项目时候需要整合的部分东西(分布式的往后补上),我把里面的整合,以及部分非算法性的业务逻辑写出来(大家别看这边博客这么少东西,其实就那个数据库搞了我几个钟,缓存方案更是我搞了几天的东东),分享经验给大家。欢迎在下面指出错误,共同学习!!你的点赞是对我最好的支持!!

更多内容,可以访问JackFrost的博客

码字很辛苦,转载请注明来自JackFrost《Redis系列(二)–缓存设计(整表缓存以及排行榜缓存方案实现)》

Leave a Reply

Your email address will not be published. Required fields are marked *