不涉及源码分析,仅仅作为个人的温故知新;
Redis常用数据结构有哪些?
5种基础数据结构:String, List, Set, Hash, Zset
三种特殊数据结构:HyperLogLogs(基数统计),Bitmap(位存储),Geospatial(地理位置)
5种基础数据结构底层依赖以下8种,简单动态字符串(SDS)、LinkedList(双向链表)、Hash Table(哈希表)、SkipList(跳跃表)、Intset(整数集合)、ZipList(压缩列表)、QuickList(快速列表)
String | List | Set | Hash | Zset |
SDS | LinkedList/ZipList/QuickList | ZipList,Intset | Hash Table、ZipList | ZipList、SkipList |
List
Redis实现的List实际是个双向链表,可以支持反向查找和遍历,方便操作但是增加了额外的内存开销。还可以通过RPUSH/LPOP或LPUSH/RPOP实现队列操作,可以用来做消息队列。
Hash
有点类似于JDK1.8之前的Hashmap,数组+ 链表;适合储存对象,比如商品价目表,用户信息。
Set
存放数据唯一等场景。比如点赞
Zset
需要存储的数据有优先级或者重要程度的场景 比如优先级任务队列。
举例 :优先级任务队列。
相关命令 :ZRANGE (从小到大排序) 、 ZREVRANGE (从大到小排序)、ZREVRANK (指定元素排名)。
Bitmap
储存连续二进制数字。
举例 :用户签到情况、活跃用户情况、用户行为统计(比如是否点赞过某个视频)。
HyperLogLog
Redis的HyperLogLog指向需要12K的空间就可以存储2^64个不同元素。
稀疏矩阵 :计数较少的时候,占用空间很小。
稠密矩阵 :计数达到某个阈值的时候,占用 12k 的空间。
应用场景
数量量巨大(百万、千万级别以上)的计数场景
举例 :热门网站每日/每周/每月访问 ip 数统计、热门帖子 uv 统计、
Geospatial index
基于Sorted Set实现
适合实现:附近的人