birk 发表于 2016-12-19 08:21:28

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

  转载自:http://www.cnblogs.com/Grass-e/archive/2012/07/31/2616425.html
  应用场景:
  1.取最新N个数据的操作:(Linked List)
  记录前20个最新登陆的用户Id列表,超出的范围可以从数据库中获得。

//把当前登录人添加到链表里
ret = r.lpush("login:last_login_times", uid)
//保持链表只有N位
ret = redis.ltrim("login:last_login_times", 0, N-1)
//获得前N个最新登陆的用户Id列表
last_login_list = r.lrange("login:last_login_times", 0, N-1)

  2.取 TOP N 操作:(Sorted Set)
  这个需求与上面需求的不同之处在于,取最新N个数据的操作以时间为权重,这个是以某个条件为权重,比如按顶的次数排序,这时候就需要我们的sorted set出马了,将你要排序的值设置成sorted set的score,将具体的数据设置成相应的value,每次只需要执行一条ZADD命令即可。
  热门,排行榜应用:



//将登录次数和用户统一存储在一个sorted set里
zadd login:login_times 5 1
zadd login:login_times 1 2
zadd login:login_times 2 3
//当用户登录时,对该用户的登录次数自增1
ret = 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 20
[*]B_start 30, B_end 40
  我们将这两个范围的起始位置存在Redis的Sorted Sets数据结构中,基本范围起始值作为score,范围名加start和end为其value值:



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



  这样数据在插入Sorted Sets后,相当于是将这些起始位置按顺序排列好了。
  现在我需要查找15这个值在哪一个范围中,只需要进行如下的zrangbyscore查找:

redis 127.0.0.1:6379> zrangebyscore ranges (15 +inf LIMIT 0 1
1) "A_end"

  这个命令的意思是在Sorted Sets中查找大于15的第一个值。(+inf在Redis中表示正无穷大,15前面的括号表示>15而非>=15)
  查找的结果是A_end,由于所有值是按顺序排列的,所以可以判定15是在A_start到A_end区间上,也就是说15是在A这个范围里。至此大功告成。
  4.交集,并集,差集:(Set)



//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 1
sadd tag:ruby 2
sadd tag:web 2
sadd 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的用户。

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



Period  
Time(ms)


Daily  
50.2


Weekly
392.0


Monthly
1624.8            


 
页: [1]
查看完整版本: Redis学习笔记(三) Redis常见应用场景