举一个很火的斗鱼直播间的例子,进入斗鱼,映入眼帘的是某游戏的直播,如图:
重点是我用红色圈出来的 贡献周榜
,应该就是观看直播的人送出礼品的价值排序,假设让我设计这样一个系统,贡献周榜
这个模块后端的数据库表最简单版本我会这样设计:
很明显,一号主播最近比较火,在礼物排行表中前五条都是他的,现在需要生成1号主播的贡献周榜
,即用户和贡献值两列数据,我们用SQL从数据库中读取信息并排序:
SELECT 用户ID,送出的价值 FROM 礼物排行表 WHERE 主播ID=1 ORDER BY 送出的价值;
拿出这样的表,然后去做显示就好了,同样的功能用Redis如何实现呢?看下面的图:
整个数据库是key-value,key对应的是主播ID(唯一),value对应的是一个ZSet(有序集合),value的score域对应用户的贡献值,member域对应用户名,如下,我们按照用户进入房间的顺序插入用户以及贡献值:
因为是有序集合,直接遍历显示就是我们要的结果。
下面再考虑这样的场景:一号主播近日人气连续爆棚,观看他直播的人数也很多,大家不停的送礼物,他不停的”感谢老铁送我的飞机、大炮、游艇”,哈哈,伴随而来的就是排行榜的不断更新
,假设user1后来居上,将自己的贡献提升至两百,如果你直接将数据更新至MySQL:
UPDATE 礼物排行表 SET 送出的价值=200 WHERE 用户ID=1;
//之后再次拿出数据去更新前端页面
SELECT 用户ID,送出的价值 FROM 礼物排行表 WHERE 主播ID=1 ORDER BY 送出的价值;
在大量并发的情况下,你这样做肯定是满足不了实时更新的,毕竟MySQL是写磁盘。这时候你会说:谁这样用,肯定加缓存啊!!没毛病,那么Redis就是最好的选择(微笑脸),下面看看用Redis怎么玩:
没错,我们直接更新user1的贡献值,zset自动完成排序,然后再次遍历,user1就已经成为第一名了。内存操作是非常的快滴。
回过头来想想:这个例子中我们有必要使用MySQL吗?
答案:没有必要,直接用Redis完成它就好了,即使是持久化,Redis也支持。之所以可以这样,是因为这个场景下数据量小,并且要求延时小,正符合Redis的特性。
redis> SMEMBERS group_1
1) "LI LEI"
2) "TOM"
3) "JACK"
redis> SMEMBERS group_2
1) "HAN MEIMEI"
2) "JACK"
redis> SINTER group_1 group_2
1) "JACK"
Jedis是 Redis 的Java客户端,就是用来连接Redis数据库完成数据存取操作的,Redis有各种语言的客户端,详见:https://redis.io/clients,如果你简单了解java语言和 Redis的命令,那你很快就会使用它。
http://www.runoob.com/redis/redis-install.html
如果你想试试docker,来这里:
http://www.tuicool.com/articles/YJbyMr
<dependency>
<groupId>redis.clientsgroupId>
<artifactId>jedisartifactId>
<version>2.9.0version>
dependency>
Jedis jedis = new Jedis("serverip","serverport");
jedis.set("key1","value1");
System.out.println(jedis.get("key1"));
jedis.close();
《Redis设计与实现》了解底层的数据结构【推荐】:http://redisbook.com/
命令学习:http://www.redis.cn/commands.html
Redis的使用场景:http://blog.csdn.net/hguisu/article/details/8836819
Redis源码注释:
https://github.com/huangz1990/redis-3.0-annotated?utm_source=tuicool&utm_medium=referral
浅析Redis网络库:http://blog.csdn.net/yangbodong22011/article/details/65444273