我们不得不说,redis开创一个新的数据存储思路,使用redis,我们不用在面对功能单调的数据库时候,把主要的精力放在如何把大象放进冰箱这样的问题,而是利用redis灵活多变的数据结构和数据操作,为不同的大象构建不同的冰箱。

现在我们列举一下Redis比较合适的应用场景。


1、记录前10个最新登录用户的id列表,超过范围的可以从数据库中获取



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


这个场景在很多的网站都可以看到,比如微博的id使用了常驻缓存,这是一直更新的,但是做了限制不能超过50个id,因此获取id的函数会一直询问redis,只有在start/count参数超过了这个范围的时候,才会去访问数据库。

该系统不会像传统的方式那样刷新缓冲,redis实例中的信息永远是一致的,sql数据库或者是其他的硬盘数据库只是在用户需要获取很远的护具时候才会被触发,而主页或者第一个评论页是不会麻烦到硬盘上的数据库的。


2、排行榜应用,取TOP 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
 ZADD key score member
 //当用户登录时,对该用户的登录次数自增1
 ret = r.zincrby("login:login_times", 1, uid)
 //那么如何获得登录次数最多的用户呢,逆序排列取得排名前N的用户
 ret = r.zrevrange("login:login_times", 0, N-1)
 ZREVRANGE key start stop [WITHSCORES]


3、精准设定过期时间的应用


比如你可以把上面说到的sorted set 的score值设置成过期时间的时间戳,那么就可以简单的通过过期时间排序,定期清除过期数据了,不仅仅是清除Redis中的过期数据,也可以完全把redis里面这个过期时间当成是对数据库数据的索引,用Redis来找出哪些数据需要过期删除,然后再精准的从数据库删除相应的记录。


4、获取一段时间所有数据去重值


这个使用Redis的set数据结构最合适了,只需要不断的就爱那个数据往set中仍就可以了,set是集合,所以会自动排重的。


5、Pub/Sub构建实时消息系统


很多聊天系统都是用它做的


6、消息队列系统


使用list可以构建队列系统,使用sorted set 可以构建优先级的队列系统,比如用Redis用做日志收集器,多个端点将日志信息写入Redis,然后一个worker统一将所有日志写到磁盘上。


7、缓冲


8、注册中心


比如用dubbo分布式系统的时候,可以用redis做注册中心


9、固定数据,实时查询。