泰安润泽建设工程有限公司网站,公司做网站要多长时间审核,互联网平台宣传推广方案,商城源代码Redis有哪些数据类型#xff1f;底层实现分别是什么
Redis数据类型概述
Redis作为一款键值存储系统#xff0c;提供了丰富多样的数据类型以满足不同场景的需求。以下是Redis支持的主要数据类型及其基本用途#xff1a;
String#xff08;字符串#xff09;
存储单个键…Redis有哪些数据类型底层实现分别是什么
Redis数据类型概述
Redis作为一款键值存储系统提供了丰富多样的数据类型以满足不同场景的需求。以下是Redis支持的主要数据类型及其基本用途
String字符串
存储单个键值对支持增删改查、自增、截取等操作。
应用场景计数器、缓存、分布式锁等。
底层实现Redis字符串是动态字符串SDS其内部结构包含长度、已用长度和字节数组。
编码方式Redis对字符串值的存储采用多种编码如
REDIS_ENCODING_INT当值为整数且在一定范围内时直接存储整数值节省空间。
REDIS_ENCODING_EMBSTR对于短字符串使用embstr编码将字符串与结构体紧凑存储在同一块连续内存中减少内存分配次数。
REDIS_ENCODING_RAW长字符串或非整数值使用raw编码即传统的简单动态字符串。
List列表
有序的字符串列表支持两端插入、弹出、范围查询等操作。
应用场景消息队列、最新N个元素列表等。
底层实现列表有两种编码方式分别是
ziplist压缩列表对于元素数量少且元素长度较短的列表使用连续内存存储节省空间。
linkedlist双端链表当列表元素数量或长度超过一定阈值时转为双端链表实现保证操作的高效性。
Set集合
无序的字符串集合不允许重复成员支持添加、删除、成员关系判断等操作。
应用场景标签系统、唯一性检查、交并差集运算等。
底层实现集合也有两种编码
intset整数集合当集合中所有元素都是整数且范围适当时使用整数集合存储空间效率高。
hashtable哈希表当集合包含非整数元素或元素数量超过一定阈值时转化为哈希表实现提供快速的增删查操作。
Sorted Set有序集合
类似集合但每个成员附带一个分数依据分数进行排序。
支持添加、删除、按分数范围查询、排名、聚合操作等。
应用场景排行榜、带权重的标签系统、Top N查询等。
底层实现有序集合基于ziplist或skiplist跳跃表编码
ziplist小型有序集合使用压缩列表存储元素按分数排序。
skiplist大型有序集合使用跳跃表实现提供O(log N)的插入、删除、查找等操作同时保留了集合成员的顺序。
Hash哈希
键值对的集合每个键值对由field-value组成。
支持增删改查单个field批量操作整个哈希。
应用场景对象属性存储、购物车等。
底层实现哈希同样存在两种编码
ziplist对于小规模哈希字段数量和值长度较小使用压缩列表存储紧凑且高效。
hashtable当哈希的字段数量或值长度超过阈值时转化为哈希表实现提供快速的字段查找和更新。
Bitmaps位图
功能Bitmaps允许以位bit为单位存储数据非常适合用来表示稀疏的二进制状态如用户签到、统计用户行为等。
应用案例用户签到系统
假设有一个网站需要记录用户每天的签到情况。对于每个用户我们可以使用一个唯一的用户ID作为键名用Bitmaps来表示其连续365天的签到状态。每天签到时使用SETBIT命令将对应日期的位设置为1。查询用户在过去一周是否有连续签到则可通过BITCOUNT命令计算过去7天的位图中值为1的位数。 底层实现在Redis中位图实际上是基于字符串String类型实现的每个字节8位对应字符串中的一个字符。通过对字符串执行位操作命令如SETBIT, GETBIT, BITCOUNT, BITOP等可以高效地进行位的增删查改。
HyperLogLog
功能HyperLogLog是一种概率数据结构用于估算集合中不重复元素基数的大致数量而不需要存储所有元素。它以极小的空间开销通常几百字节提供接近精确的计数适用于大规模唯一计数场景如网站独立访客统计、唯一事件计数等。
应用案例网站独立访客统计
在一个网站中需要统计每天访问的独立访客数但不想为每个访客保存完整的访问记录。可以为每天创建一个HyperLogLog键每当有新的访客访问时将其唯一标识符如IP地址或用户代理字符串的哈希值添加到当天的HyperLogLog中。使用PFADD命令添加元素PFCOUNT命令获取估计的独立访客数。 底层实现HyperLogLog使用特定的哈希函数和概率算法估计基数不直接存储元素而是维护一个内部状态来近似计数。
Geospatial Indexes地理位置索引
功能Redis提供了对地理位置数据的支持可以存储经纬度坐标并进行距离查询、范围查询如“附近的人”功能、地理围栏如“在某区域内的人”等操作。
应用案例“附近的人”功能
在社交应用中用户可以查看当前位置附近的其他在线用户。为每个用户存储其经纬度坐标使用GEOADD命令将用户位置添加到地理位置索引中。当查询时使用GEORADIUS或GEORADIUSBYMEMBER命令查找指定半径内的其他用户。 底层实现使用有序集合Sorted Set存储地理位置数据成员为地理位置的标识符分值为经过特定公式转换后的经纬度坐标以此实现空间索引。
Streams流
功能Redis Streams是一种用于存储和处理时间序列数据的数据结构特别适用于构建消息队列、活动日志、审计跟踪等应用场景。它支持多消费者消费同一数据流的不同部分并具备消息持久化、消息ID生成、消息分片Consumer Group等功能。
应用案例订单事件日志
在电商系统中使用Redis Stream记录订单相关的事件如订单创建、支付成功、发货等。每个事件作为一个消息包含事件类型、发生时间、订单ID等信息。消费者如后台任务、实时分析服务通过XREAD或XREADGROUP命令订阅并处理这些事件。 底层实现Stream数据结构在内部以键值对的形式存储键为Stream的名字值为一个特殊的字典结构包含多个消息列表每个消息列表代表一个分片以及相关元数据。 如果大家需要视频版本的讲解欢迎关注我的B站