目录
- 前言
- 保存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)
采取命令hkeys
和hvals
,都只能单独的获取对应的列信息和值信息,如果需要查看列和值一一对应的信息,可以采用如下语法命令:
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)
之前针对数字类型,自增采取incr
和 incrby
命令实现,自减操作采取decr
和decrby
命令实现。但是这个操作在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
达到自减
的目的。