让Redis在你的系统中发挥更大作用的几点建议_Redis

Redis在很多方面与其他数据库解决方案不同:它使用内存提供主存储支持,而仅使用硬盘做持久性的存储;它的数据模型非常独特,用的是单线程。另一个大区别在于,你可以在开发环境中使用Redis的功能,但却不需要转到Redis。

转向Redis当然也是可取的,许多开发者从一开始就把Redis作为首选数据库;但设想如果你的开发环境已经搭建好,应用已经在上面运行了,那么更换数据库框架显然不那么容易。另外在一些需要大容量数据集的应用,Redis也并不适合,因为它的数据集不会超过系统可用的内存。所以如果你有大数据应用,而且主要是读取访问模式,那么Redis并不是正确的选择。

然而我喜欢Redis的一点就是你可以把它融入到你的系统中来,这就能够解决很多问题,比如那些你现有的数据库处理起来感到缓慢的任务。这些你就可以通过Redis来进行优化,或者为应用创建些新的功能。在本文中,我就想探讨一些怎样将Redis加入到现有的环境中,并利用它的原语命令等功能来解决传统环境中碰到的一些常见问题。在这些例子中,Redis都不是作为首选数据库。

显示最新的项目列表

下面这个语句常用来显示最新项目,随着数据多了,查询毫无疑问会越来越慢。

复制代码 代码如下:

SELECT * FROM foo WHERE ... ORDER BY time DESC LIMIT 10

在Web应用中,“列出最新的回复”之类的查询非常普遍,这通常会带来可扩展性问题。这令人沮丧,因为项目本来就是按这个顺序被创建的,但要输出这个顺序却不得不进行排序操作。

类似的问题就可以用Redis来解决。比如说,我们的一个Web应用想要列出用户贴出的最新20条评论。在最新的评论边上我们有一个“显示全部”的链接,点击后就可以获得更多的评论。

我们假设数据库中的每条评论都有一个唯一的递增的ID字段。

我们可以使用分页来制作主页和评论页,使用Redis的模板:

-每次新评论发表时,我们会将它的ID添加到一个Redis列表:

    LPUSH latest.comments <ID>

-我们将列表裁剪为指定长度,因此Redis只需要保存最新的5000条评论:

    LTRIM latest.comments 0 5000

-每次我们需要获取最新评论的项目范围时,我们调用一个函数来完成(使用伪代码):

复制代码 代码如下:

    FUNCTION get_latest_comments(start,num_items):
       id_list = redis.lrange("latest.comments",start,start+num_items-1)
       IF id_list.length < num_items
           id_list = SQL_DB("SELECT ... ORDER BY time LIMIT ...")
       END
       RETURN id_list
    END

这里我们做的很简单。在Redis中我们的最新ID使用了常驻缓存,这是一直更新的。但是我们做了限制不能超过5000个ID,因此我们的获取ID函数会一直询问Redis。只有在start/count参数超出了这个范围的时候,才需要去访问数据库。

我们的系统不会像传统方式那样“刷新”缓存,Redis实例中的信息永远是一致的。SQL数据库(或是硬盘上的其他类型数据库)只是在用户需要获取“很远”的数据时才会被触发,而主页或第一个评论页是不会麻烦到硬盘上的数据库了。

删除与过滤

我们可以使用LREM来删除评论。如果删除操作非常少,另一个选择是直接跳过评论条目的入口,报告说该评论已经不存在。

有些时候你想要给不同的列表附加上不同的过滤器。如果过滤器的数量受到限制,你可以简单的为每个不同的过滤器使用不同的Redis列表。毕竟每个列表只有5000条项目,但Redis却能够使用非常少的内存来处理几百万条项目。

排行榜相关

另一个很普遍的需求是各种数据库的数据并非存储在内存中,因此在按得分排序以及实时更新这些几乎每秒钟都需要更新的功能上数据库的性能不够理想。

典型的比如那些在线游戏的排行榜,比如一个Facebook的游戏,根据得分你通常想要:

-列出前100名高分选手

-列出某用户当前的全球排名

这些操作对于Redis来说小菜一碟,即使你有几百万个用户,每分钟都会有几百万个新的得分。

模式是这样的,每次获得新得分时,我们用这样的代码:

    ZADD leaderboard <score> <username>

你可能用userID来取代username,这取决于你是怎么设计的。

得到前100名高分用户很简单:ZREVRANGE leaderboard 0 99。

用户的全球排名也相似,只需要:ZRANK leaderboard <username>。

按照用户投票和时间排序

排行榜的一种常见变体模式就像Reddit或Hacker News用的那样,新闻按照类似下面的公式根据得分来排序:

    score = points / time^alpha

因此用户的投票会相应的把新闻挖出来,但时间会按照一定的指数将新闻埋下去。下面是我们的模式,当然算法由你决定。

