redis 中 set 和 hset的区别和使用场景

本文探讨了Redis中Set与HSet的使用场景及区别。Set适合存储非结构化大文本,而HSet以hash形式存储结构化数据,节省内存但CPU消耗较大。HSet适用于多属性用户数据,便于单个属性更新。

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

在向redis 中存数据时,到底什么时候用  hset 相比于 set 存数据时又有什么不一样?

set  就是普通的已key-value 方式存储数据,可以设置过期时间。时间复杂度为 O(1),没多执行一个 set 在redis 中就会多一个 key ,

hset 则是以hash 散列表的形式存储。超时时间只能设置在 大 key 上,单个 filed 则不可以设置超时 时间复杂度我百度了很多文章都说是 O(1) 但是我下面给出的参考文章说时间上的时间复杂度其实是 O(N) N 值是单个hash 上的 filed 个数,所以 hash 上单个不适合存储大量的 filed 并且如果 filed 多了比较消耗cpu,但同时以 散列表存储则比较节省内存。

 

所以在实际的使用过程中应该使用 set 存储单个大文本非结构化数据 hset 则存储结构化数据,一个 hash 存储一条数据,一个 filed 则存储 一条数据中的一个属性,value 则是属性对应的值。

例如 数据库中有一张表 user 包含  id,name,age,sex 4个属性,并且有400w条数据,

      id,name,age,sex

1、1,张三,16,1

2、2,李四,22,1

3、3,王五,28,0

4、4,赵六,32,1

...

 

如果要整表缓存到 redis 中则使用 hash ,一条数据一个hash 一个hash 里则包含4个filed。

hset user_1 id 1 name 张三 age 16 sex 1

hset user_2 id 2 name 李四 age 16 sex 1

...

这样存储,如果用户的某个属性值改变,还可以单个修改。

例如 吧张三的年龄改为30 则可以使用命令:  hset user_1 age 30 

在比如如果要缓存应用整个首页 html ,或则某个商品的详情介绍(一般来说商品的详情介绍是makdown语法的富文本信息,或 html 格式的富文本信息) 则使用 则可以使用  set

又或则 应用中的 某个热点数据,都可以使用 set 存储一大段数据。
 

 

### Redis 常用数据结构及其应用场景 #### 字符串(String) 字符串是最基本的数据类型,不仅键本身是字符串形式,其他复杂数据结构也建立在其之上。这种类型的值可以容纳多种形式的内容,比如简单字符串、JSON 或 XML 这样的复杂字符串、数值以及二进制对象,不过单个值大小被限制在512MB以内[^4]。 对于计数需求而言,`INCRBY`等命令提供了原子性的增量操作功能,使得Redis成为理想的计数器解决方案之一。通过组合使用`INCR``EXPIRE`指令能够轻松实现带有时效性的计数逻辑,例如记录某段时间内的访问次数[^3]。 ```python # Python伪代码展示如何利用Redis作为计数器 import redis r = redis.Redis(host='localhost', port=6379, db=0) user_id = "user:1" r.incr(user_id) # 对指定用户的计数加一 r.expire(user_id, 60) # 设置该计数在一分钟后自动清除 ``` #### 列表(List) 列表允许存储一系列按顺序排列的元素,并支持两端高效插入/删除操作。适用于诸如消息队列这样的场景,其中生产者可以在一侧添加项目而消费者则从另一侧移除处理过的条目[^2]。 ```bash LPUSH mylist "item1" # 向左端压入新项 RPUSH mylist "item2" # 向右端追加新项 LPOP mylist # 移除并返回左侧第一个元素 RPOP mylist # 移除并返回右侧最后一个元素 ``` #### 集合(Set) 集合用于保存不重复成员组成的无序集合体。当涉及到去重问题时非常有用;另外还可以执行交集、并集运算来找出共同点或合并多个源中的唯一项[^5]。 ```bash SADD setA "apple" # 添加到setA中 SADD setB "banana" # 添加到setB中 SUNION store setC setA setB # 计算两个集合的并集并将结果存入第三个集合 ``` #### 哈希(Hash) 哈希映射适合表示具有字段-值关系的对象模型。每个散列表都由若干个field-value对构成,非常适合模拟实体属性或是缓存关联型数据。 ```json HSET user:alice name Alice age 28 city Beijing // 创建了一个名为'user:alice' 的hash,包含了三个字段(name,age,city),对应相应的值(Alice,28,Beijing) ``` #### 有序集合(Sorted Set) 除了保持内部元素互异外,还额外维护着一个分数域以便按照一定规则排序输出。典型应用包括排行榜系统、优先级调度机制等等。 ```bash ZADD leaderboard 100 player1 # 给player1分配得分为100分加入leaderboard ZADD leaderboard 200 player2 # 给player2分配得分为200分加入leaderboard ZRANGE leaderboard 0 -1 WITHSCORES # 获取全部玩家排名连同他们的得分情况 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值