Redis五大数据结构
底层实现
特点总结
String
字符串类型是Redis中最为基础的数据存储类型
该类型可以接受任何格式的数据
,是标准的key-value
,一般用来存字符串,整数和浮点数
。
但是String有一个明显的短板,就是它保存数据时所消耗的内存空间较多
。
Hash
形如 key={ {field1,value1},…{fieldN,valueN} }
hash是一个string
类型的field和value
的映射表
hash特别适合存储对象。
因为对象的每个属性对应一个{field1,value1},将多个属性封装成一个对象用hash存储可以占用更少的内存,并且可以更方便的存取整个对象(O(1)时间复杂度)。
列表list
双向链表结构,保证数据插入有序、可重复
集合set
hash结构,无序、唯一
Sorted Set
按score有序、不可重复
Sorted Set并不是像列表使用索引下标
作为排序依据,而是给每个元素设置一个分数(score)
作为排序的依据。
场景总结
对象 | 适用场景 |
---|---|
String | 缓存、计数、共享Session、限制次数 |
hash | 多个属性封装成对象,存储这个对象 |
list | 文章和评论列表 |
set | 唯一性,去重访问网站的IP |
zset | 去重+排序,适合诸如排行榜的排序场景 |
简单动态字符串SDS
SDS是String的底层数据结构,redis是用C语言开发的,那sds和c的字符串有什么不同呢?
C字符串 | SDS |
---|---|
获取字符串长度的复杂度为O(N) | 获取字符串长度的复杂度为O(1) |
可能会造成缓冲区溢出 | 通过自动扩容 不会造成缓冲区溢出 |
修改字符串会导致内存重配 | 通过空间预分配和惰性空间释放优化字符串的修改开销 |
只能保存文本数据 | 可以保存二进制或文本数据 |