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

一、介绍

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


二、命令

1.赋值与取值

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

redis(5):数据结构-Hash散列类型_第3张图片

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
redis(5):数据结构-Hash散列类型_第4张图片

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来实现。
redis(5):数据结构-Hash散列类型_第5张图片

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

令可以删除一个或多个字段,返回值是被删除的字段个数:
redis(5):数据结构-Hash散列类型_第6张图片


三、实践

1.存储文章数据

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

redis(5):数据结构-Hash散列类型_第7张图片
使用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

你可能感兴趣的:(#,redis,redis)