许多的应用服务都需要存储关于使用,配置或者其他相关的信息的临时数据,这些数据结构并不适合存储在关系数据库中。
通常情况下,开发者会是MySQL或者其他RDBMS来存储这种数据。在这里,我们将使用Redis和它内建的数据结构,以一种更轻量级、更快速、更宽松的方式完成存储应用临时数据的功能。
Redis本身的定位并不仅仅是key/value
存储服务,同时也可以作为存储数据结构的服务器。这意味着,在传统的key/value
存储功能之上,它还提供给你一些存储和操作应用数据的方式。
我们将使用这些数据结构和命令来存储应用示例数据:比如,我们在一些regular keys
里面存储有用的计数器,在Redis hashes
里面存储用户对象,以及使用sets
实现朋友圈(像Google+)。
存储应用使用计数器
首先,让我们开始存储一些非常基础的事情:计数器。想象我们运营一个商业的社交网络,然后想要追踪profile/page
的访问数据。我们可以在RDBMS的存储我们页数据的表里面增加一列,
但是希望我们的流量足够高以至于每次更新这一列会带来一些麻烦。因此,我们需要更快的工具来更新和查询,所以我们使用Redis来代替。
由于Redis命令的原子性,我们知道如果我们存储一个计数器的key,则我们可以使用命令,比如:INCR(或者INCRBY)和DECR(或者DECRBY)
,来增加增加或者减少它包含的值。所以,通过为我们的数据设计一个合适的命名保证我们的计数器单次操作成本微乎其微。
Redis系统内实际上并没有约定的方法来组织keys,但是许多人(包括作者)都喜欢使用冒号:
来区分关键字从而创建keys,因此在这里也这样约定。为了存储我们的社交网络页面访问数据,我们可以有一个像visits:pageid:totals
的命名,比如页面id为635,则命名为visits:635:totals
。如果我们已经在一些地方存储访问数据,我们可以首先根据这些数据产生redis的keys,并且设置对应的值,比如:
SET visits:1:totals 21389
SET visits:2:totals 1367894
(...)
当访问一个给定的页面,一个简单地INCR
命令将更新Redis中的计数器:
INCR visits:635:totals
然后我们可以获取任何页面在任何时候的访问次数,这只需要通过简单地GET
命令:
GET visits:635:totals
你也可以让你的命令更智能,比如你可以在人们查看页面的时候,显示当前该页面被访问的次数给他看。当然,你也可以计算他自己访问的次数,所以你甚至不需要执行最后的GET
命令:你可以利用INCR
命令返回值的特点,因为INCR
命令会返回自增之后的计数值。一个简单地关于访问和计数器的伪代码如下所示:
1. 访问者访问页面.
2. 我们 INCR 相关页面的访问计数器 (比如:INCR visits:635:totals) 3. 我们获取INCR命令的返回值。
4. 我们展示返回的值在用户页面上。
这种方式我们保证用户在查看页面的时候,常常可以看见实时计数值,以及他自己访问的计数–着所有都可以使用Redis命令。