redis学习之Redis 哈希

来源:互联网 发布:java销售 编辑:程序博客网 时间:2024/06/07 03:37

Redis Hset 命令 HSET KEY_NAME FIELD VALUE

Redis Hset 命令用于为哈希表中的字段赋值 。

如果哈希表不存在,一个新的哈希表被创建并进行 HSET 操作。

如果字段已经存在于哈希表中,旧值将被覆盖。

redis
127.0.0.1:6379> HSET myHash field1 'cg'
(integer) 1
127.0.0.1:6379> keys *
1) "myHash"
2) "db"
3) "myphone"
127.0.0.1:6379> get myHash
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> HGET myHash field1
"cg"
127.0.0.1:6379> HSET myHash name 'cg'
(integer) 1
127.0.0.1:6379> keys *
1) "myHash"
2) "db"
3) "myphone"
127.0.0.1:6379> HGET myHash name
"cg"
127.0.0.1:6379> HSET myHash name 'ggh'
(integer) 0
127.0.0.1:6379> HGET myHash name
"ggh"
redis

Redis Hmset 命令 HMSET KEY_NAME FIELD1 VALUE1 …FIELDN VALUEN

Redis Hmset 命令用于同时将多个 field-value (字段-值)对设置到哈希表中。

此命令会覆盖哈希表中已存在的字段。

如果哈希表不存在,会创建一个空哈希表,并执行 HMSET 操作。

redis
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> HMSET myHash field1 'cg' field2 23
OK
127.0.0.1:6379> keys *
1) "myHash"
127.0.0.1:6379> HGET myHash field1
"cg"
127.0.0.1:6379> HGET myHash field2
"23"
127.0.0.1:6379> HMSET myHash field1 'cg2' filed3 333
OK
127.0.0.1:6379> HGET field2
(error) ERR wrong number of arguments for 'hget' command
127.0.0.1:6379> HGET myHash field2
"23"
127.0.0.1:6379> HGET myHash field1
"cg2"
redis

HMSET中若存在某个key,这个key的值会被覆盖。

Redis Hsetnx 命令 HSETNX KEY_NAME FIELD VALUE

Redis Hsetnx 命令用于为哈希表中不存在的的字段赋值 。

如果哈希表不存在,一个新的哈希表被创建并进行 HSET 操作。

如果字段已经存在于哈希表中,操作无效。

redis
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> HSETNX myHash name 'cg'
(integer) 1
127.0.0.1:6379> HGET myHash name
"cg"
127.0.0.1:6379> HSETNX myHash name 'ggh'
(integer) 0
127.0.0.1:6379> HGET myHash name
"cg
redis

Redis Hvals 命令 HVALS KEY_NAME

Redis Hvals 命令返回哈希表所有字段的值。

redis
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> HMSET me name 'cg' age '12' height 170
OK
127.0.0.1:6379> HVALS me
1) "cg"
2) "12"
3) "170"
redis

redis
127.0.0.1:6379> exists cg
(integer) 0
127.0.0.1:6379> HVALS cg
(empty list or set)
redis

Redis Hdel 命令 HDEL KEY_NAME FIELD1.. FIELDN

Redis Hdel 命令用于删除哈希表 key 中的一个或多个指定字段,不存在的字段将被忽略。

redis
127.0.0.1:6379> keys *
1) "me"
127.0.0.1:6379> hvals me
1) "cg"
2) "12"
3) "170"
127.0.0.1:6379> hdel me name
(integer) 1
127.0.0.1:6379> hvals me
1) "12"
2) "170"
127.0.0.1:6379> hdel me cg2 cg3
(integer) 0
127.0.0.1:6379> hvals
(error) ERR wrong number of arguments for 'hvals' command
127.0.0.1:6379> hvals me
1) "12"
2) "170"
redis

Redis Hexists 命令 HEXISTS KEY_NAME FIELD_NAME

Redis Hexists 命令用于查看哈希表的指定字段是否存在。

redis
127.0.0.1:6379> hvals me
1) "12"
2) "170"
127.0.0.1:6379> hexists me age
(integer) 1
127.0.0.1:6379> hexists me name
(integer) 0
127.0.0.1:6379> hexists cg2 34c
(integer) 0
redis

