Redis 学习笔记四 命令二
Redis 哈希(Hash)
Redis hash是一个string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。
Redis 中每个 hsh 可以存储 232-1 键值对(40多亿)。
实例
redis 127.0.0.1:6379> HMSET w3ckey name "redis tutorial" description "redis basic commands for caching" likes 20 visitors 23000
OK
redis 127.0.0.1:6379> HGETALL w3ckey
1) "name"
2) "redis tutorial"
3) "description"
4) "redis basic commands for caching"
5) "likes"
6) "20"
7) "visitors"
8) "23000"
在以上实例中,我们设置了 redis 的一些描述信息 (name,description,likes,visitors)到哈希表 的 w3ckey 中
Redis Hdel 命令
Redis Hdel 命令用于删除哈希表 key 中的一个或者多个指定字段,不存在的字段将被忽略。
语法
redis Hdel 命令基本语法如下:
redis 127.0.0.1:6379> HDEL KEY_NAME FIELD1.. FIELDN
可用版本
>= 2.0.0
返回值
被成功删除字段的数量,不包括被忽略的字段。
实例
redis 127.0.0.1:6379> HSET myhash field1 "foo"
(integer) 1
redis 127.0.0.1:6379> HDEL myhash field1
(integer) 1
redis 127.0.0.1:6379> HDEL myhash field2
(integer) 0
Redis Hexists 命令
Redis Hexists 命令用于查看哈希表的指定字段是否存在。
语法
redis Hexists 命令基本语法如下:
redis 127.0.0.1:6379> HEXISTS KEY_NAME FIELD_NAME
可用版本
>= 2.0.0
返回值
如果哈希表有给定字段,返回 1 。 如果哈希表不含有给定字段,或key 不存在,返回 0 。
实例
redis 127.0.0.1:6379> HSET myhash field1 "foo"
(integer) 1
redis 127.0.0.1:6379> HEXISTS myhash field1
(integer) 1
redis 127.0.0.1:6379> HEXISTS myhash field2
(integer) 0
Redis Hget 命令
Redis Hget 命令用于返回哈希表中指定字段的值。
语法
redis Hget 命令基本语法如下:
redis 127.0.0.1:6379> HGET KEY_NAME FIELD_NAME
可用版本
>= 2.0.0
返回值
返回给定字段的值。如果给定的字段或key 不存在时,返回 nil。
实例
# 字段存在
redis> HSET site redis redis.com
(integer) 1
redis> HGET site redis
"redis.com"
# 字段不存在
redis> HGET site mysql
(nil)
Redis Hgetall 命令
Redis Hgetall 命令用于返回哈希表中,所有的字段和值。
在返回值,紧跟每个字段名(field name)之后是字段的值(value),所以返回值的长度是哈希表大小的两倍。
语法
redis Hgetall 命令基本语法如下:
redis 127.0.0.1:6379> HGETALL KEY_NAME
可用版本
>= 2.0.0
返回值
以列表形式返回哈希表的字段及字段值。 若 key 不存在,返回空列表。
实例
redis 127.0.0.1:6379> HSET myhash field1 "foo"
(integer) 1
redis 127.0.0.1:6379> HSET myhash field2 "bar"
(integer) 1
redis 127.0.0.1:6379> HGETALL myhash
1) "field1"
2) "Hello"
3) "field2"
4) "World"
Redis Hincrby 命令
Redis Hincrby 命令用于为哈希表中的字段值加上指定增量值。
增量也可以为负数,相当于对指定字段进行减法操作。
如果哈希表的 key 不存在,一个新的哈希表被创建并执行 HINCRBY 命令。
如果指定的字段不存在,那么在执行命令前,字段的值被初始化为 0 。
对一个储存字符串值的字段执行 HINCRBY 命令造成一个错误。
本操作的值被限制在 64位 (bit)有符号数字表示之内。
语法
redis Hincrby 命令基本语法如下:
redis 127.0.0.1:6379> HINCRBY KEY_NAME FIELD_NAME INCR_BY_NUMBER
可用版本
>= 2.0.0
返回值
执行 Hincrby 命令之后,哈希表中的字段的值。
实例
redis 127.0.0.1:6379> HSET myhash field1 20
(integer) 1
redis 127.0.0.1:6379> HINCRBY myhash field 1
(integer) 21
redis 127.0.0.1:6379> HINCRBY myhash field -1
(integer) 20
Redis Hincrbyfloat 命令
Redis Hincrbyfloat 命令用于为哈希表中的字段值加上指定浮点数增量值。
如果指定的字段不存在,那么在执行命令前,字段的值被初始化为 0.
语法
redis Hincrbyfloat 命令基本语法如下:
redis 127.0.0.1:6379> HINCRBYFLOAT KEY_NAME FIELD_NAME INCR_BY_NUMBER
可用版本
>= 2.6.0
返回值
执行 Hincrbyfloat 命令之后,哈希表中字段的值。
实例
redis 127.0.0.1:6379> HSET myhash field 20.50
(integer) 1
redis 127.0.0.1:6379> HINCRBYFLOAT mykey field 0.1
"20.60"
Redis Hkeys 命令
Redis Hkeys 命令用于获取哈希表中的所有字段名。
语法
redis Hkeys 命令基本语法如下:
redis 127.0.0.1:6379> HKEYS KEY_NAME FIELD_NAME INCR_BY_NUMBER
可用版本
>= 2.0.0
返回值
包含哈希表中所有字段的列表。当 key 不存在时,返回一个空列表。
实例
redis 127.0.0.1:6379> HSET myhash field1 "foo"
(integer) 1
redis 127.0.0.1:6379> HSET myhash field2 "bar"
(integer) 1
redis 127.0.0.1:6379> HKEYS myhash
1) "field1"
2) "field2"
Redis Hlen 命令
Redis Hlen 命令用于获取哈希表中字段的数量。
语法
redis Hlen 命令基本语法如下:
redis 127.0.0.1:6379> HLEN KEY_NAME
可用版本
>= 2.0.0
返回值
哈希表中字段的数量,当key 不存在时,返回 0 。
实例
redis 127.0.0.1:6379> HSET myhash field1 "foo"
(integer) 1
redis 127.0.0.1:6379> HSET myhash field2 "bar"
(integer) 1
redis 127.0.0.1:6379> HLEN myhash
(integer) 2
Redis Hmget 命令
Redis Hmget 命令用于返回哈希表中一个或多个给定字段的值。
如果指定字段不存在与哈希表,那么返回一个 nil
语法
redis Hmget 命令基本语法如下:
redis 127.0.0.1:6379> HMGET KEY_NAME FIELD1...FIELDN
可用版本
>= 2.0.0
返回值
一个包含多个给定字段关联值的表,表值的排列顺序和指定字段的请求顺序一样。
实例
redis 127.0.0.1:6379> HSET myhash field1 "foo"
(integer) 1
redis 127.0.0.1:6379> HSET myhash field2 "bar"
(integer) 1
redis 127.0.0.1:6379> HMGET myhash field1 field2 nofield
1) "foo"
2) "bar"
3) (nil)
Redis Hmset 命令
Redis Hmset 命令用于同时将多个 field-value (字段-值)设置到哈希表中
此命令会覆盖哈希表中已存在的字段。
如果哈希表不存在,会创建一个空哈希表,并执行 HMSET 操作。
语法
redis Hmset 命令基本语法如下:
redis 127.0.0.1:6379> HMSET KEY_NAME FIELD1 VALUE1 ...FIELDN VALUEN
可用版本
>= 2.0.0
返回值
如果命令执行成功,返回 OK
实例
redis 127.0.0.1:6379> HMSET myhash field1 "foo" field2 "bar"
OK
redis 127.0.0.1:6379> HGET myhash field1
"foo"
redis 127.0.0.1:6379> HGET myhash field2
"bar"
Reids Hset 命令
Redis Hset 命令用于为哈希表中的字段赋值。
如果哈希表不存在,一个新的哈希表被创建并进行 HSET 操作。
如果字段已经存在于哈希表中,旧值将被覆盖。
语法
redis Hset 命令基本语法如下:
redis 127.0.0.1:6379> HSET KEY_NAME FIELD VALUE
可用版本
>= 2.0.0
返回值
如果字段是哈希表中的一个新建字段,并且值设置成功,返回 1 。如果哈希表中字段仅在存在且旧值已被新值覆盖,返回 0 。
实例
redis 127.0.0.1:6379> HSET myhash field1 "foo"
OK
redis 127.0.0.1:6379> HGET myhash field1
"foo"
redis 127.0.0.1:6379> HSET website google "www.g.cn" # 设置一个新域
(integer) 1
redis 127.0.0.1:6379>HSET website google "www.google.com" # 覆盖一个旧域
(integer) 0
Redis Hsetnx 命令
Redis Hsetnx 命令用于为哈希表中不存在的字段赋值。
如果哈希表不存在,一个新的哈希表被创建并进行 HSET 操作。
如果字段已经在于哈希表中,操作无效。
如果 key 不存在,一个新哈希表被创建并执行 HSETNX 命令
语法
redis Hsetnx 命令基本语法如下:
redis 127.0.0.1:6379> HSETNX KEY_NAME FIELD VALUE
可用版本
>= 2.0.0
返回值
设置成功,返回 1 。如果给定字段已经存在且没有操作被执行,返回 0 。
实例
redis 127.0.0.1:6379> HSETNX myhash field1 "foo"
(integer) 1
redis 127.0.0.1:6379> HSETNX myhash field1 "bar"
(integer) 0
redis 127.0.0.1:6379> HGET myhash field1
"foo"
redis 127.0.0.1:6379> HSETNX nosql key-value-store redis
(integer) 1
redis 127.0.0.1:6379> HSETNX nosql key-value-store redis # 操作无效, key-value-store 已存在
(integer) 0
Redis Hvals 命令
Redis Hvals 命令返回哈希表所有字段的值。
语法
redis Hvals 命令基本语法如下:
redis 127.0.0.1:6379> HVALS KEY_NAME FIELD VALUE
可用版本
>= 2.0.0
返回值
一个包含哈希表中所有值的表。当key不存在时,返回一个空表
实例
redis 127.0.0.1:6379> HSET myhash field1 "foo"
(integer) 1
redis 127.0.0.1:6379> HSET myhash field2 "bar"
(integer) 1
redis 127.0.0.1:6379> HVALS myhash
1) "foo"
2) "bar"
# 空哈希表/不存在的key
redis 127.0.0.1:6379> EXISTS not_exists
(integer) 0
redis 127.0.0.1:6379> HVALS not_exists
(empty list or set)
Redis 列表(List)
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者配尾部(右边)
一个列表最多可以白喊232-1 个元素,每个列表超过 40亿
实例
redis 127.0.0.1:6379> LPUSH w3ckey redis
(integer) 1
redis 127.0.0.1:6379> LPUSH w3ckey mongodb
(integer) 2
redis 127.0.0.1:6379> LPUSH w3ckey mysql
(integer) 3
redis 127.0.0.1:6379> LRANGE w3ckey 0 10
1) "mysql"
2) "mongodb"
3) "redis"
以上实例中我们使用 LPUSH 将三个值插入了名为 w3ckey 的列表当中。
Redis Blpop 命令
Redis Blpop 命令移出并获取列表的第一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
语法
redis Blpop 命令基本格式如下:
redis 127.0.0.1:6379> BLPOP LIST1 LIST2 .. LISTN TIMEOUT
可用版本
>= 2.0.0
返回值
如果列表为空,返回一个nil。否则,返回一个含有两个元素的列表,第一个元素是被弹出元素所属的 key ,第二个元素是被弹出元素的值。
实例
redis 127.0.0.1:6379> BLPOP list1 100
在以上实例中,操作会被阻塞,如果指定的列表 key list1 存在数据则会返回第一个元素,否则在等待 100 秒后会返回 nil。
(nil)
(100.06s)
Redis Brpop 命令
Redis Brpop 命令移出并获取列表的最后一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
语法
redis Brpop 命令基本语法如下:
redis 127.0.0.1:6379> BRPOP LIST1 LIST2 .. LISTN TIMEOUT
可用版本
>= 2.0.0
返回值
加入在指定时间内没有任何元素被弹出,则返回一个 nil 和等待时长。反之,返回一个含有两个元素的列表,第一个元素是被弹出元素所属的key ,第二个元素是被弹出元素的值。
实例
redis 127.0.0.1:6379> BRPOP list1 100
在以上实例中,操作会被阻塞,如果指定的列表 key list1 存在数据则会返回第一个元素,否则在等待 100 秒后会返回 nil。
(nil)
(100.06s)
Redis Brpoplpush 命令
Redis Brpoplpush 命令从列表中弹出一个值,将弹出的元素插入另外一个列表中并返回它;如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
语法
redis Brpoplpush 命令基本语法如下:
redis 127.0.0.1:6379> BRPOPLPUSH LIST1 ANOTHER_LIST TIMEOUT
可用版本
>= 2.0.0
返回值
加入在指定时间内没有任何元素被弹出,则返回一个 nil 和等待时长。反之,返回一个含有两个元素的列表,第一个元素是被弹出元素的值,第二个元素是等等待时长。
实例
# 非空列表
redis> BRPOPLPUSH msg reciver 500
"hello moto" # 弹出元素的值
(3.38s) # 等待时长
redis> LLEN reciver
(integer) 1
redis> LRANGE reciver 0 0
1) "hello moto"
# 空列表
redis> BRPOPLPUSH msg reciver 1
(nil)
(1.34s)
Redis Lindex 命令
Redis Lindex 命令用于通过索引获取列表中的元素。你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示倒数第二个元素,以此类推。
语法
redis Lindex 命令基本语法如下:
redis 127.0.0.1:6379> LINDEX KEY_NAME INDEX_POSITION
可用版本
>= 2.0.0
返回值
列表中下标为指定索引值的元素。如果指定索引值不在列表的区间范围内,返回 nil。
实例
redis 127.0.0.1:6379> LPUSH mylist "World"
(integer) 1
redis 127.0.0.1:6379> LPUSH mylist "Hello"
(integer) 2
redis 127.0.0.1:6379> LINDEX mylist 0
"Hello"
redis 127.0.0.1:6379> LINDEX mylist -1
"World"
redis 127.0.0.1:6379> LINDEX mylist 3 # index不在 mylist 的区间范围内
(nil)
Redis Linsert 命令
Redis Linsert 命令用于在列表的元素或者后插入元素。当指定元素不存在列表中时,不执行任何操作。当列表不存在时,被视为空列表,不执行任何操作。如果 key 不是列表类型,返回一个错误。
语法
redis Linsert 命令基本语法如下:
redis 127.0.0.1:6379> LINSERT KEY_NAME BEFORE EXISTING_VALUE NEW_VALUE
可用版本
>= 1.0.0
返回值
如果命令执行成功,返回插入操作完成之后,列表的长度。如果没有找到指定元素,返回-1 。 如果 key 不存在或为空列表。返回 0 。
实例
redis 127.0.0.1:6379> RPUSH list1 "foo"
(integer) 1
redis 127.0.0.1:6379> RPUSH list1 "bar"
(integer) 2
redis 127.0.0.1:6379> LINSERT list1 BEFORE "bar" "Yes"
(integer) 3
redis 127.0.0.1:6379> LRANGE list1 0 -1
1) "foo"
2) "Yes"
3) "bar"
Redis Llen 命令
Redis Llen 命令惯用语返回列表的长度。如果列表 key 不存在,则 key 被解释为一个空列表,返回 0 。如果 key 不是列表 类型,返回一个错误。
语法
redis Llen 命令基本语法如下:
redis 127.0.0.1:6379> LLEN KEY_NAME
可用版本
>= 1.0.0
返回值
列表的长度
实例
redis 127.0.0.1:6379> RPUSH list1 "foo"
(integer) 1
redis 127.0.0.1:6379> RPUSH list1 "bar"
(integer) 2
redis 127.0.0.1:6379> LLEN list1
(integer) 2
Redis Lpop 命令
Redis Lpop命令用于移除并返回列表的第一个元素。
语法
redis Lpop 命令基本语法如下:
redis 127.0.0.1:6379> LLEN KEY_NAME
可用版本
>= 1.0.0
返回值
列表的第一个元素,当列表 key 不存在时,返回 nil 。
redis 127.0.0.1:6379> RPUSH list1 "foo"
(integer) 1
redis 127.0.0.1:6379> RPUSH list1 "bar"
(integer) 2
redis 127.0.0.1:6379> LPOP list1
"foo"
Redis Lpush 命令
Redis Lpush 命令将一个或多个值插入到列表头部。如果 key 不存在,一个空列表会被创建并执行 Lpush 操作。 当 key 存在但不是列表烈性时,返回一个错误。
注意:在 redis 2.4 版本以前的 Lpush 命令,都只接受单个value 值
语法
redis Lpush 命令基本语法如下:
redis 127.0.0.1:6379> LPUSH KEY_NAME VALUE1.. VALUEN
可用版本
>= 1.0.0
返回值
执行 Lpush 命令后,列表的长度。
实例
127.0.0.1:6379> LPUSH list1 "foo"
(integer) 1
127.0.0.1:6379> LPUSH list1 "bar"
(integer) 2
127.0.0.1:6379> LRANGE list1 0 -1
1) "bar"
2) "foo"
Redis Lpushx 命令
Rdis Lpushx 将一个或多个值插入到已存在的列比哦啊头部,列表不存在时操作无效
语法
redis Lpushx 命令基本语法如下:
redis 127.0.0.1:6379> LPUSHX KEY_NAME VALUE1.. VALUEN
可用版本
>= 2.0.0
返回值
Lpushx 命令执行之后,列表的长度
实例
127.0.0.1:6379> LPUSH list1 "foo"
(integer) 1
127.0.0.1:6379> LPUSHX list1 "bar"
(integer) 2
127.0.0.1:6379> LPUSHX list2 "bar"
(integer) 0
127.0.0.1:6379> LRANGE list1 0 -1
1) "bar"
2) "foo"
Redis Lrem 命令
Reids Lrem 根据参数 COUNT 的值,移除列表中与参数 value 相等的元素。
COUNT 的值可以是以下几种:
- count > 0 : 从表头开始向表尾搜索,移除与 value 相等的值,数量为 count。
- count < 0:从表尾开始向表头搜索,移除与 value 相等的值,数量为 count 的绝对值。
- count = 0:移除表中所有与 value 相等的值。
语法
redis Lrem 命令基本语法如下:
redis 127.0.0.1:6379> LREM KEY_NAME COUNT VALUE
可用版本
>= 1.0.0
返回值
被移除元素的数量。列表不存在时返回 0 。
实例
redis 127.0.0.1:6379> RPUSH mylist "hello"
(integer) 1
redis 127.0.0.1:6379> RPUSH mylist "hello"
(integer) 2
redis 127.0.0.1:6379> RPUSH mylist "foo"
(integer) 3
redis 127.0.0.1:6379> RPUSH mylist "hello"
(integer) 4
redis 127.0.0.1:6379> LREM mylist -2 "hello"
(integer) 2
Redis Lset 命令
Redis Lset 通过索引来设置元素的值
当索引参数超出范围,或对一个空列表进行 lset 时,返回一个错误。
关于列表下标的更多信息,请参考 LINDEX 命令。
语法
redis Lset 命令基本语法如下:
redis 127.0.0.1:6379> LSET KEY_NAME INDEX VALUE
可用版本
>= 1.0.0
返回值
操作成功返回 ok ,否则返回错误信息。
实例
redis 127.0.0.1:6379> RPUSH mylist "hello"
(integer) 1
redis 127.0.0.1:6379> RPUSH mylist "hello"
(integer) 2
redis 127.0.0.1:6379> RPUSH mylist "foo"
(integer) 3
redis 127.0.0.1:6379> RPUSH mylist "hello"
(integer) 4
redis 127.0.0.1:6379> LSET mylist 0 "bar"
OK
redis 127.0.0.1:6379> LRANGE mylist 0 -1
1: "bar"
2) "hello"
3) "foo"
4) "hello"
Redis Ltrim 命令
Redis Ltrim 对一个列表进行修剪(trim ),就是说,让列表只保留自定区间内的元素,不在指定区间之内的元素都将被删除。
下标 0 表示列表的第一个元素, 以 1 表示列表的第二个元素,以此类推。你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
语法
redis Ltrim 命令基本语法如下:
redis 127.0.0.1:6379> LTRIM KEY_NAME START STOP
可用版本
>= 1.0.0
返回值
命令执行成功时,返回 ok 。
实例
redis 127.0.0.1:6379> RPUSH mylist "hello"
(integer) 1
redis 127.0.0.1:6379> RPUSH mylist "hello"
(integer) 2
redis 127.0.0.1:6379> RPUSH mylist "foo"
(integer) 3
redis 127.0.0.1:6379> RPUSH mylist "bar"
(integer) 4
redis 127.0.0.1:6379> LTRIM mylist 1 -1
OK
redis 127.0.0.1:6379> LRANGE mylist 0 -1
1) "hello"
2) "foo"
3) "bar"
Redis Rpop 命令
Redis Rpop 命令用于移除并返回列表的最后一个元素。
语法
redis Rpop 命令基本语法如下:
redis 127.0.0.1:6379> RPOP KEY_NAME
可用版本
>= 1.0.0
返回值
列表的最后一个元素。当列表不存在时,返回 nil 。
实例
redis 127.0.0.1:6379> RPUSH mylist "hello"
(integer) 1
redis 127.0.0.1:6379> RPUSH mylist "hello"
(integer) 2
redis 127.0.0.1:6379> RPUSH mylist "foo"
(integer) 3
redis 127.0.0.1:6379> RPUSH mylist "bar"
(integer) 4
redis 127.0.0.1:6379> RPOP mylist
OK
redis 127.0.0.1:6379> LRANGE mylist 0 -1
1) "hello"
2) "hello"
3) "foo"
Redis Rpoplpush 命令
Redis Rpoplpush 命令用于移除列表的最后一个元素,并将元素添加到另一个列表并返回。
语法
redis Rpoplpush 命令基本语法如下:
redis 127.0.0.1:6379> RPOPLPUSH SOURCE_KEY_NAME DESTINATION_KEY_NAME
可用版本
>= 1.0.0
返回值
被弹出的元素
实例
redis 127.0.0.1:6379> RPUSH mylist "hello"
(integer) 1
redis 127.0.0.1:6379> RPUSH mylist "foo"
(integer) 2
redis 127.0.0.1:6379> RPUSH mylist "bar"
(integer) 3
redis 127.0.0.1:6379> RPOPLPUSH mylist myotherlist
"bar"
redis 127.0.0.1:6379> LRANGE mylist 0 -1
1) "hello"
2) "foo"
Redis Rpush 命令
Redis Rpush 命令用于将一个或多个值插入到列表的尾部(最右边)。
如果列表不存在,一个空列表会被创建并执行 Rpush 操作,当列表存在但不是列表类型时,返回一个错误。
注意:在 Redisa 2.4 版本以前的 Rpush 命令你给,都只能接受单个 value 值。
语法
redis Rpush 命令基本语法如下:
redis 127.0.0.1:6379> RPUSH KEY_NAME VALUE1..VALUEN
可用版本
>= 1.0.0
返回值
执行 Rpush 操作后,列表的长度。
实例
redis 127.0.0.1:6379> RPUSH mylist "hello"
(integer) 1
redis 127.0.0.1:6379> RPUSH mylist "foo"
(integer) 2
redis 127.0.0.1:6379> RPUSH mylist "bar"
(integer) 3
redis 127.0.0.1:6379> LRANGE mylist 0 -1
1) "hello"
2) "foo"
3) "bar"
Redis Rpushx 命令
Redis Rpushx 命令用于将一个或多个值插入到已存在的列表尾部(最右边)。如果列表不存在,操作无效。
语法
redis Rpushx 命令基本语法如下:
redis 127.0.0.1:6379> RPUSHX KEY_NAME VALUE1..VALUEN
返回值
执行 Rpushx 操作后,列表的长度。
实例
redis 127.0.0.1:6379> RPUSH mylist "hello"
(integer) 1
redis 127.0.0.1:6379> RPUSH mylist "foo"
(integer) 2
redis 127.0.0.1:6379> RPUSHX mylist2 "bar"
(integer) 0
redis 127.0.0.1:6379> LRANGE mylist 0 -1
1) "hello"
2) "foo"