redis 笔记-1

课前知识

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的演进

IO在linux中的演进
涉及操作系统,目前还不能很好的吸收理解。
简单的说就是 请求 从 同步阻塞BIO -> 同步非阻塞NIO -> IO多路复用(select) -> epoll(虚拟内存映射共享部分内存)的 改进历史。
每次改变都是基于当前的缺点做出的改进。

redis的线程模型

参考 中华石杉 老师画的一张图,能比较形象说明
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(跳跃表)

猜你喜欢

转载自www.cnblogs.com/idea-persistence/p/12581922.html