key和fileName指定的fileName不满足时,返回0。

Redis Hget 命令 HGET KEY_NAME FIELD_NAME

Redis Hget 命令用于返回哈希表中指定字段的值。

redis
127.0.0.1:6379> hvals me
1) "12"
2) "170"
127.0.0.1:6379> hget me name
(nil)
127.0.0.1:6379> hget me age
"12"
127.0.0.1:6379> hget me2 name
(nil)
redis

Redis Hgetall 命令 HGETALL KEY_NAME

Redis Hgetall 命令用于返回哈希表中,所有的字段和值。

在返回值里,紧跟每个字段名(field name)之后是字段的值(value),所以返回值的长度是哈希表大小的两倍。

redis
127.0.0.1:6379> hgetall me
1) "age"
2) "12"
3) "height"
4) "170"
127.0.0.1:6379> hgetall me2
(empty list or set)
redis

Redis Hincrby 命令 HINCRBY KEY_NAME FIELD_NAME INCR_BY_NUMBER

Redis Hincrby 命令用于为哈希表中的字段值加上指定增量值。

增量也可以为负数,相当于对指定字段进行减法操作。

如果哈希表的 key 不存在,一个新的哈希表被创建并执行 HINCRBY 命令。

如果指定的字段不存在,那么在执行命令前,字段的值被初始化为 0 。

对一个储存字符串值的字段执行 HINCRBY 命令将造成一个错误。

本操作的值被限制在 64 位(bit)有符号数字表示之内。

redis
127.0.0.1:6379> hset me name 'cg'
(integer) 1
127.0.0.1:6379> HGETALL me
1) "age"
2) "12"
3) "height"
4) "170"
5) "name"
6) "cg"
127.0.0.1:6379> HINCRBY me age 20
(integer) 32
127.0.0.1:6379> HINCRBY ME age -10
(integer) -10
127.0.0.1:6379> keys *
1) "me"
2) "ME"
127.0.0.1:6379> HINCRBY me age -10
(integer) 22
127.0.0.1:6379> hgetall me
1) "age"
2) "22"
3) "height"
4) "170"
5) "name"
6) "cg"
127.0.0.1:6379> HINCRBY me weight 150
(integer) 150
127.0.0.1:6379> hgetall me
1) "age"
2) "22"
3) "height"
4) "170"
5) "name"
6) "cg"
7) "weight"
8) "150"
127.0.0.1:6379> hincrby me name 30
(error) ERR hash value is not an integer
redis

HINCRBY不存在的key时,会新建这个key;
HINCRBY非数字时,会返回错误。

Redis Hincrbyfloat 命令 HINCRBYFLOAT KEY_NAME FIELD_NAME INCR_BY_NUMBER

Redis Hincrbyfloat 命令用于为哈希表中的字段值加上指定浮点数增量值。

如果指定的字段不存在,那么在执行命令前,字段的值被初始化为 0 。

redis
127.0.0.1:6379> HGETALL me
1) "age"
2) "50.6"
3) "height"
4) "170"
5) "name"
6) "cg"
7) "weight"
8) "19200"
127.0.0.1:6379> HINCRBYFLOAT me age 0.10
"50.7"
127.0.0.1:6379> hset me age 50.60
(integer) 0
127.0.0.1:6379> hget me age
"50.60"
127.0.0.1:6379> HINCRBYFLOAT me age 0.1
"50.7"
127.0.0.1:6379> HINCRBYFLOAT me age2 0.1
"0.1"
127.0.0.1:6379> hget me age2
"0.1"
redis

浮点数多余的0会被去掉。

HSCAN key cursor [MATCH pattern] [COUNT count]

redis
mset key1 'cg1' key2 'cg2' key3 'cg3' key4 'cg4' key5 'cg5' key6 'cg6'
OK
127.0.0.1:6379> keys *
1) "key3"
2) "key6"
3) "key1"
4) "key5"
5) "key2"
6) "key4"
127.0.0.1:6379> scan 0 match k* COUNT 3
1) "1"
2) 1) "key6"
2) "key1"
3) "key2"
redis

