一:简单介绍
- Redis(Remote Dictionary Server 远程字典服务器)
- key-value
- 内存数据库
- key是一个string
- value可以是string,list,hash,set,zset,bitmaps等等
- 几乎所有的互联网公司都会使用,新浪微博是全球最大的Redis使用者
二:特性
- C语言实现,单线程Epoll模型,无锁的争用,速度快
- 客户端语言众多,非常容易上手使用
- RDB和AOF两种持久化方式将数据和命令从内存保存到硬盘
- 分布式,因为现代处理器大多为多核,一般的模型是每个核上跑一个Redis实例,然后组成Redis集群,此时可以提供TB级别的单实例。
三:说一个使用场景
举一个很火的斗鱼直播间的例子,进入斗鱼,映入眼帘的是某游戏的直播,如图:
重点是我用红色圈出来的 贡献周榜
,应该就是观看直播的人送出礼品的价值排序,假设让我设计这样一个系统,贡献周榜
这个模块后端的数据库表最简单版本我会这样设计:
很明显,一号主播最近比较火,在礼物排行表中前五条都是他的,现在需要生成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的场景
- 缓存系统:例如上面的例子,MySQL作为后台持久化使用,Redis做缓存。
- 排行榜:例如新浪微博的热搜,视频按照发布时间排序等等,Redis提供了有序集合和列表,可以很容易实现这些功能,上面的例子也是这样。
- 计数器:某页面的浏览次数,视频的播放次数,incr就好了,因为单线程,即使很高的并发,也不会出现数据出错的问题,毕竟请求要一个一个处理,但是纯内存操作又非常快。http://www.tuicool.com/articles/f2auiau
- 社交网络:例如共同好友,如果是关系型数据库,假设求A和B的共同好友,需要先求出A的所有好友,然后求出B的所有好友,然后join,然后distinct。但是Redis支持交集操作(sinter),直接交集就好了。
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"
- 消息队列:使用Redis的Pub/Sub和阻塞队列功能。https://videocdn.taobao.com/oss/taobao-ugc/4ee19dc94a4b4af68ce5ca5be0545845/1496730927/video.mp4
- 作为大数据分析的助手:提供的数据结构可以完成统计数量和去重等操作。
五、使用Jedis连接Redis
1:什么是 Jedis?
Jedis是 Redis 的Java客户端,就是用来连接Redis数据库完成数据存取操作的,Redis有各种语言的客户端,详见:https://redis.io/clients,如果你简单了解java语言和 Redis的命令,那你很快就会使用它。
2:操作一波
- 首先安装Redis
http://www.runoob.com/redis/redis-install.html
如果你想试试docker,来这里:
http://www.tuicool.com/articles/YJbyMr
- 建立一个Java项目,下面是maven配置
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
- 程序如下
Jedis jedis = new Jedis("serverip","serverport");
jedis.set("key1","value1");
System.out.println(jedis.get("key1"));
jedis.close();
- 运行程序输出结果
更多使用方式见(必须得看): http://www.blogways.net/blog/2013/06/02/jedis-demo.html
六:一些学习Redis的资料
《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