redis基本数据类型 hash类型

Redis Hash 是一种存储键值对的高效结构,适用于存储对象。它支持多种操作如添加、删除、获取字段,还能进行字段计数、获取所有字段和值等。Hash 结构可以压缩,节省内存。常见应用场景包括购物车(存储商品ID和数量)和存储对象。此外,还提供了HDEL、HEXISTS、HGET等操作以及增量迭代HSCAN功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、特点

        hash是一个string类型的field和value的映射表,特别适合用于存储对象。如果hash的属性值被删除完,那么hash的key也会被redis删除。hash结构是可以压缩的,相比较N多个字段都单独存储成string类型来说,会比较节省内存。

二、操作

 1)HDEL key field [field ...]        删除一个或多个哈希字段

summary: Delete one or more hash fields
since: 2.0.0

2)HEXISTS key field        确定一个哈希字段是否存在

summary: Determine if a hash field exists

since: 2.0.0

3)HGET key field        获取一个哈希字段的值

summary: Get the value of a hash field        
since: 2.0.0

4)HGETALL key        获取散列中的所有字段和值

summary: Get all the fields and values in a hash
since: 2.0.0

5)HINCRBY key field increment        将哈希字段的整数值增加给定的数字

summary: Increment the integer value of a hash field by the given number
since: 2.0.0

6)HINCRBYFLOAT key field increment        将哈希字段的浮点值增加给定的数量

summary: Increment the float value of a hash field by the given amount
since: 2.6.0

7)HKEYS key        获取一个散列中的所有字段

summary: Get all the fields in a hash

since: 2.0.0

8)HLEN key        获取一个散列中的字段数

summary: Get the number of fields in a hash
since: 2.0.0

9)HMGET key field [field ...]        获取所有给定哈希字段的值

summary: Get the values of all the given hash fields
since: 2.0.0

10)HMSET key field value [field value ...]        将多个哈希字段设置为多个值

summary: Set multiple hash fields to multiple values
since: 2.0.0

11)HRANDFIELD key [count [WITHVALUES]]        从散列中获取一个或多个随机字段

summary: Get one or multiple random fields from a hash
since: 6.2.0

12)HSCAN key cursor [MATCH pattern] [COUNT count]        递增迭代哈希字段和相关值

summary: Incrementally iterate hash fields and associated values
since: 2.8.0

13)HSET key field value [field value ...]        设置哈希字段的字符串值

summary: Set the string value of a hash field
since: 2.0.0

14)HSETNX key field value        仅当一个哈希字段不存在时,设置该字段的值    

summary: Set the value of a hash field, only if the field does not exist
since: 2.0.0

15)HSTRLEN key field        获取哈希字段值的长度

summary: Get the length of the value of a hash field
since: 3.2.0

16)HVALS key        获取哈希中的所有值

summary: Get all the values in a hash

since: 2.0.0

三、应用场景

1、购物车  ==》id为key,商品id为field,商品数量为value

2、存储对象 key-value

### Redis基本数据类型的底层实现原理 Redis 是一种高性能的键值存储系统,其底层实现依赖于多种数据结构和编码方式,这些设计使得 Redis 在内存使用效率和数据操作性能之间取得了良好的平衡。以下是 Redis 基本数据类型的底层实现详解: #### 1. **String 类型** String 是 Redis 最基础的数据类型,其实现基于两种编码方式:`int` 和 `embstr`/`raw`。 - 当字符串值可以表示为整数时,Redis 使用 `int` 编码来存储该值[^3]。 - 对于较小的字符串(通常小于 44 字节),Redis 使用 `embstr` 编码,这是一种优化后的编码方式,将字符串对象和值合并为一个连续的内存块,减少了内存分配次数[^2]。 - 对于较大的字符串或动态变化的字符串,Redis 使用 `raw` 编码,允许字符串值动态扩展。 ```c // 示例:Redis 中 String 的实现 struct redisObject { unsigned type:4; // 数据类型标识 unsigned encoding:4; // 编码方式 void *ptr; // 指向实际数据的指针 }; ``` #### 2. **List 类型** List 类型Redis 中通过双端链表(`linked list`)或压缩列表(`ziplist`)实现。 - 当列表元素较少且每个元素较小时,Redis 使用 `ziplist` 编码以节省内存。 - 当列表元素较多或元素较大时,Redis 转而使用 `linkedlist` 编码,其中每个节点包含一个指向下一个节点的指针[^3]。 ```python # 示例:操作 Redis List 类型 db.ListLeftPush("mylist", "world") # 插入到列表左侧 db.ListRightPush("mylist", "!") # 插入到列表右侧 ``` #### 3. **Hash 类型** Hash 类型用于存储键值对集合,其底层实现基于哈希表(`hashtable`)或压缩列表(`ziplist`)。 - 当 Hash 中的字段和值较少时,Redis 使用 `ziplist` 编码以减少内存开销[^2]。 - 当字段和值增多时,Redis 切换到 `hashtable` 编码,提供更高效的查找和插入性能[^3]。 #### 4. **Set 类型** Set 类型用于存储无序且唯一的元素集合,其底层实现基于整数集合(`intset`)或哈希表(`hashtable`)。 - 如果 Set 中的所有元素都是整数且数量较少,Redis 使用 `intset` 编码,这是一种紧凑的整数集合实现[^2]。 - 如果 Set 包含非整数元素或元素数量较多,Redis 使用 `hashtable` 编码[^3]。 #### 5. **Sorted Set 类型** Sorted Set 是一种有序集合,其底层实现基于跳跃表(`skiplist`)和字典(`dict`)。 - 跳跃表用于按分值排序的快速范围查询。 - 字典用于快速查找特定成员的分值[^2]。 ```c // 示例:Redis 中 Sorted Set 的实现 typedef struct zset { dict *dict; // 用于快速查找成员 zskiplist *zsl; // 用于按分值排序的跳跃表 } zset; ``` ### 总结 Redis基本数据类型通过灵活选择不同的编码方式,在内存占用和性能之间实现了良好的权衡。理解这些底层实现有助于开发者更好地优化 Redis 的使用场景[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值