Redis - 数据类型与编码方式
Redis中常用的5种数据类型
包括字符串、哈希、列表、集合、有序集合
- 字符串,相当于Java中的String
- 哈希,相当于Java中的HashMap
- 列表,相当于Java中的List
- 集合,相当于Java中的Set
- 有序集合,多存储了一个权重
Redis承诺使用上述数据结构进行操作的时间复杂度与我们所知道的哈希表、字符串等是一致的,但是内部实现这些数据结构不一定是哈希表、字符串等
编码方式
字符串
字符串包括raw、int、embstr3种编码方式
- raw:就是最基本的字符串(底层使用一个字节数组存储)
- int:当value是一个整数时,Redis可能会使用int来保存字符串
- embstr:针对短字符串进行的特殊优化
这些编码方式是自适应的,我们使用Redis时感知不到
哈希表
哈希表的编码方式包括hashtable、ziplist
- hashtable:最基本的哈希表
- ziplist:压缩列表,在哈希表中元素比较少的时候,会优化成ziplist,能够节省空间
列表
编码方式有:linkedlist、ziplist
- linkedlist:链表
- ziplist:压缩列表
Redis3.2版本开始引入了quicklist(同时兼顾linked和ziplist的优点,可以理解为,quicklist是一个链表,每个元素是一个ziplist)
集合
编码方式:hashtable、intset
- hashtable:哈希表
- intset:整数集合(如果集合中的数全是int类型的,会优化成intset)
有序集合
编码方式:skiplist、ziplist
- skiplist:跳表,特殊的链表,查询的时间复杂度是O(logN)
- ziplist:压缩列表
使用命令查看key对应的value的编码方式
语法如下
object encoding key
Redis单线程模型
Redis只使用一个线程处理所有的命令请求(并不是说一个Redis服务器进程内部只有一个线程,还有其他线程处理其他的事情),所以当多个请求同时到达服务器,不会产生线程安全问题
那么,为什么Redis是单线程的速度还这么快?(前提是和MySQL等关系型数据库比较)
原因:
1、Redis访问的是内存,数据库访问的是硬盘
2、Redis核心功能比数据库的核心功能更简单,只是针对key进行操作,而数据库会有更多复杂的操作
3、Redis单线程模型避免了线程竞争的开销
4、处理网络IO的时候,使用了IO多路复用机制(一个线程管理了多个Socket)