redis的初步认识

坎布里奇 2019-06-14

redis 服务器 性能 线程 数据库 多进程 多线程 磁盘 存储 数据类型

1. 定义

遵守BSD协议,高性能的key-value数据库

2. 特点

    a. 内存数据库,支持数据的持久化;
    b. 多种数据类型;
    c. 支持数据的备份,master-slave模式的数据备份。

3. 优势

    a. 性能极高(快);
        i. 纯内存数据库;
        ii. 使用非阻塞的IO多路复用机制;
        iii. 采用单线程的模型, 保证了每个操作的原子性,减少了线程上下文切换;
        iv. 使用hash结构,读取速度快;
        v. 采用事件分离器。
        使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求
    b. 丰富的数据类型;
        i. String ,Hash,List,Set,sorted set ;
    c. 原子
        i. 操作的原子性,而且支持几个操作合并后的原子性执行;
    d. 丰富的特性
        i. 支持publish/subscibe,通知,key过期等特性。
    

4. 连接

    命令: redis-cli -h host -p port -a password
    测试是否成功: ping     返回结果为pong则成功

5. 数据类型:

    字符串:最基本的类型,一个key对应一个value;一个键最大能存储512MB;
            二进制安全的,redis的string可以包含任何数据,例如jpg图片或序列化的对象。
    Hash(哈希):一个键值对集合;
                hash是一个string类型的field和value的映射表,hash适合存储对象。
    List(列表):列表是简单的字符串列表,按照插入顺序排序。可以在头或者尾部插入。一个列表最多可存储40多亿。
    Set(集合): String类型的无序集合,集合是通过哈希表实现的,故添加、删除、查找的复杂度都是o(1)。不允许重复。 最多可存储40多亿
                sadd 命令 : sadd key member  key对应的set集合,member 要添加的元素   返回结果: 1 成功 0 已存在 错误 set不存在
                smembers 命令: smembers key 遍历
    Zset(sorted set : 有序集合): String类型的集合,不允许元素重复。
                                  每个元素都会关联一个double类型的分数,redis是通过此分数来为集合中的成员进行从小到大的排序。(升序)
                                  元素唯一,分数可以重复。
                zadd 命令: zadd key score member ;如果元素已存在,则更新对应的score ;
                zrangebyscore: zrangebyscore key 0 1000
    

6. 单线程设计的原因:

        i. 因为redis是基于内存操作的,读写数据不涉及i/o操作;
            1) cpu不是限制条件,它的瓶颈最可能是机器内存;
            2) 网络宽带。
                a) redis客户端执行命令包括:发送命令、命令排队、命令执行、返回结果;
                b) 发送命令+返回结果这个过程称为**Round Trip Time**(往返时间) ;
                c) redis的客户端和服务端可能在不同的服务器上,传输速度就和网络宽带有关了,一次请求的时间取决于网速。
                d) 因此,一般都是就近部署。
        ii. 脱离了锁的性能消耗
            1) redis提供了丰富的数据结构,在列表、hash中添加、删除元素,就需要考虑安全的问题,锁的使用导致同步开销变大;
            2) 单线程不存在加锁释放锁等,也不会出现死锁等。
        iii. 采用单线程、多进程的集群
            1) 多服务器集群,使用的是单线程还是多线程?
        iv. cpu消耗的考虑
            1) 采用单线程,避免不必要的上下文切换和竞争,也避免了多线程因为线程的轮流切换导致cpu的消耗;
            2) cpu的闲置、限制的处理方法: 通过多进程,也就是多启动几个redis进程;(因为redis是key-value数据库,数据之间没有约束)

7. 单线程设计的评判:

    a. 优势:
        i. 处理逻辑清晰,不用考虑锁的各种处理,线程的轮流切换导致的性能问题。
    b. 劣势:
        i. 浪费多核服务器的性能。

8. IO多路复用技术:

    a. redis采用网络I/O多路复用技术来保证多连接的时候,系统的高吞吐量;
    b. redis是单进程,所有的操作都是按照顺序线性执行的,但是由于读写操作等待用户输入或输出都是阻塞的,所以I/O操作在一般情况下不能直接返回,
    这就导致了某一文件的I/O阻塞导致整个进程无法对其它客户提供服务。所以采用I/O多路复用;
    c. 与多进程和多线程技术相比,I/O多路复用技术的最大优势是系统开销小,系统不必创建进程/线程,也不必维护这些进程/线程,从而大大减小了系统的开销。
     

备注:

     多线程一般在i/o操作的时候才使用。 磁盘i/o,网络i/o
           因为i/o操作一般是可以分为两个阶段: 等待i/o准备就绪和真正操作i/o资源。  
        在磁盘上数据是分磁道、分簇存储的,而数据往往并不是连续排列在同一磁道上,所以磁头在读取数据时往往需要在磁道之间反复移动,因此这里就有一个寻道耗时!另外,盘面旋转将请求数据所在扇区移至读写头下方也是需要时间,这里还存在一个旋转耗时!"
    "那么,在这一时间段(即"I/O等待")内,线程是在“阻塞”着等待磁盘,此时操作系统可以将那个空闲的CPU核心用于服务其他线程。因此在I/O操作的情况下,使用多线程,效率会更高
           IO多路复用技术:
                 内核在发现某一个进程指定的一个或者多个IO条件准备读取,就会通知该进程,IO多路复用适合如下场景:
                1) 当一个客户端在某一时刻同时处理多个套接口时,可能但很少出现;
           2) 当客户端处理多个描述字时(一般指的是交互式输入和网络套接口),必须使用I/O复用    
           3) 如果一个tcp服务器在处理监听套接口的时候,又要处理已连接的套接口,正常情况下也需要用到I/O复用
           4)如果一个服务器在处理Tcp的时候.又要处理UDP,正常情况下也需要使用I/O复用
                5) 如果一个服务器要处理多个服务或多个协议,正常情况下也需要使用I/O复用。

参考文案:

        1. https://www.jianshu.com/p/2c735d41606e 
        2. https://www.redis.net.cn/tutorial/3505.html
        3. https://yq.aliyun.com/articles/41560?spm=a2c4e.11163080.searchblog.79.792f2ec18QvhIQ
登录 后评论
下一篇
冒顿单于
60183人浏览
2019-06-20
相关推荐
Redis几个认识误区
751人浏览
2016-08-25 23:33:00
redis-cluster搭建&初步体验
411人浏览
2015-09-01 15:08:49
Redis开发 - 1. 认识redis
290人浏览
2016-11-05 19:33:00
Redis Cluster原理初步
398人浏览
2016-05-16 17:03:52
认识ssm框架和Redis
630人浏览
2018-09-27 16:50:00
0
0
0
331