孙宇的技术专栏 大数据/机器学习

Redis常见类型的应用场景

2014-07-28

阅读:


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)

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)

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")

bitmaps

Redis支持对String类型的value进行基于二进制位的置位操作。通过将一个用户的id对应value上的一位,通过对活跃用户对应的位进行置位,就能够用一个value记录所有活跃用户的信息。

setbit 2014-07-28-login 1053 1
setbit 2014-07-28-login 89887 1

bitcount 2014-07-28-login
(integer) 2

通过 setbit将 bitmap 对应的位设置为 1。比如 100100的意思是ID为 2, 5 的两个人已登录。bitcount表示们为 1 的有多少个,这样就表示当前登录的用户有多少。


Similar Posts

上一篇 Select/poll/epoll

下一篇 最小二乘法

评论