1.数据是存储在文件中的
2.linux读取方式: grep、awk
3.程序读取方式:java
4.常识
常识: 磁盘: 1,寻址:ms 2,带宽:G/M 内存: 1,寻址:ns 2,带宽:很大 秒>毫秒>微秒>纳秒 磁盘比内存在寻址上慢了10W倍 I/O buffer:成本问题 磁盘与磁道,扇区,一扇区 512Byte带来一个成本变大:索引 4K 操作系统,无论你读多少,都是最少4k从磁盘拿 所以一次I/O 就是4K
6.所以数据库出现了
7.所以当数据库数据很大时,不建立索引也会很慢
8.关系型数据库
关系型数据库建表:必须给出schema 类型:字节宽度 存:倾向于行级存储 数据库:表很大,性能下降? 如果表有索引 增删改变慢 查询速度呢? 1,1个或少量查询依然很快 2,并发大的时候会受硬盘带宽影响速度
10.折中,取缓存 memached、redis
2个基础设施 1,冯诺依曼体系的硬件 2,以太网,tcp/ip的网络 比如网络不稳定 会造成数据丢失,数据不一致 等一系列问题
11.为什么不用redis memcached 也是key,value,因为value没有类型的概念。
clinet需要从 缓存k,v型 取回v中的某一个元素 1.memcache 返回value所有的数据到clientserver 网卡IO client要有你实现的代码去节码 2.类型不是很重要 redis的server中对每种类型都有自己的方法 index() lpop
问题:redis是单进程,单线程,单实例,并发很多的请求,如何变得很快的呢?
- 因为linux内核(kernel)使用了epoll, 在redis启动的进程中可以看到
内核五图解析
一、线程/进程轮询,socket在这个时期是阻塞的所以是BIO,有阻塞问题,线程多了调度成本CPU浪费、内存成本大 二、单线程处理,轮询发生在用户空间,同步非阻塞 NIO,有用户进程轮询问题 三、单线程处理,select批量处理,轮询发生在内核,多路复用NIO,有fd数据拷贝来拷贝去问题 四、单线程处理,select更换epoll,多路复用NIO,有共享空间。 五、零拷贝:是不同系统之间的调用,用的是sendfile(out, in)方法,看kafka图,文件存在kafaka,其他的调用全部走方法用的是sendfile。 man 2 read man 2 select man epoll man 2 sendfile 网卡到内核是一个sockert I/O 文件file到内核是一个文件I/O man 有8类文档 1类是man ls 可以看帮助文档 2类是系统调用