模式是这样的,开始时先观察那些可能是最新的项目,例如首页上的1000条新闻都是候选者,因此我们先忽视掉其他的,这实现起来很简单。

- 每次新的新闻贴上来后,我们将ID添加到列表中,使用LPUSH + LTRIM,确保只取出最新的1000条项目。

- 有一项后台任务获取这个列表,并且持续的计算这1000条新闻中每条新闻的最终得分。计算结果由ZADD命令按照新的顺序填充生成列表,老新闻则被清除。这里的关键思路是排序工作是由后台任务来完成的。

过期项目处理

另一种常用的项目排序是按照时间排序。我们使用unix时间作为得分即可。

模式如下:

- 每次有新项目添加到我们的非Redis数据库时,我们把它加入到排序集合中。这时我们用的是时间属性,current_time和time_to_live。

- 另一项后台任务使用ZRANGE…SCORES查询排序集合,取出最新的10个项目。如果发现unix时间已经过期,则在数据库中删除条目。

计数

Redis是一个很好的计数器,这要感谢INCRBY和其他相似命令。

我相信你曾许多次想要给数据库加上新的计数器,用来获取统计或显示新信息,但是最后却由于写入敏感而不得不放弃它们。

好了,现在使用Redis就不需要再担心了。有了原子递增(atomic increment),你可以放心的加上各种计数,用GETSET重置,或者是让它们过期。

例如这样操作:

复制代码 代码如下:

    INCR user:<id> EXPIRE
    user:<id> 60

你可以计算出最近用户在页面间停顿不超过60秒的页面浏览量,当计数达到比如20时,就可以显示出某些条幅提示,或是其它你想显示的东西。

特定时间内的特定项目

另一项对于其他数据库很难,但Redis做起来却轻而易举的事就是统计在某段特点时间里有多少特定用户访问了某个特定资源。比如我想要知道某些特定的注册用户或IP地址,他们到底有多少访问了某篇文章。

每次我获得一次新的页面浏览时我只需要这样做:

    SADD page:day1:<page_id> <user_id>

当然你可能想用unix时间替换day1,比如time()-(time()%3600*24)等等。

想知道特定用户的数量吗?只需要使用SCARD page:day1:<page_id>。

需要测试某个特定用户是否访问了这个页面?SISMEMBER page:day1:<page_id>。

实时分析正在发生的情况,用于数据统计与防止垃圾邮件等

我们只做了几个例子,但如果你研究Redis的命令集,并且组合一下,就能获得大量的实时分析方法,有效而且非常省力。使用Redis原语命令,更容易实施垃圾邮件过滤系统或其他实时跟踪系统。

Pub/Sub

Redis的Pub/Sub非常非常简单,运行稳定并且快速。支持模式匹配,能够实时订阅与取消频道。

队列

你应该已经注意到像list push和list pop这样的Redis命令能够很方便的执行队列操作了,但能做的可不止这些:比如Redis还有list pop的变体命令,能够在列表为空时阻塞队列。

缓存

Redis的缓存部分值得写一篇新文章,我这里只是简单的说一下。Redis能够替代memcached,让你的缓存从只能存储数据变得能够更新数据,因此你不再需要每次都重新生成数据了。

Redis可以解决你的问题!

现在你就可以用上Redis,让用户感到更轻松,让你的系统变得不再复杂,让你的网站反应更快。你不需要改变现有的数据库结构,使用Redis给你的框架带来新的东西,来完成那些从前认为不可能做到/很难做到的,或是成本太高的任务。

原文地址:http://antirez.com/post/take-advantage-of-redis-adding-it-to-your-stack.html

时间: 2024-08-07 19:28:13

让Redis在你的系统中发挥更大作用的几点建议_Redis的相关文章

国资应在建设创新型城区中发挥更大作用

--"四国家创新型试点城区(市)国资国企改革发展工作研讨会"侧记 <上海国资> 记者 王铮 10月14日至10月15日,"四国家创新型城区(市)国资国企改革发展工作研讨会"在上海市杨浦区举行.此次研讨会由上海市杨浦区国资委发起,邀请今年上半年被国家科技部批准授予国家创新型试点城区(市)的北京市海淀区.天津市滨海新区及泛长三角地区的江西省景德镇市的国资委领导参加. 上海市国资委综合协调处处长祁汉卿到会并致辞.他表示,各国家创新型试点城区,具备了创新基础条件

让Win8系统Skydrive发挥更大作用

Windows 8系统有一个重大的新功能,那就是微软着重推广的云服务Skydrive(Windows 8.1中改名为Onedirve).但是在国内的网络环境下,Skydrive所同步的文件经常无法使用.那么如何让Skydrive变得更好用呢? 提高Win8系统Skydrive可用性的技巧 [解决思路] Windows 8默认设置下,桌面版SkyDrive的所有文件都是"联机可用",只有在打开某个文件之后,该文件才会联机下载到本地.我们可以从这一点上来突破解决. [解决方法] 进入Win

