Redis常用数据类型和它们的底层数据结构

admin 2024年11月10日21:53:27评论2 views字数 3128阅读10分25秒阅读模式

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常用数据类型和它们的底层数据结构

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年11月10日21:53:27
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Redis常用数据类型和它们的底层数据结构https://cn-sec.com/archives/3380881.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息