目录

  • 前言
  • 保存Hash数据(hset)
  • 获取指定对象key中对应属性key的Hash数据(hget)
  • 不覆盖设置(hsetnx)
  • 批量设置多个属性(hmset)
  • 获取某个对象所有key对应的值(hmget)
  • 判断某个指定对象的某个属性是否存在(hexists)
  • 取得全部内容数量(hlen)
  • 删除指定key信息(hdel)
  • 取得所有key(hkeys)
  • 取得Hash中的所有内容(hvals)
  • 获取全部的key与value(hgetall)
  • Hash数据数字自增/自减(hincrby)


前言

之前博客中介绍了字符串类型数字类型的操作方式,但总体而言,保存的数据量依旧比较少,为了保存更大量的数据,可以采取Hash类型实现。

就好比java中以对象保存数据,Redis存储不可能将对象ToString存储。

class Member{
	private Integer id;
	private String username;
	private Integer age;
}

保存Hash数据(hset)

hset key field value
 hset 对象KEY 属性KEY 属性值V

例如:设置一个Hash类型,保存某个用户的编号、真实姓名、年龄。

127.0.0.1:6379> hset member-xiangjiao id 10001
 (integer) 1
 127.0.0.1:6379> hset member-xiangjiao username xiangjiao
 (integer) 1
 127.0.0.1:6379> hset member-xiangjiao age 24
 (integer) 1

如果存在设置相同key,不同value会发生什么?

127.0.0.1:6379> hset member-xiangjiao id 10005
 (integer) 0

获取指定对象key中对应属性key的Hash数据(hget)

hget key field
  • 获取已存在的数据信息

获取上述添加数据中属性为id的数据信息:

127.0.0.1:6379> hset member-xiangjiao id 10005
 (integer) 0
 127.0.0.1:6379> hget member-xiangjiao id
 “10005”

发现,采取hset命令操作,会覆盖原有数据!

  • 获取不存在的数据
127.0.0.1:6379> hget xiangjiao id
 (nil)

不覆盖设置(hsetnx)

覆盖设置,会造成某些重要信息发生变更,为了安全,部分数据不允许进行覆盖操作!

hsetnx key field value
  • 设置一个不存在的数据
127.0.0.1:6379> hsetnx member-a id 10
 (integer) 1
 127.0.0.1:6379> hget member-a id
 “10”
  • 设置一个存在的数据
127.0.0.1:6379> hsetnx member-a id 10000
 (integer) 0
 127.0.0.1:6379> hget member-a id
 “10”

批量设置多个属性(hmset)

单个设置每个对象中的不同属性列的值过于繁琐。

hmset 对象key 属性field 属性value [field value …]

设置 Member 类中,username为xiangjiao的相关数据:

hmset member-a id 10000 name xiangjiao pwd 123456 age 25
 127.0.0.1:6379> hget member-a age
 “25”
 127.0.0.1:6379> hget member-a id
 “10000”
 127.0.0.1:6379> hget member-a name
 “xiangjiao”

获取某个对象所有key对应的值(hmget)

如果想一次性获取某个对象key对应的某些key的数据值信息,可以采取下列语法实现:

hmget 对象key 属性field [field …]

如:获取上述 Member 对象中,id、name、age等数据值。

127.0.0.1:6379> hmget member-a id name age pwd
 1 ) “10000”
 2 ) “xiangjiao”
 3 ) “25”
 4 ) “123456”

有没有想过一个问题:
如果需要查询的属性在redis中不存在时,此时执行命令的结果是怎么样的?

127.0.0.1:6379> hmget member-a id name age pwd ss
 1 ) “10000”
 2 ) “xiangjiao”
 3 ) “25”
 4 ) “123456”
 5 ) (nil)

测试发现:当查询一个不存在的属性列值时,会返回(nil),如果对象key不存在(member-ss),此时返回值为(nil);

127.0.0.1:6379> hmget member-ss id name
 1 ) (nil)
 2 ) (nil)

判断某个指定对象的某个属性是否存在(hexists)

