value类型字符串哈希列表集合有序集合相对于集合来说增加了权重举个例子该有序集合里面存储的是学生的成绩该成绩就是权重Redis在底层实现上述数据结构时会在源码层面针对上述实现进行特定优化来达到节省时间/节省空间的效果它保证了在应用层展现的是上述类型的特点但并不保证在底层使用的就是该类型string类型内部编码raw最基本的字符串底层就是一个char数组intredis通常也会实现一些计数功能当value是一个整数的时候此时redis会直接用int来保存embstr针对短字符串进行优化hash内部编码hashable最基本的哈希表redis内部的哈希表的实现虽然这里的实现方式可能不太一样但是整体思路和之前学的一致ziplist在哈希表里面元素比较少的时候可能就变成了ziplist压缩列表这样可以节省空间但这样就不会向哈希表那样定值那么快因为列表需要遍历所以只适合元素比较少的情况下为什么在这个位置要选择压缩列表因为value可能还是个哈希结构但是这时的哈希结构并不大如果采用常用的哈希结构就会出现大量内存浪费的问题所以引入了这个结构当哈希不大的时候采取压缩列表并不会很影响效率虽然需要遍历压缩列表但是压缩列表并不大遍历很快就结束了list内部编码linkedlist正常链表结构ziplist从redis3.2开始引入了新的实现先方式quicklist取代上述两种结构quick list大概实现方式本质还是一个链表只是链表的每个元素是一个ziplist把空间和效率都折中的兼顾到类似于C中的std::dequeset内部编码hashableintset对特定场景进行优化该场景为集合中都是整数zset内部编码skiplist跳表跳表也是链表不同于普通链表每个节点上有多个指针域巧妙的搭配了这些指针域的指向就可以做到从跳表上查询元素的时间复杂度为O(lo0gN)ziplistobject encoding查看key对应的实际编码方式操作格式object encoding key举个例子object encoding key1redis会根据实际情况自动选择内部的编码方式redis单线程模型redis只使用一个线程来处理所有请求不是说redis进程真的只有一个线程多线程部分用来处理网络IO问题两个客户端同时发起请求相当于“并发”当两个请求同时请求同一个数据时候会造成“线程安全”的问题呢并不会因为是单进程执行处理请求所以当两个请求都来的时候在redis内部也是要“排队”的所以他俩并不会同时对一个数据产生影响所以不会出现“并发”的问题。为什么这里不选择多线程执行redis选择单线程执行任务主要原因就是redis核心业务都是短平快的不太消耗CPU资源。也就不吃多核反而频繁切换线程加锁解锁反而是种负担可能还会影响效率。redis虽然是单线程模型为什么效率还这么高这里效率高是相对于关系型数据库来讲的Mysqloraclsql serverredis访问内存mysql访问硬盘redis核心功能比mysql核心功能更加简单mysql对于核心的插入删除都有复杂的功能支持这样势必会增大开销比如针对插入删除mysql各种约束都会使mysql做额外的工作单线程模型避免了一些不必要的开销处理网络IO的时候使用了epoll这样的IO多路复用机制