zoukankan      html  css  js  c++  java
  • [redis] 为什么效率高

    1. 单线程

     单线程保证了系统没有线程的上下文切换和竞争条件儿消耗的CPU资源,也不用考虑锁的问题

     我们常说的redis是单线程的,指的是网络请求模块使用了一个线程,即只有一个线程处理所有的网络请求(对数据库的操作)

     其他模块仍会使用多线程,redis在运行的时候,不只是一个进程,例如持久化的时候,以子进程的方式执行;

    2. 内存操作

     操作基于内存,数据存在内存中,读取数据的时候不需要进行磁盘IO,查找和操作的时间复杂度O(1)

    3. 高效的数据结构

     1.SDS(Simple Dynamic String)结构体保存字符串,例如:执行命令 set key value,key和value 都是一个SDS类型的结构存储在内存中

    struct sdshdr {
        int len; //用于记录 buf 中已使用空间的长度
        int free; //buf 中空闲空间的长度
        char buf[]; //存储实际内容
    }

     2. 减少字符串修改是带来的内存重新分配次数;在C中频繁的对一个字符串进行修改(append 或 trim)需要频繁的进行内存重新分配的操作,十分影响性能

     3. 字典,与Java中的HashMap类似,rehash

     4. Zset有序链表底层数据结构为跳跃表

     5. 压缩列表ziplist,列表键和字典键的底层数据实现

     6. 编码转换、、

    4. 多路I/O复用模型

     多路-指的是多个socket连接,复用-指的是复用一个线程,采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求,IO多路复用原理

    5. 注意点

     我们知道Redis是用”单线程-多路复用IO模型”来实现高性能的内存数据服务的,这种机制避免了使用锁,但是同时这种机制在进行sunion之类的比较耗时的命令时会使redis的并发下降。

     因为是单一线程,所以同一时刻只有一个操作在进行,所以耗时的命令会导致并发的下降,不只是读并发,写并发也会下降。

     而单一线程也只能用到一个CPU核心,所以可以在同一个多核的服务器中,可以启动多个实例,组成master-master或者master-slave的形式,耗时的读命令可以完全在slave进行

    《性能调优攻略》

    我们不能任由操作系统负载均衡,因为我们自己更了解自己的程序,所以,我们可以手动地为其分配CPU核,而不会过多地占用CPU,或是让我们关键进程和一堆别的进程挤在一起

    CPU是一个重要的影响因素,由于是单线程模型,Redis 更喜欢大缓存快速 CPU, 而不是多核;

    在多核 CPU 服务器上面,Redis 的性能还依赖NUMA 配置和处理器绑定位置。最明显的影响是 redis-benchmark 会随机使用CPU内核。

    为了获得精准的结果,需要使用固定处理器工具(在 Linux 上可以使用 taskset)。最有效的办法是将客户端和服务端分离到两个不同的 CPU 来高效使用三级缓存。

  • 相关阅读:
    ARM裸机开发(二)中断编程
    Linux汇编与C互相调用
    Java 2009
    MFC对Socket编程的支持
    Thinkpad
    IE9
    ASP.NET MVC学习教材
    sysprep.exe修改SID
    查询显示进度条
    MOSS2007中型服务场管理 教材<02>: SubSite Backup & Restore
  • 原文地址:https://www.cnblogs.com/oxygenG/p/13789190.html
Copyright © 2011-2022 走看看