课前知识
1.磁盘的性能影响因素:
寻址: ms
带宽: G/M
2.内存
寻址:ns
带宽:很大
磁盘比内存在寻址上满了 10W倍
3 I/O buffer: 成本问题
磁盘与刺刀扇区,一个扇区512 Byte,带来一个成本变大 ---> 索引
4K操作系统,无论i读多少,都是 最少凑够磁盘那 4K的数据
4 一问:
4.1、随着文件变大,速度变慢是 为什么?
应该众所周知: 硬盘IO是最大的瓶颈
4.2、数据库中 表越大,性能下降?
有索引的前提下, 增删改 变慢
1个或少量的查询 依然很快。(索引结构相关)
并发大的时候 会受到 硬盘 带宽 的影响。
redis的前世今生
1、redis的出现 必然是为了实现某种场景出现的。
2、与memcached的比较
memcached: 只是简单的 k-v,重点, value是没有类型的概念的; 需要返回value 所有的数据 到client,经历 server 网卡 IO, 需要client 去自己实现获取数据的逻辑;
redis 对 value 提供了 丰富的数据类型,来处理不同的数据结构,提高处理的效率。
敲重点:计算向数据移动(目前还不是很理解)
redis安装
参考。。
redis 原理
JVM 一个线程的成本大约 1M,内存消耗
线程多了,调度成本增加,cpu浪费
redis是单进程 单线程的 单实例
IO的演进
涉及操作系统,目前还不能很好的吸收理解。
简单的说就是 请求 从 同步阻塞BIO -> 同步非阻塞NIO -> IO多路复用(select) -> epoll(虚拟内存映射共享部分内存)的 改进历史。
每次改变都是基于当前的缺点做出的改进。
redis的线程模型
参考 中华石杉 老师画的一张图,能比较形象说明
文件事件处理器
采用 IO多路复用机制 同时监听多个 socket,根据 socket上的事件 来选择对应的 事件处理器 来处理这个事件。
文件事件处理器的结构包含4个部分:多个socket,IO多路复用程序,文件事件分派器,事件处理器(命令请求处理器、命令回复处理器、连接应答处理器,等等)。
多个socket可能并发的产生不同的操作,每个操作对应不同的文件事件,但是IO多路复用程序会监听多个socket,但是会将socket放入一个队列中排队,每次从队列中取出一个socket给事件分派器,事件分派器把socket给对应的事件处理器。
客户端与redis通信的一次流程
在redis启动初始化的时候,redis会将连接应答处理器跟AE_READABLE事件关联起来,接着如果一个客户端跟redis发起连接,此时会产生一个AE_READABLE事件,然后由连接应答处理器来处理跟客户端建立连接,创建客户端对应的socket,同时将这个socket的AE_READABLE事件跟命令请求处理器关联起来。
当客户端向redis发起请求的时候(不管是读请求还是写请求,都一样),首先就会在socket产生一个AE_READABLE事件,然后由对应的命令请求处理器来处理。这个命令请求处理器就会从socket中读取请求相关数据,然后进行执行和处理。
接着redis这边准备好了给客户端的响应数据之后,就会将socket的AE_WRITABLE事件跟命令回复处理器关联起来,当客户端这边准备好读取响应数据时,就会在socket上产生一个AE_WRITABLE事件,会由对应的命令回复处理器来处理,就是将准备好的响应数据写入socket,供客户端来读取。
命令回复处理器写完之后,就会删除这个socket的AE_WRITABLE事件和命令回复处理器的关联关系。
因为 网络的因素存在,redis只 能保证 同个client中的请求是有顺序的。
redis 是 二进制安全的
需要对所有客户端进行 编码的约定,防止出现乱码
redis的类型
string 类型
可存放的类型
-
string
- 场景:
-
数值
- 常用指令: incr
- 场景:
抢购,秒杀,点赞。 计数,限流。
-
bitmap
- 常用的指令: setbit, bitcount, bitops, bitop
- 场景:
- 统计用户登录天数,且窗口随机
setbit sean 1 1 setbit sean 7 1 setbit sean 364 1 STRLEN sean BITCOUNT sean -2 -1
-
有效活跃用户统计
setbit 20190101 1 1 setbit 20190102 1 1 setbit 20190102 7 1 bitop or destkey 20190101 20190102 BITCOUNT destkey 0 -1
-
- 统计用户登录天数,且窗口随机
List
有序
场景:
+ 栈
+ 队列
+ Lindex获取:数组
+ 阻塞,单播队列FIFO
hash
类似 hashmap,对对象的对个属性进行方便操作
场景:
点赞,收藏
set
无序
场景:
共同关注,抽奖(人多奖品少,人少奖品多)
sorted set
场景:
排序
实现: skiplist(跳跃表)