基本数据类型
- String字符串类型
- list列表类型
- hash字典类型
- set集合类型
- zset有序集合类型
String类型
字符串类型
存储和扩容:在Redis设计中,字符串类型采用预先分配冗余空间的方式来减少字符串大小变化引起的内存频繁重新分配,首先在分配空间时会预先分配一个比当前字符串实际长度要大的空间。需要扩容时,如果当前空间小于1M,则扩容1倍,如果当前空间已经大于了1M,再次扩容做多一次扩容1M,一个字符串类型最大长度为512M。
list类型简介
属于链表结构而非数组,类似Java的LinkedList,即插入和删除非常快(时间复杂度O(1)),但是查询慢(时间复杂度O(n))。如果链表中没有了任何元素,该链表内存将会回收,链表被删除。
可使用链表来做异步队列,Redis的链表是双向链表,支持从头部开始消费,即先进先出,可以当做队列使用;也支持从尾部开始消费,即先进后出,可以当做栈使用。
一些基本命令:
lpop:从头部弹出一个元素,即队列
rpop:从尾部弹出一个元素,即栈
lindex:指定index位置的获取,与Java中的list操作类似,只是因为链表结构性能较差
ltrim:Java的字符串里的trim()方法可以删除前后的空格,在redis的列表结构中作用类似,是去除你指定范围前后的数据,只保留你指定区间的数据,需要start位置和end位置两个参数
Redis使用快速链表来实现list数据类型,它将链表和压缩列表ziplist联合使用,使用双向指针将他们连在一起,在满足较快的插入删除的同时,减少空间冗余。
hash字典类型
值只能是字符串类型
结构上与Java的hashmap类似,当key发生碰撞时,会形成链表的形式来存储。
比较大的hash字典的rehash过程是比较耗时的,Redis的hash在rehash过程中为了保证高性能,是采用渐进式的rehash,即rehash时新生成一个hash结构并且保留旧的hash结构,然后使用定时任务逐渐的将旧hash中的数据搬迁到新hash中,期间查询操作会同时查询两个hash结构,直到旧hash的数据全部完成搬迁。
当hash中不存在任何元素了,该内存区域被回收
set集合
无序、键值唯一性,类似Java的hashSet,不过value全是null
最后一个元素被移除之后,会回收该部分内存
可以利用它的去重功能实现一些逻辑。
zset有序列表
兼具有序性和value的唯一性,可以给value赋一个score的值用于排序
zset使用跳跃列表的方式实现,将数据分层冗余存储,最底层是全量数据,从全量数据中提取部分数据形成第二层,再从第二层提取部分数据形成第三层...进行快速的插入和删除时,先从上层开始,一层一层的确定要插入或者删除的区间,直至落入最后一层的准确位置。
网友评论