hexists 对象key 属性field

分别查看对象是否存在:

127.0.0.1:6379> keys *
 1 ) “b”
 2 ) “a”
 3 ) “member-a”
 127.0.0.1:6379> hexists member-a id
 (integer) 1
 127.0.0.1:6379> hexists member-a ss
 (integer) 0

测试发现:返回1表示这个指定对象的这个列是存在的;如果是0,表示这个列不存在。

取得全部内容数量(hlen)

hlen 对象key

如:获取指定保存对象的属性数量

127.0.0.1:6379> hlen member-a
 (integer) 4

如果是一个不存在的对象:

127.0.0.1:6379> hlen mmmm
 (integer) 0

删除指定key信息(hdel)

hdel 对象key 属性field [field …]

删除一个保存对象中的某些列和数据:

127.0.0.1:6379> hset member-a ss 123
 (integer) 1
 127.0.0.1:6379> hdel member-a ss aa
 (integer) 1

其中新增了ss这个列和其值,但是aa却是不存在的,执行hdel指令只会删除存在的那个列,并返回删除成功的列的个数值。

取得所有key(hkeys)

需要查看一个指定的对象中的属性时,由于使用hash类型,一般的操作无法查看,此时可以使用如下语法命令实现:

hkeys 对象key

如:查看指定某个类中的列信息:

127.0.0.1:6379> hkeys member-a
 1 ) “id”
 2 ) “name”
 3 ) “pwd”
 4 ) “age”

取得Hash中的所有内容(hvals)

上述命令获取的只是指定类中所有列的名称信息,如果需要查看列中的属性信息,可以使用如下语法实现:

hvals 对象key

如:查看指定类中的属性key的值信息

127.0.0.1:6379> hvals member-a
 1 ) “10000”
 2 ) “xiangjiao”
 3 ) “123456”
 4 ) “25”

获取全部的key与value(hgetall)

采取命令hkeyshvals,都只能单独的获取对应的列信息和值信息,如果需要查看列和值一一对应的信息,可以采用如下语法命令:

hgetall 对象key

获取指定对象中,列和值一一对应的信息:

127.0.0.1:6379> hgetall member-a
 1 ) “id”
 2 ) “10000”
 3 ) “name”
 4 ) “xiangjiao”
 5 ) “pwd”
 6 ) “123456”
 7 ) “age”
 8 ) “25”

采取的是key value key value ....的形式,将数据一一对应输出。

Hash数据数字自增/自减(hincrby)

之前针对数字类型,自增采取incrincrby命令实现,自减操作采取decrdecrby命令实现。但是这个操作在Hash类型中是否一样能使用呢?

127.0.0.1:6379> hset age-xiangjiao age 24
 (integer) 1
 127.0.0.1:6379> hget age-xiangjiao age
 “24”
 127.0.0.1:6379> incr age-xiangjiao
 (error) WRONGTYPE Operation against a key holding the wrong kind of value
 127.0.0.1:6379> incrby age-xiangjiao 4
 (error) WRONGTYPE Operation against a key holding the wrong kind of value
 127.0.0.1:6379> decr age-xiangjiao
 (error) WRONGTYPE Operation against a key holding the wrong kind of value
 127.0.0.1:6379> decrby age-xiangjiao 4
 (error) WRONGTYPE Operation against a key holding the wrong kind of value

发现使用自增和自减命令操作Hash数据类型,会直接出现报错!

细心的会发现,设置字符串类型使用set,设置hash类型使用的是hset,是否引申为此处使用类似语法呢?

尝试发现,针对Hash数据类型,仅有hincrby key field increment命令!

如何才能进行Hash数据类型的 增/减 操作?

127.0.0.1:6379> hincrby age-xiangjiao age 5
 (integer) 29
 127.0.0.1:6379> hincrby age-xiangjiao age -5
 (integer) 24

发现传递hincrby age-xiangjiao age 5可以实现数据自增5,采取hincrby age-xiangjiao age -5实现数据自增-5达到自减的目的。