读书人

Redis学习札记(三) Redis常见应用场

发布时间: 2013-02-06 14:02:21 作者: rapoo

Redis学习笔记(三) Redis常见应用场景

转载自:http://www.cnblogs.com/Grass-e/archive/2012/07/31/2616425.html

应用场景:

1.取最新N个数据的操作:(Linked List)

记录前20个最新登陆的用户Id列表,超出的范围可以从数据库中获得。

//将登录次数和用户统一存储在一个sorted set里zadd login:login_times 5 1zadd login:login_times 1 2zadd login:login_times 2 3//当用户登录时,对该用户的登录次数自增1ret = r.zincrby("login:login_times", 1, uid)//那么如何获得登录次数最多的用户呢,逆序排列取得排名前N的用户ret = r.zrevrange("login:login_times", 0, N-1)

3.查找某个值所在的区间(区间无重合)?:(Sorted Set)

例如有下面两个范围,10-20和30-40

A_start 10, A_end 20B_start 30, B_end 40

我们将这两个范围的起始位置存在Redis的Sorted Sets数据结构中,基本范围起始值作为score,范围名加start和end为其value值:

redis 127.0.0.1:6379> zadd ranges 10 A_start(integer) 1redis 127.0.0.1:6379> zadd ranges 20 A_end(integer) 1redis 127.0.0.1:6379> zadd ranges 30 B_start(integer) 1redis 127.0.0.1:6379> zadd ranges 40 B_end(integer) 1

这样数据在插入Sorted Sets后,相当于是将这些起始位置按顺序排列好了。

现在我需要查找15这个值在哪一个范围中,只需要进行如下的zrangbyscore查找:

//book表存储book名称set book:1:name    ”The Ruby Programming Language”set book:2:name     ”Ruby on rail”set book:3:name     ”Programming Erlang”//tag表使用集合来存储数据,因为集合擅长求交集、并集sadd tag:ruby 1sadd tag:ruby 2sadd tag:web 2sadd tag:erlang 3//即属于ruby又属于web的书? inter_list = redis.sinter("tag.web", "tag:ruby") //即属于ruby,但不属于web的书? inter_list = redis.sdiff("tag.ruby", "tag:web") //属于ruby和属于web的书的合集? inter_list = redis.sunion("tag.ruby", "tag:web")

5.统计每天登陆过的活跃用户:(bitmaps)

Redis支持对String类型的value进行基于二进制位的置位操作。通过将一个用户的id对应value上的一位,通过对活跃用户对应的位 进行置位,就能够用一个value记录所有活跃用户的信息。如下图所未,下图中的bitmap有9个位被置为1,表示这9个位上对应的用户是今天的活跃用 户。其中第15位表示uid为15的用户,第一位表示uid为0的用户。

Redis学习札记(三) Redis常见应用场景Redis学习札记(三) Redis常见应用场景

下面表格表示对应一天,一周,一个月统计时所花费的时间。

Period  Time(ms)Daily  50.2Weekly392.0Monthly1624.8            

?

?

读书人网 >开源软件

热点推荐