redis 数据类型详解 以及 redis适用场景场合( 四 )


  1. Redis实际应用场景
Redis在很多方面与其他数据库解决方案不同:它使用内存提供主存储支持 , 而仅使用硬盘做持久性的存储;它的数据模型非常独特 , 用的是单线程 。 另一个大区别在于 , 你可以在开发环境中使用Redis的功能 , 但却不需要转到Redis 。
转向Redis当然也是可取的 , 许多开发者从一开始就把Redis作为首选数据库;但设想如果你的开发环境已经搭建好 , 应用已经在上面运行了 , 那么更换数据库框架显然不那么容易 。 另外在一些需要大容量数据集的应用 , Redis也并不适合 , 因为它的数据集不会超过系统可用的内存 。 所以如果你有大数据应用 , 而且主要是读取访问模式 , 那么Redis并不是正确的选择 。 然而我喜欢Redis的一点就是你可以把它融入到你的系统中来 , 这就能够解决很多问题 , 比如那些你现有的数据库处理起来感到缓慢的任务 。 这些你就可以通过Redis来进行优化 , 或者为应用创建些新的功能 。 在本文中 , 我就想探讨一些怎样将Redis加入到现有的环境中 , 并利用它的原语命令等功能来解决 传统环境中碰到的一些常见问题 。 在这些例子中 , Redis都不是作为首选数据库 。 1、显示最新的项目列表下面这个语句常用来显示最新项目 , 随着数据多了 , 查询毫无疑问会越来越慢 。
SELECT * FROM foo WHERE ... ORDER BY time DESC LIMIT 10
在Web应用中 , “列出最新的回复”之类的查询非常普遍 , 这通常会带来可扩展性问题 。 这令人沮丧 , 因为项目本来就是按这个顺序被创建的 , 但要输出这个顺序却不得不进行排序操作 。类似的问题就可以用Redis来解决 。 比如说 , 我们的一个Web应用想要列出用户贴出的最新20条评论 。 在最新的评论边上我们有一个“显示全部”的链接 , 点击后就可以获得更多的评论 。我们假设数据库中的每条评论都有一个唯一的递增的ID字段 。我们可以使用分页来制作主页和评论页 , 使用Redis的模板 , 每次新评论发表时 , 我们会将它的ID添加到一个Redis列表:LPUSH latest.comments
我们将列表裁剪为指定长度 , 因此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_itemsid_list = SQL_DB("SELECT ... ORDER BY time LIMIT ...")ENDRETURN id_listEND
这里我们做的很简单 。 在Redis中我们的最新ID使用了常驻缓存 , 这是一直更新的 。 但是我们做了限制不能超过5000个ID , 因此我们的获取ID函数会一直询问Redis 。 只有在start/count参数超出了这个范围的时候 , 才需要去访问数据库 。我们的系统不会像传统方式那样“刷新”缓存 , Redis实例中的信息永远是一致的 。 SQL数据库(或是硬盘上的其他类型数据库)只是在用户需要获取“很远”的数据时才会被触发 , 而主页或第一个评论页是不会麻烦到硬盘上的数据库了 。 2、删除与过滤我们可以使用LREM来删除评论 。 如果删除操作非常少 , 另一个选择是直接跳过评论条目的入口 , 报告说该评论已经不存在 。 有些时候你想要给不同的列表附加上不同的过滤器 。 如果过滤器的数量受到限制 , 你可以简单的为每个不同的过滤器使用不同的Redis列表 。 毕竟每个列表只有5000条项目 , 但Redis却能够使用非常少的内存来处理几百万条项目 。 3、排行榜相关另一个很普遍的需求是各种数据库的数据并非存储在内存中 , 因此在按得分排序以及实时更新这些几乎每秒钟都需要更新的功能上数据库的性能不够理想 。 典型的比如那些在线游戏的排行榜 , 比如一个Facebook的游戏 , 根据得分你通常想要:- 列出前100名高分选手- 列出某用户当前的全球排名这些操作对于Redis来说小菜一碟 , 即使你有几百万个用户 , 每分钟都会有几百万个新的得分 。 模式是这样的 , 每次获得新得分时 , 我们用这样的代码:ZADD leaderboard