Redis数据类型
1. 数据类型
- String 字符串
- hash 哈希
- list 列表
- set 集合
- sorted_set (zset) 有序集合
完整redis命令查看: http://www.redis.cn/commands.html
2. String类型
2.1 set
命令:set key value [EX seconds] [PX milliseconds] [NX|XX]
将键`key`设定为指定的“字符串”值 。
如果 key 已经保存了一个值,那么这个操作会直接覆盖原来的值,并且忽略原始类型。
当set
命令执行成功之后,之前设置的过期时间都将失效。
从2.6.12版本开始,redis为SET
命令增加了一系列选项:
EX
seconds – 设置键key的过期时间,单位时秒PX
milliseconds – 设置键key的过期时间,单位时毫秒NX
– 只有键key不存在的时候才会设置key的值XX
– 只有键key存在的时候才会设置key的值
#设置 name的值为aaa
127.0.0.1:6379> set name aaa
OK
#设置 username值为bbbb,且过期时间为1000s
127.0.0.1:6379> set username bbbb ex 1000
OK
127.0.0.1:6379>
2.2 get
命令: get key
返回key
的value
。如果key不存在,返回特殊值nil
。如果key
的value
不是string,就返回错误,因为GET
只处理string类型的values
。
#获取name的值
127.0.0.1:6379> get name
"aaa"
#获取username的值,因为之前设置过过期时间,已过期,现在key不存在,返回nil
127.0.0.1:6379> get username
(nil)
127.0.0.1:6379>
2.3 del
命令:del key [key …]
删除指定的一批keys,如果删除中的某些key不存在,则直接忽略。
#删除key为name的数据,如果存在就会返回(integer) 1
127.0.0.1:6379> del name
(integer) 1
#删除key为name的数据,不存在就会返回(integer) 0
127.0.0.1:6379> del name
(integer) 0
127.0.0.1:6379>
2.4 mset/mget
mset一次设置多个key-value。mget一次获取多个值
命令:mset key value [key value …]
mget key [key …]
#设置多个key-value值 a-1 b-2 c-3
127.0.0.1:6379> mset a 1 b 2 c 3
OK
#获取value值,如果key不存在,则返回(nil)
127.0.0.1:6379> mget a b d
1) "1"
2) "2"
3) (nil)
2.5 strlen
命令: strlen key
返回key的string类型value的长度。如果key对应的非string类型,就返回错误
127.0.0.1:6379> strlen b
(integer) 1
2.6 append
如果 key
已经存在,并且值为字符串,那么这个命令会把 value
追加到原来值(value)的结尾。 如果 key
不存在,那么它将首先创建一个空字符串的key
,再执行追加操作 。
127.0.0.1:6379> set aa abcdefg
OK
127.0.0.1:6379> append aa hijk
(integer) 11
127.0.0.1:6379> get aa
"abcdefghijk"
127.0.0.1:6379>
2.7 incr
命令: incr key
对存储在指定key
的数值执行原子的加1操作。
如果指定的key不存在,那么在执行incr操作之前,会先将它的值设定为0
。
如果指定的key中存储的值不是字符串类型(fix:)或者存储的字符串类型不能表示为一个整数,
那么执行这个命令时服务器会返回一个错误(eq:(error) ERR value is not an integer or out of range)。
这个操作仅限于64位的有符号整型数据。
127.0.0.1:6379> incr a
(integer) 1
127.0.0.1:6379> incr a
(integer) 2
127.0.0.1:6379> set name aaa
OK
127.0.0.1:6379> incr name
(error) ERR value is not an integer or out of range
127.0.0.1:6379>
2.8 incrby
命令: incrby key increment
将key对应的数字加decrement。如果key不存在,操作之前,key就会被置为0。如果key的value类型错误或者是个不能表示成数字的字符串,就返回错误。这个操作最多支持64位有符号的正型数字。
127.0.0.1:6379> incrby b 10
(integer) 10
127.0.0.1:6379> incrby b 6
(integer) 16
127.0.0.1:6379> incrby name 5
(error) ERR value is not an integer or out of range
2.9 incrbyfloat
命令: incrbyfloat key increment
通过指定浮点数key
来增长浮点数(存放于string中)的值. 当键不存在时,先将其值设为0再操作.下面任一情况都会返回错误:
- key 包含非法值(不是一个string).
- 当前的key或者相加后的值不能解析为一个双精度的浮点值.(超出精度范围了)
如果操作命令成功, 相加后的值将替换原值存储在对应的键值上, 并以string的类型返回. string中已存的值或者相加参数可以任意选用指数符号,但相加计算的结果会以科学计数法的格式存储. 无论各计算的内部精度如何, 输出精度都固定为小数点后17位
127.0.0.1:6379> incrbyfloat c 10
"10"
127.0.0.1:6379> incrbyfloat c 1.4
"11.4"
2.10 decr
命令:decr key
对key对应的数字做减1操作。如果key不存在,那么在操作之前,这个key对应的值会被置为0。如果key有一个错误类型的value或者是一个不能表示成数字的字符串,就返回错误。这个操作最大支持在64位有符号的整型数字。
127.0.0.1:6379> decr d
(integer) -1
127.0.0.1:6379> decr d
(integer) -2
2.11 decrby
命令: decrby key decrement
将key对应的数字减decrement。如果key不存在,操作之前,key就会被置为0。如果key的value类型错误或者是个不能表示成数字的字符串,就返回错误。这个操作最多支持64位有符号的正型数字
127.0.0.1:6379> decrby a 1
(integer) 1
127.0.0.1:6379> decrby c 1.2
(error) ERR value is not an integer or out of range
3. Hash类型
3.1 hset
命令:HSET key field value
设置 key 指定的哈希集中指定字段的值。
如果 key 指定的哈希集不存在,会创建一个新的哈希集并与 key 关联。
如果字段在哈希集中存在,它将被重写。
返回值:
- 1:如果field是一个新的字段
- 0:如果field原来在map里面已经存在
127.0.0.1:6379> hset user01 name zhangsan
(integer) 1
127.0.0.1:6379> hset user01 name zhangsan1
(integer) 0
3.2 hget
命令: HGET key field
返回 key 指定的哈希集中该字段所关联的值 。 当字段不存在或者 key 不存在时返回nil 。
127.0.0.1:6379> hget user01 name
"zhangsan1"
127.0.0.1:6379> hget user01 age
(nil)
3.3 hdel
命令: HDEL key field [field …]
从 key 指定的哈希集中移除指定的域。在哈希集中不存在的域将被忽略。
如果 key 指定的哈希集不存在,它将被认为是一个空的哈希集,该命令将返回0。
返回从哈希集中成功移除的域的数量,不包括指出但不存在的那些域
127.0.0.1:6379> hdel user01 name age
(integer) 1
3.4 hexists
命令: HEXISTS key field
返回hash里面field是否存在 。
返回值:
- 1 hash里面包含该field。
- 0 hash里面不包含该field或者key不存在。
127.0.0.1:6379> hexists user01 name
(integer) 0
3.5 hmset
命令: HMSET key field value [field value …]
设置 key
指定的哈希集中指定字段的值。该命令将重写所有在哈希集中存在的字段。如果 key
指定的哈希集不存在,会创建一个新的哈希集并与 key
关联 。
127.0.0.1:6379> hmset user02 name lisi age 18
OK
3.6 hmget
命令:HMGET key field [field …]
返回 key
指定的哈希集中指定字段的值。
对于哈希集中不存在的每个字段,返回 nil
值。因为不存在的keys被认为是一个空的哈希集,对一个不存在的 key
执行 HMGET 将返回一个只含有 nil
值的列表。
127.0.0.1:6379> hmget user02 name age
1) "lisi"
2) "18"
3.7 hgetall
命令:HGETALL key
返回 key 指定的哈希集中所有的字段和值。返回值中,每个字段名的下一个是它的值,所以返回值的长度是哈希集大小的两倍 。
127.0.0.1:6379> hgetall user02
1) "name"
2) "lisi"
3) "age"
4) "18"
3.8 hlen
命令:HLEN key
返回 key
指定的哈希集包含的字段的数量。
127.0.0.1:6379> hlen user02
(integer) 2
3.9 hkeys
命令:HKEYS key
返回 key 指定的哈希集中所有字段的名字
127.0.0.1:6379> hkeys user02
1) "name"
2) "age"
3.10 hvals
命令:HVALS key
返回 key 指定的哈希集中所有字段的值 。
127.0.0.1:6379> hvals user02
1) "lisi"
2) "18"
127.0.0.1:6379> hvals user03
(empty list or set)
3.11 hincrby
命令: HINCRBY key field increment
增加 key
指定的哈希集中指定字段的数值。如果 key
不存在,会创建一个新的哈希集并与 key
关联。如果字段不存在,则字段的值在该操作执行前被设置为 0。HINCRBY
支持的值的范围限定在 64位 有符号整数
127.0.0.1:6379> hincrby user02 age 5
(integer) 23
127.0.0.1:6379> hincrby user02 age -2
(integer) 21
3.12 hincrbyfloat
命令:HINCRBYFLOAT key field increment
为指定key
的hash的field
字段值执行float类型的increment
加。如果field
不存在,则在执行该操作前设置为0.如果出现下列情况之一,则返回错误:
field
的值包含的类型错误(不是字符串)。- 当前
field
或者increment
不能解析为一个float类型。
127.0.0.1:6379> hincrbyfloat user02 age 1.5
"22.5"
127.0.0.1:6379> hincrbyfloat user02 age 2
"24.5"
127.0.0.1:6379> hincrbyfloat user02 age -1.2
"23.300000000000001"
4. list类型
4.1 lpush
命令:LPUSH key value [value …]
将所有指定的值插入到存于 key 的列表的头部。如果 key 不存在,那么在进行 push 操作前会创建一个空列表。 如果 key 对应的值不是一个 list 的话,那么会返回一个错误。
可以使用一个命令把多个元素 push 进入列表,只需在命令末尾加上多个指定的参数。元素是从最左端的到最右端的、一个接一个被插入到 list 的头部。 所以对于这个命令例子 LPUSH mylist a b c
,返回的列表是 c 为第一个元素, b 为第二个元素, a 为第三个元素。
返回值为 push 操作后的 list 长度
127.0.0.1:6379> lpush list1 a b c d
(integer) 4
4.2 lindex
命令**:LINDEX key index**
返回列表里的元素的索引 index 存储在 key 里面。 下标是从0开始索引的,所以 0 是表示第一个元素, 1 表示第二个元素,并以此类推。 负数索引用于指定从列表尾部开始索引的元素。在这种方法下,-1 表示最后一个元素,-2 表示倒数第二个元素,并以此往前推。
当 key 位置的值不是一个列表的时候,会返回一个error。
当请求的对应元素,或者当 index 超过范围的时候返回 nil
127.0.0.1:6379> lpush list1 a b c d
(integer) 4
127.0.0.1:6379> lindex list1 0
"d"
4.3 lrange
命令:LRANGE key start stop
返回存储在 key 的列表里指定范围内的元素。 start 和 end 偏移量都是基于0的下标,即list的第一个元素下标是0(list的表头),第二个元素下标是1,以此类推。
偏移量也可以是负数,表示偏移量是从list尾部开始计数。 例如, -1 表示列表的最后一个元素,-2 是倒数第二个,以此类推。
127.0.0.1:6379> lrange list1 0 3
1) "d"
2) "c"
3) "b"
4) "a"
127.0.0.1:6379> lrange list1 0 5
1) "d"
2) "c"
3) "b"
4) "a"
127.0.0.1:6379> lrange list1 -2 2
1) "b"
127.0.0.1:6379> lrange list1 -3 -1
1) "c"
2) "b"
3) "a"
4.4 lpop
命令:LPOP key
移除并且返回 key 对应的 list 的第一个元素。 返回第一个元素的值,或者当 key 不存在时返回 nil
127.0.0.1:6379> lpop list1
"d"
127.0.0.1:6379> lrange list1 0 3
1) "c"
2) "b"
3) "a"
4.5 rpush
命令:RPUSH key value [value …]
向存于 key 的列表的尾部插入所有指定的值。如果 key 不存在,那么会创建一个空的列表然后再进行 push 操作。 当 key 保存的不是一个列表,那么会返回一个错误。
可以使用一个命令把多个元素打入队列,只需要在命令后面指定多个参数。元素是从左到右一个接一个从列表尾部插入。 比如命令 RPUSH mylist a b c 会返回一个列表,其第一个元素是 a ,第二个元素是 b ,第三个元素是 c
127.0.0.1:6379> rpush list2 a b c d e
(integer) 5
127.0.0.1:6379> lrange list2 0 5
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
4.6 lset
命令:LSET key index value
设置 index 位置的list元素的值为 value。当index超出范围时会返回一个error
127.0.0.1:6379> lset list2 2 x
OK
127.0.0.1:6379> lrange list2 0 5
1) "a"
2) "b"
3) "x"
4) "d"
5) "e"
4.7 rpop
命令:RPOP key
移除并返回存于 key 的 list 的最后一个元素。
127.0.0.1:6379> rpop list2
"e"
127.0.0.1:6379> lrange list2 0 4
1) "a"
2) "b"
3) "x"
4) "d"
4.8 llen
命令:llen key
返回存储在 key 里的list的长度。 如果 key 不存在,那么就被看作是空list,并且返回长度为 0。 当存储在 key 里的值不是一个list的话,会返回error。
127.0.0.1:6379> llen list2
(integer) 4
4.9 linsert
命令:LINSERT key BEFORE|AFTER pivot value
把 value 插入存于 key 的列表中在基准值 pivot 的前面或后面。
当 key 不存在时,这个list会被看作是空list,任何操作都不会发生。
当 key 存在,但保存的不是一个list的时候,会返回error。
返回值是经过插入操作后的list长度,或者当 pivot 值找不到的时候返回 -1
127.0.0.1:6379> lrange list2 0 6
1) "a"
2) "b"
3) "x"
4) "d"
127.0.0.1:6379> linsert list2 BEFORE b aaaa
(integer) 5
127.0.0.1:6379> lrange list2 0 6
1) "a"
2) "aaaa"
3) "b"
4) "x"
5) "d"
4.10 lrem
命令:LREM key count value
从存于 key 的列表里移除前 count 次出现的值为 value 的元素。 这个 count 参数通过下面几种方式影响这个操作:
- count > 0: 从头往尾移除值为 value 的元素。
- count < 0: 从尾往头移除值为 value 的元素。
- count = 0: 移除所有值为 value 的元素。
比如, LREM list -2 “hello” 会从存于 list 的列表里移除最后两个出现的 “hello”。
需要注意的是,如果list里没有存在key就会被当作空list处理,所以当 key 不存在的时候,这个命令会返回 0。
127.0.0.1:6379> lpush list3 a b c d e a d e a
(integer) 9
127.0.0.1:6379> lrem list3 2 a
(integer) 2
127.0.0.1:6379> lrange list3 0 9
1) "e"
2) "d"
3) "e"
4) "d"
5) "c"
6) "b"
7) "a"
5. set类型
5.1 sadd
命令:SADD key member [member …]
添加一个或多个指定的member元素到集合的 key中.指定的一个或者多个元素member 如果已经在集合key中存在则忽略.如果集合key 不存在,则新建集合key,并添加member元素到集合key中.
如果key 的类型不是集合则返回错误.
127.0.0.1:6379> sadd set01 a b c d
(integer) 4
127.0.0.1:6379> sadd set01 a
(integer) 0
5.2 scard
命令:SCARD key
返回集合存储的key的基数 (集合元素的数量). 如果key不存在,则返回 0
127.0.0.1:6379> scard set01
(integer) 4
smembers
命令:SMEMBERS key
返回key集合所有的元素
127.0.0.1:6379> smembers set01
1) "d"
2) "a"
3) "c"
4) "b"
5.3 spop
命令:SPOP key [count]
从存储在key的集合中移除并返回一个或多个随机元素。
127.0.0.1:6379> spop set01
"a"
127.0.0.1:6379> smembers set01
1) "b"
2) "d"
3) "c"
6. Sorted Set