在网站开发过程中经常会遇到关于《最近登录用户TOP10》或是《最高得票TOP10》诸如此类的问题 ,传统思路主要是通过MySQL的order by 和limit 10 来做TOP10的获取。这里讲解一种利用redis的list和zset快速实现TOP10功能。
传统sql方式查找TOP10,我们写这样一条sql :
select * from user order by `last_login_time` desc limit 0 , 10;
当我们执行这条sql执行下去的时候会进行全表扫描(没有做索引的情况下),在user表记录比较少的情况下,这种方式不会存在任何的问题,如果user表示一张非常巨大(比如5000万用户)的表时,一条sql执行就会扫表5000万行记录,这样会大大降低mysql数据库的性能。
redis的方式实现:
设置一个list链表
第一个用户登录后将用户的uid推进链表最左侧
lpush logintop10 uid1
第二个用户登录后将用户的uid推进链表最左侧
lpush logintop10 uid2
在此之前我们可以通过llen来统计链表的长度,当第11个用户登录进来后,我们lpush进链表后,同时将链表最右侧的用户rpop出链表,这样就维持最新登录10个用户的数据信息,这样TOP10的数据就不再通过sql查询来获取,这样大大降低了对sql的压力,特别适用于实时更新统计的系统设计。