当人们已对隐私问题麻木,程序设计师应该发挥更大作用

如今,面对不断爆出的隐私问题,人们已经变得麻木了.在保护个人隐私上,程序设计师或许应该发挥更大的作用. Google 和 Ideo 员工联合创办的非盈利机构 Simply Secure 认为,程序设计师要确保网站.App 和软件平台更加安全和透明.从长期来看,这也有利于那些渴求用户数据的公司. "我们希望,程序设计师把信息安全和隐私的推广做为自身工作的一部分,"Simply Secure 的执行主管 Sara Brody 对 Fastcodesign 网站说,"他们通常能代表

巧妙设置 让U盘发挥更大作用

为了方便管理文件,相信很多人都会随身携带U盘;不要以为U盘只能保存文件,其实我们只要巧妙修改 Windows设置,完全可以用U盘控制系统!现在,本文就为各位朋友总结几则U盘控制系统的应用,希望大家 能从中获得启发! 1.让U盘作为系统收藏夹 系统收藏夹中通常记录了自己的偏好与隐私信息,为了不让他人随意偷窥到这方面的隐私信息,很多 人往往会将收藏下来的隐私内容保存到自己随身携带的U盘中,不过日后再想调用自己收藏的隐私内容时 ,就比较麻烦了,因为Windows系统会自动显示默认收藏夹中的内容,那有没

大庆乳业未来将在奶粉行业中发挥更大优势

大庆乳业通过对产品质量安全的层层把关,以及营养配方和产品品牌系列的不断升级,公司规模不断发展壮大.向来将产品安全工作放在第一位的大庆乳业,在不断出现问题的婴儿奶粉市场脱颖而出,成为市场上的放心企业. 近年来,大庆乳业(香港上市公司环球乳业01007.HK更名大乳业已经获得通过)凭借着不断升级的安全保障和产品品质,一直跻身于中国品牌奶粉的第一阵营. "奶源是基础,质检是保障,大庆乳业在这两方面做到了双和谐,所以,公司产品能够得到广大消费者的认同. ""奶源为王"是乳品

中国在全球经济调整中发挥着领导作用

--访国际货币基金组织总裁多米尼克·施特劳斯-卡恩先生 ■ 本刊记者 魏革军 记者:非常感谢您再次接受<中国金融>杂志的采访.上次采访是在一年多前,在这期间,全球经济局势发生了深刻变化,目前,在经历金融危机冲击后,全球经济正逐渐走向复苏,但有观点认为,全球经济复苏面临停滞的风险,甚至可能出现"双底衰退"的现象.您如何看待当前全球经济复苏态势? 卡恩:当前我们正处在"大萧条"以来影响最为深刻的危机之中,之所以说我们仍然处于危机中,是因为目前全球经济虽然转危

图片原理与优化 如何在网站设计中发挥更好的效果

中介交易 SEO诊断 淘宝客 云主机 技术大厅 前言:该文收集了前辈们的一些关于图片优化的技巧,在此收拢到一起,对于各个方法的优化原理做了一些研究,希望能给大家对于图片优化这一块起到抛砖引玉的作用. 提到图片,我们不得不从位图开始说起,位图图像(bitmap),也称为点阵图像或绘制图像,是由称作像素(图片元素)的单个点组成的.这些点可以进行不同的排列和染色以构成一副图片.当放大位图时,可以看见赖以构成整个图像的无数单个方块. 常见的格式中JPG.PNG.GIF亦属于位图,所以它们的数据结构大致相

物流领域RFID技术发挥着大作用

RFID在从采购.存储.运输.销售到服务的物流诸多环环相扣的环节上和社会效益上发挥重大的作用. RFID的作用主要分为以下几个方面. 一.进货环节 采用了RFID技术一改往日传统的销售商进货管理,利用读写器获取货物及同时到达的物流信息,对货物自动统计信息并传入信息系统后入库;货物安置在不同的仓库区域后,可以利用固定的电子标签读写器对货物在仓库中的存放状态进行监控,如指定堆放区域.上架时间等信息的统计.当仓储区域货物期限快到时则自动发出报警信号给中央调度系统通知工作人员;出库时,货物的信息的变动同

欧美与中国P2P发展环境对比,中国有更大机遇

在讨论中美 P2P 借贷网站"土壤"之前,让我们先分析下在美国 Prosper 和 Lending Club 面对的市场环境.美国的 Prosper 和 Lending Club 是06.07年分别在美国成立的"个人对个人理财融资"平台(P2P平台),Prosper 成立在先,其规模约是 Lending Club 的一半.Lending Club 现在累计完成的交易金额约为 24 亿美元,今年早些时候接受了 Google 1.5 亿美元的投资并计划于2014年在美国