作者晚上偷懒没去图书馆,可能学的不多,明天多学一点叭!
图中左边是key,右边是value,其类型为hash。这里老师讲的很乱,没有任何参考性,作者自学:
Redis 中的 hash 是一种数据结构,用于存储键值对(key-value pairs)。在许多编程语言中,这种数据结构通常被称为“字典”、“哈希图”或“映射”。在 Redis 的语境中,当我们说到 hash,我们是指它存储的是一组字段(field)和值(value)的对应关系。
这里,先澄清几个概念:
- Key:在 Redis 中,每个存储的数据结构(无论是字符串、列表、集合还是哈希)都有一个独立的 key。
- Hash:这是指定 key 下的数据结构。一旦你确定了一个 key 为 hash 类型,那么你可以在这个 hash 下设置多个字段-值对。
- Field:这是 hash 数据结构中的一个子键。每个 field 都有一个与之相关联的值。
- Value:这是与 hash 中的特定 field 关联的值。
一个 Redis hash 可以被视为一个“内部字典”,其中 key 是 hash 的名称,每个 hash 可以包含多个字段和值对。
例如,假设你想在 Redis 中存储一个用户的信息,其中用户名为 "user123",该用户有名字、年龄和邮箱等属性。你可以使用 Redis 的 hash 数据结构如下:
HSET user123 "name" "John Doe"
HSET user123 "age" "30"
HSET user123 "email" "johndoe@example.com"
在上面的例子中:
user123
是 Redis 的 key,对应的数据结构是一个 hash。name
,age
,email
是 hash 中的 fields。John Doe
,30
,johndoe@example.com
是与这些 fields 关联的 values。
使用 HGET
命令,你可以检索这些值,例如:HGET user123 name
会返回 John Doe
。
因此,可以说 Redis 中的 hash 是 value 的一种类型,用于存储多个字段和值对。这样的结构允许你在一个 key 下存储多个相关的信息,而无需为每个信息创建新的 key。这非常适用于组织和管理相关数据,例如用户的属性或对象的属性。
Redis 的 hash 数据结构非常适合模拟类似Java 对象的结构。将一个 Java 对象存储在 Redis 中时,可以使用以下策略:
-
对象 ID 作为 key:如果你有一个
User
对象,那么你可以使用该用户的唯一 ID(如 userID)作为 Redis 中的 key。 -
对象的属性作为 field:例如,
User
对象可能有name
、email
、password
等属性,这些属性都可以作为 Redis hash 中的 field。 -
对象的属性值作为 value:对于上面提到的
name
、email
等属性,其相应的值可以存储为 Redis hash 中的 value。
这种方式在 Redis 中存储对象有以下好处:
- 结构清晰:使用 Redis hash 存储对象使得数据的组织更加清晰和直观。
- 高效的局部更新:如果只需要更新对象的某个属性,你可以直接定位到该 hash 的特定 field 进行更新,而不是替换整个对象。
- 节省空间:相比于为对象的每个属性创建单独的 key,使用 hash 可以更有效地利用存储空间。
但要注意,Redis 是一个键值存储系统,所以它不提供像关系数据库中的复杂查询功能。因此,在选择如何存储数据时,你应考虑到你的查询和访问模式。
ziplist压缩列表:内存中一段连续的空间。
这个哈希表就是数据结构中的哈希表,中心思想就是长度等于个数,然后取模运算,重复的就跳,跳的方式有很多,123跳或者1、-1、2这样跳,为的就是减少空间浪费。
Redis采用链表地址法!哈希函数解决字符串问题!
redis,启动!
老师讲的糊里糊涂的,状态不好。
HSETNX
是 Redis hash 数据结构中的一个命令。它的名字是 "Hash SET if Not eXists" 的缩写,意思是仅在指定的 field 不存在时,该句才会发挥作用设置该 field 的值。但是if Not eXists都只能带一个参数。
hdel是删除某个key的某个、某些字段,而del是直接删除某个key。注意:当某个key没有hash键值对的时候,这个key的整个存储结构都会丢失。