Redis value的5种类型及常见操作
Redis本身存储就是一个hash表,实际实࣫比hash表更复一些,后续讲存储结构时会细讲
Key只有String类型
Value包括String ,Set,List,Hash,Zset五中类型
STRING 可以是字符串,整数或者浮点数以及任何二进制格式的数据 对字符串或一部分进行操作,对整到和浮点数进行自增或自减操作
LIST 一个链表,链表上的每个字节都包含一个字符串 根据偏移量查找或移除某元素
SET 包含字符串的无序收集器,并且包含的每个字符串都不重复 添加,获取,移除单个元素,是否存在,计算交集,差集,并集,从集合中取元素
HASH 包含键值对的无序散列表 添加,获取,删除多个键值对,获取所有键值对
ZSET 字符集成员member和浮点数分值score之间的有序映射,元素的排列顺序由分值的大小决定 添加获取删除单个元素,根据分值范围或成员来获取元素
数据基础结构
string
string SET key value [EX seconds] [PX milliseconds] [NX|XX]
EX代表设置超时时间,单位为秒
• PX代表设置超时时间,单位为毫秒
• NX代表只有key不存在才会执行
• XX代表只有key存在才会更新
• 如果成功,返回ok,失败返回空(nil)
Get key 返回key对应的值
[root@hongquan1 src]# /usr/local/redis/src/redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379> set 123 liubx1122 EX 2 //值存在2秒
OK
127.0.0.1:6379> get 123
(nil)
127.0.0.1:6379> set 123 liubx1122 EX 20
OK
127.0.0.1:6379> get 123
"liubx1122"
127.0.0.1:6379> get 123
"liubx1122"
127.0.0.1:6379> get 123
(nil)
127.0.0.1:6379> set 123 liubx1122 EX 2000
OK
127.0.0.1:6379> set 123 liubx3344 NX //不存在就更新
(nil)
127.0.0.1:6379> set 999 liubx3344 NX
OK
127.0.0.1:6379> get 999
"liubx3344"
127.0.0.1:6379> get 123
"liubx1122"
127.0.0.1:6379> set 123 99878 XX //存在就更新
OK
127.0.0.1:6379> get 123
"99878"
MGET key [key ...]
返回指定的key的所有值,如果key不存在则返回这个key的值为nil
返回对应key的值列表
127.0.0.1:6379> mget tt kk fdata1
1) (nil)
2) (nil)
3) (nil)
127.0.0.1:6379> mget tt kk fdata1 nodata
1) (nil)
2) (nil)
3) (nil)
4) (nil)
MSET key value [key value ...]
设置多个key value,如果某个key以及存在,则用新值覆盖旧值
• 整个操作是原子操作,要么同时成功,要么同时失败
• 如果key存在不想覆盖的话,采用MSETNX命令
• 总是返回ok,此操作不会失败
MSETNX key value [key value ...]
与MSET类似,但是如果只要有一个key存在,则表示结果失败
返回值:1表示设置成功,0表示设置失败
--append
如果key已经存在,并且值是string类型,就把新的值追加到原来值的后面
如果key不存在,就类似set的功能
返回值的字符长度
INCR key
对值进行加一操作,但是只能是值是integer类型才能操作,如果不是就会出错
最大值为64位有符号值
返回值为加完的结果--适合做计数器(原子性)
127.0.0.1:6379> get 888
(nil)
127.0.0.1:6379> append 888 apendtest
(integer) 9
127.0.0.1:6379> get 888
"apendtest"
127.0.0.1:6379> set addt 9.9
OK
127.0.0.1:6379> incr addt
(error) ERR value is not an integer or out of range
127.0.0.1:6379> set addt1 kkk
OK
127.0.0.1:6379> incr addt
(error) ERR value is not an integer or out of range
127.0.0.1:6379> set h1 1
OK
127.0.0.1:6379> incr h1
(integer) 2
127.0.0.1:6379> incr h1
(integer) 3
127.0.0.1:6379> get h1
"3"
DECR key
对值进行减一操作,但是Ց能是值是integer类型才能操作,如果Љ是就会出错
• 如果key不存在,会对此key赋值为0,再做操作
• 操作能操作的数被限制为64位有符号值
• 返回操作后的结果值
DECRBY key decrment
对值进行减法操作,减去decrement这个值,但是只能是值是integer类型才能操作,如果不是就会出错
INCRBY key increment
对值进行加法法操作,加上decrement这个值,但是只能是值是integer类型才能操作,如果不是就会出错
127.0.0.1:6379> get 111
(nil)
127.0.0.1:6379> decr 111
(integer) -1
127.0.0.1:6379> decr 111
(integer) -2
127.0.0.1:6379> get 111
"-2"
127.0.0.1:6379> decrby 111 1
(integer) -3
127.0.0.1:6379> decrby 111 -1
(integer) -2
127.0.0.1:6379> incrby 111 1
(integer) -1
127.0.0.1:6379> incrby 111 0
(integer) -1
127.0.0.1:6379> incrby 111 -2
(integer) -3
INCRBYFLOAT key increment
与INCRBY规则一样,但是操作的是浮点数,返回操作后的结果值
GETSET key value
原子操作,设置新值的时候,把旧值返回给调用者,如果key已经存在或者key不是String类型就会报错,此命令一般与INCR联合使用
STRLEN key
返回key对应的值的长度,如果值不是string类型,就会报错
127.0.0.1:6379> set fdata 1.5
OK
127.0.0.1:6379> incrbyfloat fdata 2.0
"3.5"
127.0.0.1:6379> incrbyfloat fdata 1.005
"4.505"
127.0.0.1:6379> incrbyfloat fdata 3
"7.505"
127.0.0.1:6379> set fdata1 3
OK
127.0.0.1:6379> incrbyfloat fdata 1.1
"8.605"
127.0.0.1:6379> incr mycounter
(integer) 1
127.0.0.1:6379> getset mycounter "0"
"1"
127.0.0.1:6379> get mycounter
"0"
127.0.0.1:6379> getset mycounter 1
"0"
127.0.0.1:6379> get mycounter
"1"
127.0.0.1:6379> getset mycounter 11
"1"
127.0.0.1:6379> get mycounter
"11"
127.0.0.1:6379> sadd sett 1111
(integer) 1
127.0.0.1:6379> strlen sett
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> set sett abc
OK
127.0.0.1:6379> strlen sett
(integer) 3
GETRANGE key start end
2.0版本前叫做SUBSTR,返回字符串类型值的子串,Start和end的值可以取负数,表示倒数第几个,-1表示最后一个字符
返回区间字符串
GETBIT key offset
可以获得一个字符串类型键指定位置的二进制位的值(0或1),索引从0开始
SETBIT key offset value
设置字符串类型键指定位置的二进制位的值,返回值是该位置的旧值
Bitcount
可以获得字符串类型键中值是1的二进制位个数
127.0.0.1:6379> set k1 123456
OK
127.0.0.1:6379> get k1
"123456"
127.0.0.1:6379> getrange k1 0 3
"1234"
127.0.0.1:6379> getrange k1 -3 -1
"456"
127.0.0.1:6379> set k2 abcde
OK
127.0.0.1:6379> getrange k2 2 3
"cd"
127.0.0.1:6379> getbit k2 1
(integer) 1
127.0.0.1:6379> getbit k2 3
(integer) 0
127.0.0.1:6379> getbit k1 1
(integer) 0
127.0.0.1:6379> getbit k1 2
(integer) 1
127.0.0.1:6379> setbit k1 2 0
(integer) 1
127.0.0.1:6379> getbit k1 2
(integer) 0
127.0.0.1:6379> get k1
"\x1123456"
127.0.0.1:6379> bitcount k1 1
(error) ERR syntax error
127.0.0.1:6379> bitcount k1
(integer) 20
127.0.0.1:6379> bitcount k2
(integer) 17
Lists
----评论
LPUSH key value [value ...]
把所有的值从list的头部插入,如果key不存在就创建一个空的队列,如果key对值的value不是list类型,则会出现错误
元素从左到右依次插入,返回list的长度
LPUSHX key value
从list头部插入一个值,当key不存在时,不会产生插入动作,返回list的长度
LPOP key
移除list的第一个节点,并返回节点数据
127.0.0.1:6379> lpush list1 11 22 33 55 66 11
(integer) 6
127.0.0.1:6379> get list1
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> lpop 3
(nil)
127.0.0.1:6379> lpop list1
"11"
127.0.0.1:6379> lpop list1
"66"
127.0.0.1:6379> lpop list1
"55"
127.0.0.1:6379> lpush list2 data1 data2
(integer) 2
127.0.0.1:6379> lpush list2 data3
(integer) 3
127.0.0.1:6379> lpop list3
(nil)
127.0.0.1:6379> lpushx list2 data4
(integer) 4
127.0.0.1:6379> lpushx list3 data2
(integer) 0
127.0.0.1:6379> lpop list3
(nil)
127.0.0.1:6379> lpushx list3 data1
(integer) 0
127.0.0.1:6379> lpushx list3 data2
(integer) 0
127.0.0.1:6379> lpushx list3 data3
(integer) 0
127.0.0.1:6379> lpop list3
(nil)
----
127.0.0.1:6379> lrange list1 0 10
1) "33"
2) "22"
3) "11"
127.0.0.1:6379> lpush list1 00
(integer) 4
127.0.0.1:6379> lrange list1 0 10
1) "00"
2) "33"
3) "22"
4) "11"
127.0.0.1:6379> lpop list1
"00"
127.0.0.1:6379> lrange list1 0 10
1) "33"
2) "22"
3) "11"
---
BLPOP key [key ...] timeout
以阻塞的方式从上key面移除并返回第一个值,只移除和返回第一个非空的key
Timeout的单位是秒,如果为0,则表示一直阻塞
只要list的长度为0或者key不存在就会阻塞
当key是多个时,比如blopo key1 key2,则只要有一个key对应的list不是非空,则不会阻塞
返回值依次包含key 弹出的值 阻塞的时长,超时时,如果还没有值可以返回,则返回nil
LLEN key
返回对应key的list中值的数量,如果key不存在或者list为空,则返回0
127.0.0.1:6379> lpop list3
(nil)
127.0.0.1:6379> blpop list3 10
(nil)
(10.09s)
127.0.0.1:6379> blpop list3 20
(nil)
(20.06s)
127.0.0.1:6379> blpop list1 10
1) "list1"
2) "33"
127.0.0.1:6379> blpop list1 list2 10
1) "list1"
2) "22"
127.0.0.1:6379> blpop list1 list3 10
1) "list1"
2) "11"
127.0.0.1:6379> llen list1
(integer) 0
127.0.0.1:6379> llen list2
(integer) 4
RPUSH key value [value ...]
把所有的值从list的尾部插入,如果key不存在就创建一个空的队列
如果key对应的value不是list类型,则会出现错误
元素从左到右依次插入,返回list的长度
RPUSHX key value
从list尾部插入一个值,当key不存在时,不会产生插入动作,返回list的长度
RPOP key
移除list的最后一个节点,并返回节点数据或者nil
127.0.0.1:6379> rpush l1 1 3 5 7 9
(integer) 5
127.0.0.1:6379> rpushx l2 1 2 3
(error) ERR wrong number of arguments for 'rpushx' command
127.0.0.1:6379> rpushx l2 1
(integer) 0
127.0.0.1:6379> rpop l1
"9"
127.0.0.1:6379> rpop l1
"7"
BRPOP key [key ...] timeout
类似于blpop
RPOPLPUSH source destination
此操作是一个原子操作
从source对应的key的list里面的尾部移除一个值,并且加入到destination指定的list的头部
如果source的list存在在,则返回nil,但是不会做任何操作
如果source和destination是一样的,则等于把list的尾部数据插入到头部
返回被弹出和插入的数据
BRPOPLPUSH source destination timeout
功能与rpoplpush相似,但是当source为空时,将会进行阻塞
127.0.0.1:6379> lpush source 11 22 33
(integer) 3
127.0.0.1:6379> rpoplpush source dest
"11"
127.0.0.1:6379> llen dest
(integer) 1
127.0.0.1:6379> lpop dest
"11"
127.0.0.1:6379> llen dest
(integer) 0
127.0.0.1:6379> rpoplpush dest source
(nil)
LINDEX key index
返回key指定的队列中位置为index的值
从0开始,负数表示从后面开始算
LINSERT key BEFORE|AFTER pivot value
把value的值插入key对应的list中去,位置在pivot这个值的前面(before)或者后面(after)
如果key不存在,则不会产生任何操作
如果pivot对应的值不存在则返回-1,否则就返回插入后list的长度
LRANGE key start stop
返回一个区间的值,从list的头(左)到尾(右)
如果start大于list的长度,就会返回空
如果stop大于list的长度,则以list最后一个值尾准
127.0.0.1:6379> llen dest
(integer) 0
127.0.0.1:6379> lpush dest 11
(integer) 1
127.0.0.1:6379> lpush dest 22 33
(integer) 3
127.0.0.1:6379> linsert dest before 11 44
(integer) 4
127.0.0.1:6379> lrange dest 0 4
1) "33"
2) "22"
3) "44"
4) "11"
127.0.0.1:6379> linsert dest before 55 66
(integer) -1
127.0.0.1:6379> lrange dest 0 6
1) "33"
2) "22"
3) "44"
4) "11"
LREM key count value
删除值等于value的count个元素
• 如果count大于0,则从头到尾数
• 如果count小于0,则从尾到头数
• 如果count等于0,则删除所有的值等于value的元素
LTRIM key start stop
对key指定的list进行裁剪,即取子集
• 如果start>list的长度或者start>end,将会返回一个空列表,然后导致key被删除
• 如果end大于list的长度,则取list的长度
• 执行完成返回ok
127.0.0.1:6379> rpush mylist "hello"
(integer) 1
127.0.0.1:6379> rpush mylist "hello"
(integer) 2
127.0.0.1:6379> rpush mylist "foo"
(integer) 3
127.0.0.1:6379> rpush mylist "hello"
(integer) 4
127.0.0.1:6379> lrem mylist -2 "hello"
(integer) 2
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "foo"
127.0.0.1:6379> lpush dest 11 22 33 44
(integer) 8
127.0.0.1:6379> ltrim dest 0 2
OK
127.0.0.1:6379> exists dest
(integer) 1
127.0.0.1:6379> lrange dest 0 10
1) "44"
2) "33"
3) "22"
127.0.0.1:6379> llen dest
(integer) 3
127.0.0.1:6379> ltrim dest 5 10
OK
127.0.0.1:6379> exists dest
(integer) 0
127.0.0.1:6379> llen dest
(integer) 0
LSET key index value
修改key对应的list中,位置为index的元素的值为value,当index超过list的返回,将会出现错误
127.0.0.1:6379> rpush my "one"
(integer) 1
127.0.0.1:6379> rpush my "two"
(integer) 2
127.0.0.1:6379> rpush my "three"
(integer) 3
127.0.0.1:6379> lset my 0 "four"
OK
127.0.0.1:6379> lset my -2 "five"
OK
127.0.0.1:6379> lrange my 0 -1
1) "four"
2) "five"
3) "three"
Keys
DEL key [key ...]
删除指定的key,如果key不存在,对此key的操作将会忽略,返回被删除的key
DUMP key
按照rdb的储格式把指定的key的值,序列化并返回给客户端,此序列化值里面不包括ttl信息
序列化的值中包含校验码,不同版本的rdb实࣫可能在差异,所以此处序列化的数据可能不对
Key不存在就返回nil
RESTORE key ttl serialized-value [REPLACE]
把通过dump命令序列化的值再存进去,如果没有带replace,且key已经存在,会出现错误
会检查校验值ͧchecksumͨ,如果不满足会返回错误,成功返回ok
EXISTS key [key ...]
判断key是否存在,如果存在,则返回值加1
从3.03版本开始支持多个key,以前的版本只支持一个
如果key重复,则返回值会重复判断和加1
127.0.0.1:6379> get 123
"99878"
127.0.0.1:6379> get 456
(nil)
127.0.0.1:6379> exists 123 456
(integer) 1
127.0.0.1:6379> exists 123
(integer) 1
127.0.0.1:6379> exists 123 123 456
(integer) 2
EXPIRE key seconds
设置key的超时时间,单位是秒ͺ当达到超时时间后,key会被删除
这个超时时间只能被DEL SET GETSET和*STORE命令修改或者改变,其它命令并不会改变超时设置或者超时时长
可以通过命令PERSIST把超时设置取消
当key被RENAME命令修改后,超时设置的特性还是不会改变
设置成功返回1,key不存在或者超时时间设置失败返回0
127.0.0.1:6379> set tt data1
OK
127.0.0.1:6379> get tt
"data1"
127.0.0.1:6379> expire tt 10
(integer) 1
127.0.0.1:6379> get tt
"data1"
127.0.0.1:6379> get tt
"data1"
127.0.0.1:6379> get tt
(nil)
127.0.0.1:6379> set tt data1
OK
127.0.0.1:6379> expire tt 10
(integer) 1
127.0.0.1:6379> set tt data2
OK
127.0.0.1:6379> get tt
"data2"
127.0.0.1:6379> get tt
"data2"
EXPIREAT key timestamp
设置key的超时时间,与EXPIRE相似,但是设置的是精确时间
设置成功返回1,key不存在或者超时时间设置失败返回0
Keys pattern
返回符合pattern的所有的key,在生产环境尽量少用,除非数据比较少,因为此操作会影响性能
可以用scan或者sets来达到查找key的业务需求
• *代表任意符,?代表单个符,[ae]代码a或者e
• [^e]代表不等于e,[a-d]代表a,b,c,d
127.0.0.1:6379> keys [a-d]
(empty list or set)
127.0.0.1:6379> keys [d-k]
(empty list or set)
127.0.0.1:6379> set a 11
OK
127.0.0.1:6379> set b 22
OK
127.0.0.1:6379> keys [a-d]
1) "b"
2) "a"
127.0.0.1:6379> set c 33
OK
127.0.0.1:6379> set d 44
OK
127.0.0.1:6379> keys [a-d]
1) "b"
2) "a"
3) "d"
4) "c"
127.0.0.1:6379> keys *
1) "b"
2) "h1"
3) "a"
4) "d"
5) "111"
ttl key
返回key对应的超时时间,还剩余多少时间
如果key不存在,返回-2,如果key还没有设置超时时间,返回-1
pttl key
与ttl能一致,但是返回的是毫秒
127.0.0.1:6379> set dd 111 ex 100
OK
127.0.0.1:6379> ttl dd
(integer) 97
127.0.0.1:6379> pttl dd
(integer) 90940
127.0.0.1:6379> ttl dd
(integer) -2
127.0.0.1:6379> ttl d
(integer) -1
SCAN
cursor [MATCH pattern] [COUNT count]--类似rdbms的分页查询
基于游标的方式返回当前数据库的key,因为每次返回的数据不多,不会阻塞服务器,所以可以在生产环境中使用
Cursor表示的是游标的位置,一般从0开始,返回的数据中第一行代表的就是下一次游标的位置,当返回的下一行游标是
0时,代表本次迭代全部完成ͺ此游标值不是一个连续标准值,比如5,10,15是连续标准
MATCH pattern类似keys中模式一样,返回指定模式的迭代游标
Count代表每次迭ї返回的数据条数,默认是10,但是它只是一个提示,实现时并没有严格保证,实际返回的值可能会
比这个值多一些,但是不会多太多
与keys或者SMEMBERS命令相比,scan返回的结果不稳定,在执行迭代的过程中,如果key发生变化,比如删除或者新
增,则返回的结果可能在一下几个问题:
– 可能会返回重复的key,所以,使用此命令时,业务系统需要判断重复
– 如果在迭代过程中,有key被删除了,但是在迭ї完成前没有被添加进来,则此key并不会出现在迭代中
127.0.0.1:6379> scan 0
1) "22"
2) 1) "b"
2) "h1"
3) "c"
4) "addt"
5) "111"
6) "a"
7) "dest"
8) "sett"
9) "fdata1"
10) "fdata"
127.0.0.1:6379> scan 20
1) "21"
2) 1) "a"
2) "dest"
3) "sett"
4) "fdata1"
5) "fdata"
6) "mycounter"
7) "list2"
8) "source"
9) "my"
10) "999"
127.0.0.1:6379> scan 0 match 1*
1) "22"
2) 1) "111"
127.0.0.1:6379> scan 20 match 1*
1) "21"
2) (empty list or set)
hashes
HSET key field value
Key带表的是一个hash表,field为hash表的key,value为hash表中key对应的value
如果key不存在,则创建一个key及对应的hash表
如果field存在,则把value覆盖原来的值
如果field是新加入,并且设置成功,则返回1ͺ如果field已经存在,成功更新旧值,则返回0
HMSET key field value [field value ...]
与hset类似,但是一次设置多个值,成功返回ok
127.0.0.1:6379> hmset map1 name libux age 33
OK
127.0.0.1:6379> get map1
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> hkeys map1
1) "name"
2) "age"
127.0.0.1:6379> hlen map1
(integer) 2
127.0.0.1:6379> hsetnx map1 name libux123
(integer) 0
127.0.0.1:6379> hsetnx map1 other nxtest
(integer) 1
127.0.0.1:6379> hkeys map1
1) "name"
2) "age"
3) "other"
HSETNX key field value
Key代表的是一个hash表,field为hash表的key,value为hash表中key对应的value
• 当field不存在时才设置
• 如果field不存在,则设置值,返回1ͺ如果field存在,则返回0,不做任何操作
HKEYS key
获取key对应的map的所有key,返回key的列表
HLEN key
获取key对应的map的field的数量
HGET key field
获取某个field的值,Key代表的是一个hash表,field为hash表的keyͺ如果key不存在或者field不存在,返回nil,否则返回值
HMGET key field [field ...]
获取key对应的map的多个值,如果key不存在或者field不存在,返回nil,否则返回值列表
HVALS key
返回key对应的map的所有值列表
HSTRLEN key field
返回field对应的值的长度,当key不存在或者field不存在,则返回0
127.0.0.1:6379> hget map1 name
"libux"
127.0.0.1:6379> hmget map1 name age
1) "libux"
2) "33"
127.0.0.1:6379> hvals map1
1) "libux"
2) "33"
3) "nxtest"
127.0.0.1:6379> hlen map1
(integer) 3
HDEL key field [field ...]
删除key对应的map的field,可以原子性操作删除多个field,返回删除的值的数量
HEXISTS key field
判断key指定的map中是否存在field属性,如果key不存在或者field不存在则返回0,否则返回1
HGETALL key
返回key对应的map的所有key-value对,按照key然后下一行是value的形式展示
127.0.0.1:6379> hmset map1 del1 del1data del2 deldata2
OK
127.0.0.1:6379> hexits map1 del1
(error) ERR unknown command 'hexits'
127.0.0.1:6379> hexists map1 del1
(integer) 1
127.0.0.1:6379> hexists map1 del3
(integer) 0
127.0.0.1:6379> hgetall map1
1) "name"
2) "libux"
3) "age"
4) "33"
5) "other"
6) "nxtest"
7) "del1"
8) "del1data"
9) "del2"
10) "deldata2"
127.0.0.1:6379> hdel map1 del2
(integer) 1
127.0.0.1:6379> hgetall map1
1) "name"
2) "libux"
3) "age"
4) "33"
5) "other"
6) "nxtest"
7) "del1"
8) "del1data"
HINCRBY key field increment
对field指定的值加上increment,但是值必只是integer类型,范围在64位有符号的数,返回增加后的结果
HINCRBYFLOAT key field increment
对field指定的值加上increment,但是值必只是float类型,范围在64位有符号的数,如果key不存在或者field不存在则返回0,否则返回1
HSCAN key cursor [MATCH pattern] [COUNT count]
与scan类似,但是迭代的是key对应的map里面的值
127.0.0.1:6379> hscan map1 0 count 5
1) "0"
2) 1) "name"
2) "libux"
3) "age"
4) "33"
5) "other"
6) "nxtest"
7) "del1"
8) "del1data"
127.0.0.1:6379> hincrby map1 age 2
(integer) 35
127.0.0.1:6379> hget map1 age
"35"
127.0.0.1:6379> hset map1 money 100.1
(integer) 1
127.0.0.1:6379> hincrbyfloat map1 money 18.3
"118.39999999999999999"
127.0.0.1:6379> hget map1 money
"118.39999999999999999"
127.0.0.1:6379> hincrbyfloat map1 money -2.5
"115.89999999999999999"