redis(5):数据结构-Hash散列类型

一、介绍

在这里插入图片描述
哈希等价于Java语言的HashMap或者是Python语言的dict,在实现结构上它使用二维结构,第一维是数组,第二维是链表,hash的内容key和value存放在链表中,数组里存放的是链表的头指针。通过key查找元素时,先计算key的hashcode,然后用hashcode对数组的长度进行取模定位到链表的表头,再对链表进行遍历获取到相应的value值,链表的作用就是用来将产生了「hash碰撞」的元素串起来。Java语言开发者会感到非常熟悉,因为这样的结构和HashMap是没有区别的。哈希的第一维数组的长度也是2^n。
在这里插入图片描述


二、命令

1.赋值与取值

hset key field value
hget key field
hmset key field value[field value ...]
hmget key field[field ...]
hgetall key

在这里插入图片描述

HSET 命令的方便之处在于不区分插入和更新操作(相当于upsert),这意味着修改数据时不用事先判断 字段是否存在来决定要执行的是插入操作(update)还是更新操作(insert)。当执行的是插 入操作时(即之前字段不存在)HSET命令会返回1,当执行的是更新操作时(即之前字段已 经存在)HSET命令会返回0。更进一步,当键本身不存在时,HSET命令还会自动建立它。

提示 在Redis中每个键都属于一个明确的数据类型,如通过 HSET命令建立的键是散列类 型,通过SET命令建立的键是字符串类型等等。使用一种数据类型的命令操作另一种数据类 型的键会提示错误:“ERR Operation against a key holding the wrong kind of value”

当需要同时设置多个字段的值时,可以使用HMSET命令。例如,下面两条语句
HSET key field1 value1
HSET key field2 value2
可以用HMSET命令改写成 HMSET key field1 value1 field2 value2
在这里插入图片描述

2.判断字段是否存在 HEXISTS key field

如果存在则返回1,否则返回0(如果键不存 在也会返回0)。
在这里插入图片描述

3.当字段不存在时赋值 HSETNX key field value

与HSET命令类似,区别在于如果字段已经存在,HSETNX命令将不 执行任何操作

4.增加数字 HINCRBY key field increment

字符串类型的命令INCRBY,HINCRBY命令与之类似,可以使字段值增加指定的整数。散列类型没有 HINCR 命令,但是可以通过 HINCRBY key field 1来实现。
在这里插入图片描述

5.删除字段 HDEL key field [field …]

令可以删除一个或多个字段,返回值是被删除的字段个数:
在这里插入图片描述


三、实践

1.存储文章数据

前面的string类型可以存储文字数据,但是无法对单个字段的原子读写操作(例如想更改文字的标题,必须将整个string拿出来,然后找到标题,然后修改再存储),所以可以借用hash结构来存储文章;

在这里插入图片描述
使用hgetall获取该对象所有字段,hset直接实现插入或更新,hdel删除某个键,

2.存储文章缩略名

如果专利名称不能重复,那么可以将专利名进行一定规则的缩写,然后 HSETNX或HEXISTS判断是否已经存在,后面进行业务逻辑处理;


四、命令拾遗

1.只获取字段名或字段值

HKEYS key
HVALS key
有时仅仅需要获取键中所有字段的名字而不需要字段值,那么可以使用HKEYS命令,就 像这样:

redis> HKEYS car 
1) "name" 
2) "model" 

HVALS命令与HKEYS命令相对应,HVALS命令用来获得键中所有字段值,例如:

redis> HVALS car
1) "BMW" 
2) "C200" 

2.获得字段数量 HLEN key

例如:
redis> HLEN car (integer) 2

相关推荐
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页