Redis为什么这么快?

Redis为什么这么快?
说起当前主流NoSql数据库非 Redis 莫属。因为它读写速度极快,一般用于缓存热点数据加快查询速度,大家在工作里面也肯定和 Redis 打过交道,但是对于Redis 为什么快,除了对八股文的背诵,好像都还没特别深入的了解。
 
今天我们一起深入的了解下redis吧:
 
高效的数据结构
 
Redis 的底层数据结构一共有6种,分别是,简单动态字符串,双向链表,压缩列表,哈希表,跳表和整数数组,它们和数据类型的对应关系如下图所示:
 
本文暂时按下不表,后续会针对以上所有数据结构进行源码级深入分析
 
单线程vs多线程
 
在学习计算机操作系统时一定遇到过这个问题: 多线程一定比单线程快吗? 相信各位看官们一定不会像上面的傻哪吒一样落入敖丙的圈套中。
 
多线程有时候确实比单线程快,但也有很多时候没有单线程那么快。首先用一张3岁小孩都能看懂的图解释并发与并行的区别:
 
并发(concurrency):指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行。
 
并行(parallel):指在同一时刻,有多条指令在多个处理器上同时执行。所以无论从微观还是从宏观来看,二者都是一起执行的。
 
不难发现并发在同一时刻只有一条指令执行,只不过进程(线程)在CPU中快速切换,速度极快,给人看起来就是“同时运行”的印象,实际上同一时刻只有一条指令进行。但实际上如果我们在一个应用程序中使用了多线程,线程之间的轮换以及上下文切换是需要花费很多时间的。
 
Talk is cheap,Show me the code
 
如下代码演示了串行和并发执行并累加操作的时间:
 
public class ConcurrencyTest {
 
    private static final long count = 1000000000;
 
    public static void main(String[] args) {
 
        try {
 
            concurrency();
 
        } catch (InterruptedException e) {
 
            e.printStackTrace();
 
        }
 
        serial();
 
    }
 
    private static void concurrency() throws InterruptedException {
 
        long start = System.currentTimeMillis();
 
        Thread thread = new Thread(new Runnable() {
 
            @Override
 
            public void run() {
 
                 int a = 0;
 
                 for (long i = 0; i < count; i++)
 
                 {
 
                     a += 5;
 
                 }
 
            }
 
        });
 
        thread.start();
 
        int b = 0;
 
        for (long i = 0; i < count; i++) {
 
            b--;
 
        }
 
        thread.join();
 
        long time = System.currentTimeMillis() - start;
 
        System.out.println("concurrency : " + time + "ms,b=" + b);
 
    }
 
    private static void serial() {
 
        long start = System.currentTimeMillis();
 
        int a = 0;
 
        for (long i = 0; i < count; i++)
 
        {
 
            a += 5;
 
        }
 
        int b = 0;
 
        for (long i = 0; i < count; i++) {
 
            b--;
 
        }
 
        long time = System.currentTimeMillis() - start;
 
        System.out.println("serial : " + time + "ms,b=" + b);
 
    }
 
}

推荐阅读