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

      

  • 相关阅读:
    Google Maps API 进级:通过XML文档加载Gpolyline或者Gpolygon
    Google Maps API 进级: GPolygon对象2
    Google Maps API 进级: GoogleMaps常用事件及应用思路2
    debian下安装JDK
    sudo 提示用户不在sudoers文件错误
    debian关闭开机自动启动时候的gui
    debian解决中文乱码,安装chinese font
    debian下intel 3945abg和T420无线网卡驱动
    debian修改系统时区
    wheezy安装oracle jdk的jdk之中文乱码处理
  • 原文地址:https://www.cnblogs.com/bigdata-familyMeals/p/14288617.html
Copyright © 2020-2023  润新知