一,原理
redis是一个k/v(键值对)的内存存储系统,类似于memcached,redis支持多种的数据类型 基础的有:
1),基础的有:
1,string:字符串,在redis中可以用一个动态的字符串型的抽象类型(len.free,buf),O(1)去获取字符串,而C的string类型需要O(n)的时间复杂度,因为需要遍历
2,hash:哈希表,在redis中使用了hashmap 或者是压缩表的格式来实现,等价于Java语言的HashMap或者是Python语言的dict
3,list:列表,在redis中使用了ziplist或者是linkedlist(双向链表),新版本(3.2)之后引入了一个新的list结婚,quicklist 来实现
4,set:集合和数学中的集合定义一样,也支持求交,并,补,差集等运算,在redis中使用了intset或者是hashtable来实现
5,sortedset:有序集合,定义和set一样,只不过它支持排序,在redis中用zskiplist和ziplist来实现,
2),高级的有
HyperLogLog基数统计
get (位置)
pub/sub订阅模式
在redis中,是用一个redisObject来描述我们定义的数据对象,redisObject存储四个结构type,encoding,ptr,vm
type:redis中上层的数据类型
encoding:redis底层的编码方式
ptr:指向的数据块的指针
vm:虚拟化的内存
二,底层数据结构
1,SDS - simple synamic string - 支持自动动态扩容的字节数组
2,list - 平平无奇的链表
3,dict - 使用双哈希表实现的, 支持平滑扩容的字典
4,zskiplist - 附加了后向指针的跳跃表
5,intset - 用于存储整数数值集合的自有结构
6,ziplist - 一种实现上类似于TLV, 但比TLV复杂的, 用于存储任意数据的有序序列的数据结构,俗称压缩表
7,quicklist - 一种以ziplist作为结点的双链表结构, 实际为ziplist和linkedlist的结合
8,zipmap - 一种用于在小规模场合使用的轻量级字典结构
三,redis如何做出的选择:
redis对象
redis中并没有直接使用以上所说的各种数据结构来实现键值数据库,而是基于一种对象,对象底层再间接的引用上文所说的具体的数据结构。
结构如下图:
字符串:
List:
Hash:
Set:
Zset:
三,优点
1,完全基于内存的数据存储,访问速度快
2,因为是基于内存的,所以增加了持久化(rob,aof),rdb简单的理解为数据快照,或者是刷盘,aof是追加日志文件
3,丰富的数据类型和应用场景以满足不同的需求
4,支持扩展,支持主从同步