redis
127.0.0.1:6379> hmset me name 'cg' age 21 height 170 weight 150 city 'Guangzhou'
OK
127.0.0.1:6379> hgetall me
1) "name"
2) "cg"
3) "age"
4) "21"
5) "height"
6) "170"
7) "weight"
8) "150"
9) "city"
10) "Guangzhou"
127.0.0.1:6379> hscan me 0
1) "0"
2) 1) "name"
2) "cg"
3) "age"
4) "21"
5) "height"
6) "170"
7) "weight"
8) "150"
9) "city"
10) "Guangzhou"
127.0.0.1:6379> hscan me 0 match d
1) "0"
2) (empty list or set)
127.0.0.1:6379> hscan me 0 match \d
1) "0"
2) (empty list or set)
127.0.0.1:6379> hscan me 0 match n
1) "0"
2) (empty list or set)
127.0.0.1:6379> hscan me 0 match n*
1) "0"
2) 1) "name"
2) "cg"
redis

redis
127.0.0.1:6379> hscan me 0 match *e
1) "0"
2) 1) "name"
2) "cg"
3) "age"
4) "21"
redis

redis
127.0.0.1:6379> hscan me 0 match *e count 0
1) "0"
2) 1) "name"
2) "cg"
3) "age"
4) "21"
redis

出现很多

redis
(error) ERR syntax error
redis

redis
127.0.0.1:6379> hscan me 0 match *e count 1
1) "0"
2) 1) "name"
2) "cg"
3) "age"
4) "21"
redis

出现很多

redis
1) "0"
2) 1) "name"
2) "cg"
3) "age"
4) "21"
redis

redis
127.0.0.1:6379> scan 0
1) "0"
2) 1) "key1"
2) "key2"
3) "key3"
4) "me"
5) "key4"
127.0.0.1:6379> scan 0 count 2
1) "1"
2) 1) "key1"
2) "key2"
127.0.0.1:6379> scan 1 count 2
1) "3"
2) 1) "key3"
2) "me"
127.0.0.1:6379> scan 3 count 2
1) "0"
2) 1) "key4"
127.0.0.1:6379> scan 0 count 1
1) "6"
2) 1) "key1"
127.0.0.1:6379> scan 6 1
(error) ERR syntax error
127.0.0.1:6379> scan 6 count 1
1) "1"
2) 1) "key2"
127.0.0.1:6379> scan 1 count 1
1) "5"
2) 1) "key3"
127.0.0.1:6379> scan 5 count 1
1) "3"
2) 1) "me"
127.0.0.1:6379> scan 3 count 1
1) "0"
2) 1) "key4"
redis

scan、sscan、hscan、zscan,用法基本相同,参看官方文档

http://redis.io/commands/scan

scan以0为cursor时,表明遍历开始,scan执行结果的第一项为0时,表明遍历结束。
注意,scan每次遍历,有可能返回空数组,此时并不能认为已经遍历了一次,识别
遍历是否结束的依据,应该是scan执行结果的第一项是否为0。

count的默认值是10。

cursor执行结果的第一项,是第二次执行scan的cursor值。这个值,并不是上次遍历
到的那个元素在SET或HASH或其他结构中的位置(此处有疑问,浪费了很多时间)。要
想人工计算下次遍历获取到的结果中第二项即数组的值,可以这么做:以上次scan执行
结果中的第二项的最后一个元素为起点,数到第count个(这是本次scan执行结果的第二项)。

举例来说,

redis
127.0.0.1:6379> scan 0
1) "0"
2) 1) "key1"
2) "key2"
3) "key3"
4) "me"
5) "key4"
127.0.0.1:6379> scan 0 count 2
1) "1"
2) 1) "key1"
2) "key2"
127.0.0.1:6379> scan 1 count 2
1) "3"
2) 1) "key3"
2) "me"
127.0.0.1:6379> scan 0 count 3
1) "5"
2) 1) "key1"
2) "key2"
3) "key3"
127.0.0.1:6379> scan 5 count 2
1) "0"
2) 1) "me"
2) "key4"
redis

scan 0 count 2执行之后,下次遍历 scan 1 count 2,运算过程是这样的:
从key2开始计算(不包括它),数两个元素,即key3,me。
这样就得到了scan 1 count 2运行结果的第二部分,第一部分是如何计算的,暂时不清楚,我猜想:
它是本次cursor加count。

0 0
原创粉丝点击