> **Redis-常用类型操作命令2(Hash/string)**
[TOC]
## 说明 ##
**记录以下Redis常用类型的操作命令。**
----------
## 哈希介绍 ##
Redis 哈希(Hash)
Redis hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。
Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)。
## Hash ##
<h5>HSET(增加键值)</h5>
> HSETNX:当且仅当域 field 尚未存在于哈希表的情况下, 将它的值设置为 value 。
> HMSET:同时将多个 field-value (域-值)对设置到哈希表 key 中。
HSET hash field value 将哈希表 hash 中域 field 的值设置为 value 。
将哈希表 hash 中域 field 的值设置为 value 。
如果给定的哈希表并不存在, 那么一个新的哈希表将被创建并执行 HSET 操作。
如果域 field 已经存在于哈希表中, 那么它的旧值将被新值 value 覆盖。
----------
127.0.0.1:6379> hset user1 name zhangsan
(integer) 1
127.0.0.1:6379> hset user1 age 19
(integer) 1
127.0.0.1:6379> hset user1 sex boy
(integer) 1
127.0.0.1:6379> hgetall user1
1) "name"
2) "zhangsan"
3) "age"
4) "19"
5) "sex"
6) "boy"
<h5>HGET(得到键值)</h5>
> HGETAL:返回哈希表 key 中,所有的域和值。
> HMGET:返回哈希表 key 中,一个或多个给定域的值。
返回哈希表中给定域的值。
HGET 命令在默认情况下返回给定域的值。
如果给定域不存在于哈希表中, 又或者给定的哈希表并不存在, 那么命令返回 nil 。
----------
127.0.0.1:6379> hgetall user1
1) "name"
2) "zhangsan"
3) "age"
4) "19"
5) "sex"
6) "boy"
127.0.0.1:6379> hget user name
(nil)
127.0.0.1:6379> hget user1 name
"zhangsan"
127.0.0.1:6379> hgetall user
(empty list or set)
127.0.0.1:6379>
<h5>HEXISTS(检验键是否存在)</h5>
HEXISTS hash field检查给定域 field 是否存在于哈希表 hash 当中。
返回值 HEXISTS 命令在给定域存在时返回 1 , 在给定域不存在时返回 0 。
----------
127.0.0.1:6379> hexists user1 name
(integer) 1
127.0.0.1:6379> hexists user1 phone
(integer) 0
<h5>HDEL(删除键值)</h5>
HDEL key field [field …] 删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略。
在Redis2.4以下的版本里, HDEL 每次只能删除单个域,如果你需要在一个原子时间内删除多个域,请将命令包含在 MULTI / EXEC 块内。
返回值:被成功移除的域的数量,不包括被忽略的域。
----------
127.0.0.1:6379> hgetall user1
1) "name"
2) "zhangsan"
3) "age"
4) "19"
5) "sex"
6) "boy"
127.0.0.1:6379> hdel user1 name
(integer) 1
<h5>HLEN(得到hash长度)</h5>
HLEN key:返回哈希表 key 中域的数量。
返回值:哈希表中域的数量。
当 key 不存在时,返回 0 。
----------
127.0.0.1:6379> hset user1 name zhangsan
(integer) 1
127.0.0.1:6379> hset user1 age 19
(integer) 1
127.0.0.1:6379> hset user1 sex girl
(integer) 1
127.0.0.1:6379> hgetall
(error) ERR wrong number of arguments for 'hgetall' command
127.0.0.1:6379> hgetall user1
1) "name"
2) "zhangsan"
3) "age"
4) "19"
5) "sex"
6) "girl"
127.0.0.1:6379> hlen user1
(integer) 3
127.0.0.1:6379>
<h5>HSTRLEN(返回指定键值的长度)</h5>
> 可用版本:>= 3.2.0
HSTRLEN key field 返回哈希表 key 中, 与给定域 field 相关联的值的字符串长度(string length)。
如果给定的键或者域不存在, 那么命令返回 0 。
返回值:一个整数。
----------
redis> HMSET myhash f1 "HelloWorld" f2 "99" f3 "-256"
OK
redis> HSTRLEN myhash f1
(integer) 10
redis> HSTRLEN myhash f2
(integer) 2
redis> HSTRLEN myhash f3
(integer) 4
<h5>HSTRLEN(为指定键增加值)</h5>
> HINCRBYFLOAT:为哈希表 key 中的域 field 加上浮点数增量 increment 。
为哈希表 key 中的域 field 的值加上增量 increment 。
增量也可以为负数,相当于对给定域进行减法操作。
如果 key 不存在,一个新的哈希表被创建并执行 HINCRBY 命令。
如果域 field 不存在,那么在执行命令前,域的值被初始化为 0 。
对一个储存字符串值的域 field 执行 HINCRBY 命令将造成一个错误。
----------
127.0.0.1:6379> hincrby user1 age 1
(integer) 22
127.0.0.1:6379> hincrby user1 age -1
(integer) 21
<h5>HKEYS(返回所有键)</h5>
HKEYS key:返回哈希表 key 中的所有域。
返回值:一个包含哈希表中所有域的表。
当 key 不存在时,返回一个空表。
----------
127.0.0.1:6379> hkeys user1
1) "name"
2) "age"
3) "sex"
127.0.0.1:6379> hkeys user2
(empty list or set)
<h5>HVALS(返回所有值)</h5>
HVALS key:返回哈希表 key 中所有域的值。
返回值:一个包含哈希表中所有值的表。
当 key 不存在时,返回一个空表。
----------
127.0.0.1:6379> hvals user2
(empty list or set)
127.0.0.1:6379> hvals user1
1) "zhangsan"
2) "21"
3) "girl"
##列表介绍##
Redis 列表(List)
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)。
##List##
<h5>LPUSH(增加元素)</h5>
> RPUSH: 将一个或多个值 value 插入到列表 key 的表尾(最右边)。
> RPUSHX:将值 value 插入到列表 key 的表尾,当且仅当 key 存在并且是一个列表。
LPUSH 将一个或多个值 value 插入到列表 key 的表头
如果有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到表头: 比如说,对空列表 mylist 执行命令 LPUSH mylist a b c ,列表的值将是 c b a ,这等同于原子性地执行 LPUSH mylist a 、 LPUSH mylist b 和 LPUSH mylist c 三个命令。
如果 key 不存在,一个空列表会被创建并执行 LPUSH 操作。
当 key 存在但不是列表类型时,返回一个错误。
返回值:执行 LPUSH 命令后,列表的长度。
----------
127.0.0.1:6379> lpush list 1
(integer) 1
127.0.0.1:6379> lpush list 2
(integer) 2
127.0.0.1:6379> rpush list 3
(integer) 3
127.0.0.1:6379> lrange list -0 -1
1) "2"
2) "1"
3) "3"
127.0.0.1:6379> lpush list 3
(integer) 4
127.0.0.1:6379> lrange list -0 -1
1) "3"
2) "2"
3) "1"
4) "3"
<h5>LPOP(移除元素)</h5>
> RPOP:移除并返回列表 key 的尾元素。
LPOP key:移除并返回列表 key 的头元素。
返回值:列表的头元素。 当 key 不存在时,返回 nil 。
----------
127.0.0.1:6379> lpop list
"3"
127.0.0.1:6379> lrange list -0 -1
1) "2"
2) "1"
3) "3"
<h5>RPOPLPUSH(左删除右增加)</h5>
RPOPLPUSH source destination 命令 RPOPLPUSH 在一个原子时间内,执行以下两个动作:
将列表 source 中的最后一个元素(尾元素)弹出,并返回给客户端。
将 source 弹出的元素插入到列表 destination ,作为 destination 列表的的头元素。
举个例子,你有两个列表 source 和 destination , source 列表有元素 a, b, c , destination 列表有元素 x, y, z ,执行 RPOPLPUSH source destination 之后, source 列表包含元素 a, b , destination 列表包含元素 c, x, y, z ,并且元素 c 会被返回给客户端。
如果 source 不存在,值 nil 被返回,并且不执行其他动作。
如果 source 和 destination 相同,则列表中的表尾元素被移动到表头,并返回该元素,可以把这种特殊情况视作列表的旋转(rotation)操作。
----------
127.0.0.1:6379> lrange list 0 -1
1) "2"
2) "1"
3) "3"
127.0.0.1:6379> keys *
1) "list"
2) "user1"
127.0.0.1:6379> RPOPLPUSH list newlist
"3"
127.0.0.1:6379> RPOPLPUSH list newlist
"1"
127.0.0.1:6379> RPOPLPUSH list newlist
"2"
127.0.0.1:6379> RPOPLPUSH list newlist
(nil)
127.0.0.1:6379> lrange newlist 0 -1
1) "2"
2) "1"
3) "3"
127.0.0.1:6379>
<h5>LREM(删除几个固定元素)</h5>
LREM key count value:根据参数 count 的值,移除列表中与参数 value 相等的元素。
count 的值可以是以下几种:
count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。
count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。
count = 0 : 移除表中所有与 value 相等的值。
----------
127.0.0.1:6379> lpush list zhangsan
(integer) 1
127.0.0.1:6379> lpush list lisi
(integer) 2
127.0.0.1:6379> lpush list wangwu
(integer) 3
127.0.0.1:6379> lpush list lisi
(integer) 4
127.0.0.1:6379> lpush list wangwu
(integer) 5
127.0.0.1:6379> lrange list 0 -1
1) "wangwu"
2) "lisi"
3) "wangwu"
4) "lisi"
5) "zhangsan"
127.0.0.1:6379> lrem list 1 lisi
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "wangwu"
2) "wangwu"
3) "lisi"
4) "zhangsan"
127.0.0.1:6379> lrem list 2 wangwu
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "lisi"
2) "zhangsan"
返回值
被移除元素的数量。 因为不存在的 key 被视作空表(empty list),所以当 key 不存在时, LREM 命令总是返回 0 。
<h5>LLEN(返回长度)</h5>
LLEN key 返回列表 key 的长度。
如果 key 不存在,则 key 被解释为一个空列表,返回 0 .
如果 key 不是列表类型,返回一个错误。
----------
127.0.0.1:6379> llen list
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "lisi"
<h5>LINDEX(返回指定下标元素)</h5>
LINDEX key index:返回列表 key 中,下标为 index 的元素。
下标(index)参数 start 和 stop 都以 0 为底,也就是说,以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。
你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
如果 key 不是列表类型,返回一个错误。
返回值:列表中下标为 index 的元素。 如果 index 参数的值不在列表的区间范围内(out of range),返回 nil 。
----------
127.0.0.1:6379> lrange list 0 -1
1) "lisi"
2) "zhangsan"
127.0.0.1:6379> lindex list 0
"lisi"
127.0.0.1:6379> lindex list 1
"zhangsan"
127.0.0.1:6379> lindex list 2
(nil)
<h5>LINSERT(插入元素)</h5>
LINSERT key BEFORE|AFTER pivot value
将值 value 插入到列表 key 当中,位于值 pivot 之前或之后。
当 pivot 不存在于列表 key 时,不执行任何操作。
当 key 不存在时, key 被视为空列表,不执行任何操作。
如果 key 不是列表类型,返回一个错误。
返回值:如果命令执行成功,返回插入操作完成之后,列表的长度。 如果没有找到 pivot ,返回 -1 。 如果 key 不存在或为空列表,返回 0 。
----------
127.0.0.1:6379> lrange list 0 -1
1) "lisi"
2) "zhangsan"
127.0.0.1:6379> lrange list 0 -1
1) "lisi"
2) "wangwu"
3) "zhangsan"
127.0.0.1:6379> linsert list before lisi zhaoliu
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "zhaoliu"
2) "lisi"
3) "wangwu"
4) "zhangsan"
<h5>LSET(更改下标元素)</h5>
LSET key index value 将列表 key 下标为 index 的元素的值设置为 value 。
当 index 参数超出范围,或对一个空列表( key 不存在)进行 LSET 时,返回一个错误。
----------
127.0.0.1:6379> lset list 0 zhangxiaoliu
OK
127.0.0.1:6379> lindex list 0
"zhangxiaoliu"
<h5>LRANGE(返回范围元素)</h5>
LRANGE key start stop:返回列表 key 中指定区间内的元素,区间以偏移量 start 和 stop 指定。
下标(index)参数 start 和 stop 都以 0 为底,也就是说,以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。
你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
注意LRANGE命令和编程语言区间函数的区别
假如你有一个包含一百个元素的列表,对该列表执行 LRANGE list 0 10 ,结果是一个包含11个元素的列表,这表明 stop 下标也在 LRANGE 命令的取值范围之内(闭区间),这和某些语言的区间函数可能不一致,比如Ruby的 Range.new 、 Array#slice 和Python的 range() 函数。
超出范围的下标
超出范围的下标值不会引起错误。
如果 start 下标比列表的最大下标 end ( LLEN list 减去 1 )还要大,那么 LRANGE 返回一个空列表。
如果 stop 下标比 end 下标还要大,Redis将 stop 的值设置为 end 。
返回值:一个列表,包含指定区间内的元素。
----------
127.0.0.1:6379> lrange list 0 1
1) "zhangxiaoliu"
2) "lisi"
127.0.0.1:6379> lrange list 0 4
1) "zhangxiaoliu"
2) "lisi"
3) "wangwu"
4) "zhangsan"
127.0.0.1:6379> lrange list 0 -1
1) "zhangxiaoliu"
2) "lisi"
3) "wangwu"
4) "zhangsan"
<h5>LTRIM(删除范围的的元素)</h5>
LTRIM key start stop:对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
举个例子,执行命令 LTRIM list 0 2 ,表示只保留列表 list 的前三个元素,其余元素全部删除。
下标(index)参数 start 和 stop 都以 0 为底,也就是说,以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。
你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
当 key 不是列表类型时,返回一个错误。
LTRIM 命令通常和 LPUSH key value [value …] 命令或 RPUSH key value [value …] 命令配合使用,举个例子:
LPUSH log newest_log
LTRIM log 0 99
这个例子模拟了一个日志程序,每次将最新日志 newest_log 放到 log 列表中,并且只保留最新的 100 项。注意当这样使用 LTRIM 命令时,时间复杂度是O(1),因为平均情况下,每次只有一个元素被移除。
返回值:命令执行成功时,返回 ok 。
----------
127.0.0.1:6379> ltrim list 1 2
OK
127.0.0.1:6379> lrange list 0 -1
1) "lisi"
2) "wangwu"
<h5>BLPOP</h5>
> 详解: http://redisdoc.com/list/blpop.html
BLPOP 是列表的阻塞式(blocking)弹出原语。
它是 LPOP key 命令的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被 BLPOP 命令阻塞,直到等待超时或发现可弹出元素为止。
## 结尾 ##
<p style="background-image: -webkit-linear-gradient(left, #3498db, #f47920 10%, #d71345 20%, #f7acbc 30%,#ffd400 40%, #3498db 50%, #f47920 60%, #d71345 70%, #f7acbc 80%, #ffd400 90%, #3498db);color: transparent;-webkit-text-fill-color: transparent;-webkit-background-clip: text;text-align:center;">
腹有诗书气自华,最是书香能致远。
</p>