1.基于内存的数据库
存在内存,减少了不必要的IO操作,操作速率快
2.高效的数据结构
1.简单动态字符串
Redis字符串如果保存的对象是整数,就用int 存储,如果不能用整数表示,就用SDS来存储,SDS通过字符串的长度,预分配空间,可以高效计算长度,进行append操作。
2.双向链表
3.压缩列表
4.哈希表
链式哈希解决哈希冲突,随着链表长度的增加,查询会耗时,所以有了rehash,对哈希表长度进行扩展。
渐进式rehash的方式,进行增删改查时,会将索引位置上所有的键值对进行迁移
6.跳表
因为链表适合插入删除,不适合用来查询。所以为了适合查询,就有了跳表。跳表就是多层的有序的链表,查询过程从左到右,从上到下,时间复杂度logn。
跳表的实现是概率均衡的思想,随机函数决定节点插入的层数,50%的概率在第一层,25%的概率在第二层,12.5%的概率在第三层,这样保证了上层的数据越来越少,所以跳跃查询就很方便。
3.合适的线程模型
单线程的执行,不需要上下文切换,不需要考虑锁的问题,减少了耗时。(单线程的意思是处理网络请求的时候只用一个线程来处理。)
IO多路复用模型监听客户端连接。
引申:
1.redis数据结构?
对外是5种redis对象:String、List、Hash、Set、Zset
底层依托于:SDS、跳表、压缩列表等等
2.IO多路复用是什么意思?
多路,就是多个网络连接。复用:就是使用同一个线程。
IO多路复用程序职责:监听多个套接字,将产生事件的套接字放到队列里面,向 文件事件分派器传送这些套接字
IO多路复用程序的实现:底层使用的select、poll、epoll。