Redis常用数据类型有8种:String、Hash、List、Set、Zset、HyperLogLog、Bitmap和Geospatial,其中前面5种是最常用的。
1、String(字符串)
String是最基本的数据类型,每个键对应一个值,可以是文本、数字、二进制数据等。
底层数据结构:
-
使用SDS(Simple Dynamic String,简单动态字符串);
-
解决了 C 语言字符串(以空字符 结尾)的不足;
-
具备自动扩展、长度缓存、二进制安全等优点。
应用场景: 缓存对象、计数器(如用户登录次数)、分布式锁。
常用命令举例
# 单值缓存
SET key value
# 对象缓存
set user:1 '{"name":"lucy","balance":20}'
2、Hash(哈希表)
Hash是一个键值对集合,适合存储对象或结构化数据。
底层数据结构:
-
当键值对较少时,使用压缩列表(Ziplist),节省内存;
-
当键值对较多时,使用哈希表(Hash Table),实现快速查找和更新。
应用场景: 存储用户信息、配置文件、购物车
常用命令举例
# 存储一个哈希表key的键值
HSET key field value
# 存储一个不存在的哈希表key的键值
HSETNX key field value
# 在一个哈希表key中存储多个键值对
HMSET key field value [field value ...]
# 获取哈希表key对应的field键值
HGET key field
Hash结构优缺点
优点:
1) 同类数据归类整合储存, 方便数据管理2) 相比string操作消耗内存与cpu更小3) 相比string储存更节省空间
缺点:
1) 过期功能不能使用在field上, 只能用在key上
2)Redis集群架构下不适合大规模使用
3 、List(列表)
List是一个有序的链表,可以在表头或表尾添加、删除元素。
底层数据结构:
-
当元素较少时,使用压缩列表(Ziplist),减少内存占用;
-
当元素较多时,使用双向链表(Linked List),方便在两端进行操作。
应用场景: 消息队列、任务列表、时间线。
常用命令举例
# 将一个或多个值value插入到key列表的表头(最左边)
LPUSH key value [value ...]
# 将一个或多个值value插入到key列表的表尾(最右边)
RPUSH key value [value ...]
# 移除并返回key列表的头元素
LPOP key
# 移除并返回key列表的尾元素
RPOP key
# 返回列表key中指定区间内的元素, 区间以偏移量start和stop指定
LRANGE key start stop
List类型使用注意点:一个list的容量是(2∧32-1)个元素, 大概40多亿。在实际应用时, 需注意大key问题。
4、Set(集合)
Set是无序的元素集合,每个元素都是唯一的。
底层数据结构:
-
当元素较少且都为整数时,使用整数集合(Intset),优化内存占用;
-
当元素较多或包含非整数元素时,使用哈希表(Hash Table),实现快速添加、删除、查询操作。
应用场景:去重、共同好友、标签系统等。
常用命令举例
# 往集合key中存入元素, 元素存在则忽略,若key不存在则新建
SADD key member [member ...]
# 从集合key中删除元素
SREM key member [member ...]
# 获取集合key中所有元素
SMEMBERS key
# 获取集合key的元素个数
SCARD key
# 判断member元素是否存在于集合key中
SISMEMBER key member
5、Zset(有序集合)
Zset与Set(集合)类似,但每个元素都会关联一个分数(score),根据分数排序。
底层数据结构:
-
使用跳表(Skip List)实现 Zset,能够在 O(log N) 时间内完成查找、插入和删除操作;
-
使用哈希表(Hash Table),存储成员和分数的对应关系,提供快速的成员查找。
应用场景:排行榜、按优先级排序的任务调度系统
常用命令举例
# 往有序集合key中加入带分值元素
ZADD key score member [[score member]… ]
# 从有序集合key中删除元素
ZREM key member [member … ]
# 返回有序集合key中元素member的分值
ZSCORE key member
# 返回有序集合key中元素个数
ZCARD key
# 正序获取有序集合key从start下标到stop下标的元素
ZRANGE key start stop [WITHSCORES]
# 倒序获取有序集合key从start下标到stop下标的元素
ZREVRANGE key start stop [WITHSCORES]
6、HyperLogLog
HyperLogLog是一种用于基数统计的概率性数据结构,适用于估算去重元素数量。
底层数据结构: 基于概率统计算法,使用非常小的内存(大约 12 KB)高效估算大量数据的基数,误差率一般在 0.81% 左右。
应用场景: 统计唯一IP访问量、页面浏览量等。
常用命令举例
# 向 HyperLogLog 添加元素,返回1表示数据结构更新,返回0表示未更新
PFADD key element [element ...]
# 计算一个或多个 HyperLogLog 的基数(估算不重复元素数),返回基数值。支持对多个 HyperLogLog 合并计算
PFCOUNT key [key ...]
# 将多个 HyperLogLog 合并到目标 HyperLogLog 中,适合合并多个数据集的去重计数
PFMERGE destkey sourcekey [sourcekey ...]
7、Bitmap(位图)
Bitmap是Bit 位操作的数据类型,允许操作二进制位。
底层数据结构:位数组,使用连续的位存储,适合进行大规模的布尔运算或位操作。
应用场景:用户签到记录、状态标识、在线用户统计。
常用命令举例
# 将一个二进制数组的offset位置设置成value。value只能是0或者1
SETBIT key offset value
# 返回一个二进制数组的offset位置的值
GETBIT key offset
# 返回二进制数组中1的个数
BITCOUNT key [start end [BYTE|BIT]]
# 返回bitmap中第一个值为bit的offset位置
BITPOS key bit [start [end [BYTE|BIT]]]
8、Geospatial(地理位置)
Geospatial是地理空间数据类型,可以存储经纬度和根据经纬度查询。
底层数据结构: Geohash 编码,把经纬度转换成字符串,并存储在 Zset 中,通过 Zset 的有序性实现地理位置相关的操作。
应用场景:附近的人、位置搜索、地图服务
常用命令举例
# 将地理位置(经度、纬度)元素添加到指定的 Geospatial 键中
GEOADD key longitude latitude member [longitude latitude member ...]
# 获取一个或多个成员的地理位置信息(经纬度)
GEOPOS key member [member ...]
# 计算两个成员之间的距离。单位可以是 m(米),km(千米),mi(英里),或 ft(英尺)
GEODIST key member1 member2 [unit]
# 在给定的经纬度为中心的范围内查找成员,单位和 GEODIST 类似,可以选择返回距离、坐标等详细信息
GEORADIUS key longitude latitude radius unit [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count] [ASC|DESC]
9、我的公众号
敬请关注我的公众号:大象只为你,持续更新技术知识......
原文始发于微信公众号(大象只为你):Redis常用数据类型和它们的底层数据结构
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论