【01】Redis的数据结构

redis的数据类型和底层的数据结构

可以看到除了string,其他的数据类型底层都有两种数据结构来实现

redis是怎么存储的

redis的是用了一个hash表(全局hash表)来存放所有的键值对,value存放的是只想具体数据的指针。所以查询的时候也会有因为hash冲突带来的慢查询问题。为了解决这个问题,redis会创建两个全局hash表,一大一小,当小表中的数据冲突越来越多时,会把数据移动到大表中去,这样就可以降低hash冲突。

为了避免拷贝数据时redis不可用,redis采用了渐进式rehash,即让读写请求线程来帮忙拷贝元素到新表中。跟concurrenthashmap扩容时的思想有点类似。

压缩列表

自我理解是数组和链表的结合体,连续内存空间,但是每个元素的大小是可以不同的,而且是可以扩容的。压缩表的设计是为了节省空间,如果我们要存放一些字符串,如果用普通数组,则每个数组元素的大小会按最长的那个来申请。

压缩表可以快速的找到表头表尾的元素

跳表 

加了索引的有序链表,可以将查找的时间复杂度由O(N)降低到O(logN)

 

 为什么不使用红黑树

1、实现简单。
2、区间查找快。跳表可以做到O(logn) 的时间复杂度定位区间的起点,然后在原始链表中顺序往后遍历就可以了。
3、并发环境优势。红黑树在插入和删除的时候可能需要做一些rebalance的操作,这样的操作可能会涉及到整个树的其他部分,而skiplist的操作显然更加局部性一些,需要锁住的节点更少,因此在这样的情况下性能好一些。

各种数据类型的应用场景

类型特点应用场景
String可以存任何数据,最大能存512M可以用来做缓存,计数等
Hash

结构化的数据,适合存放对象,并且可以单独修改

某一个属性值

可以用来存用户信息,来模拟session实现单点登录key用cookie来当

List有序的双向链表,增删比较快可以用来当作消息队列,实现最新消息排行等功能
Set基于hash表实现的不重复元素集合

可以用来求交集(共同好友)

统计访问网站的所有IP

Sorted Set带权重的set,会按权重排序可以用来取TopN,做排行榜

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值