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

你可能用userID来取代username , 这取决于你是怎么设计的 。 得到前100名高分用户很简单:ZREVRANGE leaderboard 0 99 。 用户的全球排名也相似 , 只需要:ZRANK leaderboard
4、按照用户投票和时间排序排行榜的一种常见变体模式就像Reddit或Hacker News用的那样 , 新闻按照类似下面的公式根据得分来排序:score = points / time^alpha因此用户的投票会相应的把新闻挖出来 , 但时间会按照一定的指数将新闻埋下去 。 下面是我们的模式 , 当然算法由你决定 。 模式是这样的 , 开始时先观察那些可能是最新的项目 , 例如首页上的1000条新闻都是候选者 , 因此我们先忽视掉其他的 , 这实现起来很简单 。 每次新的新闻贴上来后 , 我们将ID添加到列表中 , 使用LPUSH + LTRIM , 确保只取出最新的1000条项目 。 有一项后台任务获取这个列表 , 并且持续的计算这1000条新闻中每条新闻的最终得分 。 计算结果由ZADD命令按照新的顺序填充生成列表 , 老新闻则被清除 。 这里的关键思路是排序工作是由后台任务来完成的 。
5、处理过期项目另一种常用的项目排序是按照时间排序 。 我们使用unix时间作为得分即可 。 模式如下:- 每次有新项目添加到我们的非Redis数据库时 , 我们把它加入到排序集合中 。 这时我们用的是时间属性 , current_time和time_to_live 。 - 另一项后台任务使用ZRANGE…SCORES查询排序集合 , 取出最新的10个项目 。 如果发现unix时间已经过期 , 则在数据库中删除条目 。
6、计数Redis是一个很好的计数器 , 这要感谢INCRBY和其他相似命令 。 我相信你曾许多次想要给数据库加上新的计数器 , 用来获取统计或显示新信息 , 但是最后却由于写入敏感而不得不放弃它们 。 好了 , 现在使用Redis就不需要再担心了 。 有了原子递增(atomic increment) , 你可以放心的加上各种计数 , 用GETSET重置 , 或者是让它们过期 。 例如这样操作:INCR user: EXPIREuser: 60你可以计算出最近用户在页面间停顿不超过60秒的页面浏览量 , 当计数达到比如20时 , 就可以显示出某些条幅提示 , 或是其它你想显示的东西 。 7、特定时间内的特定项目另一项对于其他数据库很难 , 但Redis做起来却轻而易举的事就是统计在某段特点时间里有多少特定用户访问了某个特定资源 。 比如我想要知道某些特定的注册用户或IP地址 , 他们到底有多少访问了某篇文章 。 每次我获得一次新的页面浏览时我只需要这样做:SADD page:day1: 当然你可能想用unix时间替换day1 , 比如time()-(time()%3600*24)等等 。 想知道特定用户的数量吗?只需要使用SCARD page:day1: 。 需要测试某个特定用户是否访问了这个页面?SISMEMBER page:day1: 。
8、实时分析正在发生的情况 , 用于数据统计与防止垃圾邮件等我们只做了几个例子 , 但如果你研究Redis的命令集 , 并且组合一下 , 就能获得大量的实时分析方法 , 有效而且非常省力 。 使用Redis原语命令 , 更容易实施垃圾邮件过滤系统或其他实时跟踪系统 。
9、Pub/SubRedis的Pub/Sub非常非常简单 , 运行稳定并且快速 。 支持模式匹配 , 能够实时订阅与取消频道 。 10、队列你应该已经注意到像list push和list pop这样的Redis命令能够很方便的执行队列操作了 , 但能做的可不止这些:比如Redis还有list pop的变体命令 , 能够在列表为空时阻塞队列 。 现代的互联网应用大量地使用了消息队列(Messaging) 。 消息队列不仅被用于系统内部组件之间的通信 , 同时也被用于系统跟其它服务之间的交互 。 消息队列的使用可以增加系统的可扩展性、灵活性和用户体验 。 非基于消息队列的系统 , 其运行速度取决于系统中最慢的组件的速度(注:短板效应) 。 而基于消息队列可以将系统中各组件解除耦合 , 这样系统就不再受最慢组件的束缚 , 各组件可以异步运行从而得以更快的速度完成各自的工作 。 此外 , 当服务器处在高并发操作的时候 , 比如频繁地写入日志文件 。 可以利用消息队列实现异步处理 。 从而实现高性能的并发操作 。