redis原理(一)

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

5.所以随着文件变大,速度变慢,因为硬盘I/O成为瓶颈

6.所以数据库出现了

7.所以当数据库数据很大时,不建立索引也会很慢

8.关系型数据库

关系型数据库建表:必须给出schema
类型:字节宽度
存:倾向于行级存储

数据库:表很大,性能下降?
如果表有索引
增删改变慢
查询速度呢?
1,1个或少量查询依然很快
2,并发大的时候会受硬盘带宽影响速度

9.开始使用关系型内存数据库,例如HANA,报价贼贵,2T,2个亿(数据在内存和磁盘的体积不一样,内存小,因为不维护索引和B+T)

10.折中,取缓存 memached、redis

2个基础设施
1,冯诺依曼体系的硬件
2,以太网,tcp/ip的网络

比如网络不稳定 会造成数据丢失,数据不一致 等一系列问题

11.为什么不用redis memcached 也是key,value,因为value没有类型的概念。

12.memcached 可以使用json呀。

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类是系统调用

  

原文地址:https://www.cnblogs.com/bigdata-familyMeals/p/14288617.html