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

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

在向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)、列表(List)、哈希(Hash)、集合(Set)、有序集合(Sorted Set)等,这些数据结构适用于不同的使用场景需求。 字符串是最基础的数据结构,可以用来存储简单的键值对,例如缓存网页内容或计数器。例如,可以使用 `SET` `GET` 命令来存储获取字符串值。 哈希(Hash)数据结构为电商社交平台提供了灵活、高效的存储方式,可以支持高并发、高性能的数据操作,是实现实时数据更新查询的理想选择。例如,可以使用 `HSET` `HGET` 命令来存储获取对象属性。 列表(List)是一个双向链表,可以用来实现消息队列或者最新的N个元素等功能。例如,可以使用 `LPUSH` `LRANGE` 命令来插入获取列表中的元素。 集合(Set)是一个无序的不重复元素集合,可以用来实现标签系统或者共同好友功能。例如,可以使用 `SADD` 命令来向集合中添加元素,并且集合支持交集、并集、差集等多种数学运算。 有序集合(Sorted Set)与集合类似,但是每个元素都关联了一个分数,用于排序。它可以用来实现排行榜或者优先级队列等功能。例如,可以使用 `ZADD` 命令来向有序集合中添加元素,并且可以按照分数范围来获取元素。 位图(Bitmap)数据结构是一种可以高效表示二进制状态的结构。位图将每个元素映射到一个位(bit),每个 bit 可以是 0 或 1。这种结构的最大优势是能够在非常紧凑的内存中表示大量的二进制状态信息,因此它非常适合用于处理大量状态值的场景。例如,可以使用 `SETBIT` `GETBIT` 命令来设置获取位图中的位。 HyperLogLog 是一种概率数据结构,用于估计唯一元素的数量。它可以非常节省内存地统计大量数据中的唯一元素数量。例如,可以使用 `PFADD` `PFCOUNT` 命令来添加元素估计唯一元素的数量。 流(Stream)是一个仅追加的日志类型,可以用来实现消息队列或者事件溯源等功能。例如,可以使用 `XADD` `XRANGE` 命令来添加获取流中的消息。 ```python # 示例代码:模拟Redis的简单命令处理函数 def process_command(client): # 解析客户端发送过来的命令 args = client.querybuf.split() # 根据不同的命令调用相应的处理函数 if args[0].lower() == "get": if len(args) != 2: client.reply("GET requires one argument") else: key = args[1] value = lookup_key_read(client.db, key) if value is None: client.reply(None) else: client.reply(value) # 假设的查找键函数 def lookup_key_read(db, key): return db.get(key) # 客户端回复函数 def add_reply(client, value): print(value) # 模拟客户端 class Client: def __init__(self, db, querybuf): self.db = db self.querybuf = querybuf def reply(self, value): add_reply(self, value) # 模拟数据库 db = {"key1": "value1"} client = Client(db, "GET key1") process_command(client) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值