多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] # 介绍 Redis使用了单线程架构和I/O多路复用模型来实现高性能的内存数据库服务。 - 为什么要用单线程? ``` Redis是基于内存的存储。本身性能足够高了,没必要多线程。 --官方解释 ``` ![](https://box.kancloud.cn/1af5535b6fe5e955a03b44d4b147c809_918x547.png) - 非阻塞I/O多路复用 ``` 多路复用: 一个线程处理所有请求。 比喻就是: 一个程序员处理所有问题,前端来活干前端,后台来活干后端。 非阻塞: 不必等完全处理完前端任务再去处理后台。 ``` ![](https://box.kancloud.cn/25013a1a8c09c327175e9d672138a406_924x538.png) # 基础数据类型 ### string - 字符串类型的内部编码 ``` int:8个字节的长整型 embstr:小于等于39个字节的字符串 raw:大于39个字节的字符串 Redis会根据当前值的类型和长度决定使用哪种内部编码实现。 ``` ![](https://box.kancloud.cn/3df98103a656126c880c12b178283e07_800x147.png) **常用API算法时间复杂度**** ![](https://box.kancloud.cn/0e7fbadaa8cb0c268e285ec3920be474_963x519.png) ### hash - 是一个string类型的用来存储key,field,value的键值对的映射表,添加和删除时间复杂度都为O(1) ``` ·ziplist(压缩列表):当哈希类型元素个数小于hash-max-ziplist-entries配置(默认512个)、同时所有值都小于hash-max-ziplist-value配置(默认64字节)时,Redis会使用ziplist作为哈希的内部实现 ·hashtable(哈希表):当哈希类型无法满足ziplist的条件时,Redis会使用hashtable作为哈希的内部实现,因为此时ziplist的读写效率会下降,而hashtable的读写时间复杂度为O(1) ``` ![](https://box.kancloud.cn/5895f5b110062455d3c5957ed0883bad_779x159.png) **常用API算法时间复杂度** ![](https://box.kancloud.cn/9b3ff6f11cfce5bb10cdb079b5389b93_967x629.png) ### list - 列表类型,存储类似一维数组数据 ``` 2种编码实现 1. ziplist(压缩列表) 元素个数小于配置(默认512),每个元素大小小于64字节(默认) 2. linkedlist(链表) 当列表类型无法满足ziplist的条件时,Redis会使用linkedlist作为列表的内部实现 3. Redis3.2版本提供了quicklist内部编码,简单地说它是以一个ziplist为节点的linkedlist,它结合了ziplist和linkedlist两者的优势,为列表类型提供了一种更为优秀的内部编码实现 ``` ![](https://box.kancloud.cn/8e4389b32f18c2a17c0a265b58fc10db_291x142.png) **常用API算法时间复杂度** ![](https://box.kancloud.cn/98452ee564f1509e7c532fd47ec307bb_958x428.png) ### set - 集合类型 ``` intset(整数集合):当集合中的元素都是整数且元素个数小于set-maxintset-entries配置(默认512个)时,Redis会选用intset来作为集合的内部实现,从而减少内存的使用。 hashtable(哈希表):当集合类型无法满足intset的条件时,Redis会使用hashtable作为集合的内部实现。 ``` 3.2.6 目前是用hashtable ![](https://box.kancloud.cn/55009dbf6c1f757cd31af2bf493f36b9_267x80.png) **常用API算法时间复杂度** ![](https://box.kancloud.cn/10c80469fd24452334b6f1c1e4c51fcf_977x386.png) ### zset - 有序集合 ``` ziplist(压缩列表):当有序集合的元素个数小于zset-max-ziplistentries配置(默认128个),同时每个元素的值都小于zset-max-ziplist-value配置(默认64字节)时,Redis会用ziplist来作为有序集合的内部实现。 skiplist(跳跃表):当ziplist条件不满足时,有序集合会使用skiplist作为内部实现,因为此时ziplist的读写效率会下降。 ``` ![](https://box.kancloud.cn/e935e806578217a0f9e6c528e851adcc_273x116.png) ![](https://box.kancloud.cn/eafa7c8a16678a31288eba205a727b54_929x92.png) **常用API算法时间复杂度** ![](https://box.kancloud.cn/08e9b6fe6723d599836fc0f2e6c816b6_960x748.png)