redis中key值是二进制安全的,意味着可以用任何二进制序列作为key的值。
redis当中支持五种基本数据类型:string、list、hash、set、sort set 三种扩展类型:HyperLogLog、GEO、Stream
本片文章讲解基本类型的常用命令 扩展类型
命令 | 描述 | 返回值 |
---|---|---|
set命令 | 共8个 | |
set key value | 设置指定key的值 | OK |
setex key seconds value | 设置指定key的值 并设置key的过期时间(秒单位) | OK |
psetex key millseconds value | 设置指定key的值 并设置key的过期时间(毫秒单位) | OK |
setnx key value | key不存在时设置key的值 | 设置存在的key返回0 设置不存在的key返回1 |
setrange key offset value | 用value参数覆盖key从偏移量offset开始的值 | 返回字符串的长度 |
setbit key offset value | 设置或清除指定key偏移量上的位(bit) | 为旧key对应的bit位的值 |
mset key1 value1 key2 value | 同时设置多个key的值 | OK |
msetnx key1 value1 key2 value | 同时设置多个key的值 key不存在 | OK |
get命令 | 共5个 | |
get key | 获取指定key的值 | |
getrange key start end | 返回key中字符串值的子字符 下标从0开始 包含end的下表字符 | |
getset key value | 设置指定key的值 并返回旧值 | 返回旧值 |
getbit key offset | 获取key指定偏移量上的位(bit) | 0,1 |
mget key1 key2 | 获取一个或多个key的值 | |
其他命令 | 共7个 | |
strlen | 返回key所存储字符串的长度 | 字符串长度 |
incr key | 将key中存储的数字值增一 | |
incrby key | 将key中存储的数字值增指定值 | |
incrbyfloat key increment | 将key中存储的数字值增指定浮点值 | |
decr key | 将 key 中储存的数字值减一 | |
decrby key | 将 key 中储存的数字值减指定值 | |
append key | 如果 key 已经存在并且是一个字符串, APPEND 命令将指定的 value 追加到该 key 原来值(value)的末尾 |
下面抽一些命令实践
set 命令有返回值ok get命令返回key的value值
127.0.0.1:6379> set chen luo
OK
127.0.0.1:6379> get chen
"luo"
getrange 返回key中字符串值的子字符 下标从0开始 包含end的下表字符
setrange 用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始,返回字符串的长度
127.0.0.1:6379> getrange chen 0 4
"luo"
127.0.0.1:6379> getrange chen 1 2
"uo"
127.0.0.1:6379> getrange chen 0 1
"lu"
127.0.0.1:6379> setrange key4 2 off
(integer) 6
设置制定key新的value值,并且返回旧值
127.0.0.1:6379> getset chen luo2
"luo"
同时设置或取多个key的值
127.0.0.1:6379> mset key1 value1 key2 value2
OK
127.0.0.1:6379> mget key1 key2
1) "value1"
2) "value2"
设置key过期时间(秒单位)
如下 设置一秒 一秒后过期 返回nil
127.0.0.1:6379> setex key3 1 value3
OK
127.0.0.1:6379> get key3
(nil)
设置存在的key返回0 设置不存在的key返回1
127.0.0.1:6379> setnx key3 value3
(integer) 0
127.0.0.1:6379> setnx key4 value4
(integer) 1
返回key所存储字符串值得长度
127.0.0.1:6379> strlen key4
(integer) 6
接下来介绍bit命令
前提:在redis当中,string类型是以二进制存储的 所以有bit命令设置获取指定bit位的值
设置或清除指定key偏移量上的位 只能设置0 1
a 对应的 ASCII 码是 97,97 转为二进制是 01100001 b对应的ASCII码是01100010
讲b对应的ASCII码(01100010)修改为a对应的ASCII码(01100001)获取key5 得到结果为a
setbit 设置值得返回值为旧key对应的bit位的值
127.0.0.1:6379> set key5 b
OK
127.0.0.1:6379> get key5
"b"
127.0.0.1:6379> getbit key5 3
(integer) 0
127.0.0.1:6379> getbit key5 2
(integer) 1
127.0.0.1:6379> getbit key5 7
(integer) 0
127.0.0.1:6379> getbit key5 6
(integer) 1
127.0.0.1:6379> setbit key5 6 0
(integer) 1
127.0.0.1:6379> setbit key5 7 1
(integer) 0
127.0.0.1:6379> get key5
"a"
redis hash是一个string类型的filed(字段)和value(值)的映射表,每个hash可以存储 2^32 - 1 键值对(40多亿)
注意hash的set没有设置过期时间命令
命令 | 描述 | 返回值 |
---|---|---|
HSET key field value | 将hash表key中的字段field的值设为value | |
HMSET key field1 value1 [field2 value2 ] | 将hash表中key的多个字段设置value | |
HSETNX key field value | 只有在field不存在是设置哈希表字段的值 | |
HGET key field | 获取hash表中key中指定字段的值 | |
HMGET key field1 [field2] | 获取所有给定字段的值 | |
HEXISTS key field | 查看哈希表 key 中,指定的字段是否存在 | |
HGETALL key | 获取在哈希表中指定 key 的所有字段和值 | |
HKEYS key | 获取所有哈希表中的字段 | |
HVALS key | 获取哈希表中所有值 | |
HDEL key field1 [field2] | 删除一个或多个哈希表字段 | |
HLEN key | 获取哈希表中字段的数量 | |
HSCAN key cursor [MATCH pattern] [COUNT count] | 迭代哈希表中的键值对 | |
HINCRBY key field increment | 为哈希表 key 中的指定字段的整数值加上增量 increment | |
HINCRBYFLOAT key field increment | 为哈希表 key 中的指定字段的浮点数值加上增量 increment |
hset的返回值为1 hmset返回值为OK
127.0.0.1:6379> hset key10 hash1 value1
(integer) 1
127.0.0.1:6379> hget key10 hash1
"value1"
127.0.0.1:6379> hmset key11 hash1 value1 hash2 value2
OK
127.0.0.1:6379> hmget key11 hash1 hash2
1) "value1"
2) "value2"
只有在字段不存在时才能设置成功
设置成功返回1 设置失败返回0
127.0.0.1:6379> hsetnx key12 hash1 value1
(integer) 1
127.0.0.1:6379> hsetnx key12 hash1 value
(integer) 0
127.0.0.1:6379> hget key12 hash1
"value1"
删除一个或多个hash表字段 存在字段删除成功返回1 不存在字段删除失败返回0
127.0.0.1:6379> hdel key12 hash1
(integer) 1
127.0.0.1:6379> hdel key12 hash1
(integer) 0
查看hash表中指定的字段是否存在
不存在返回0 存在返回1
127.0.0.1:6379> hexists key12 hash1
(integer) 0
127.0.0.1:6379> hset key12 hash1 value1
(integer) 1
127.0.0.1:6379> hexists key12 hash1
(integer) 1
hgetall获取key中所有的字段和值
127.0.0.1:6379> hmset hash1 field1 value1 field value2
OK
127.0.0.1:6379> hgetall hash
(empty list or set)
127.0.0.1:6379> hgetall hash1
1) "field1"
2) "value1"
3) "field"
4) "value2"
127.0.0.1:6379> hkeys hash1
1) "field1"
2) "field"
127.0.0.1:6379> hvals hash1
1) "value1"
2) "value2"
获取hash表中字段的数量
127.0.0.1:6379> hlen hash1
(integer) 2
遍历hash中所有符合条件的field或者value
每次开始hscan redis返回0表示迭代开始
每找到一个匹配的field 或者value返回下一个游标
如下:
获取所有的field和value
HSCAN是为大数据而生的,注意在一定情况下count字段会失效!!下面失效的原因是ziplists类型编码的Hash或者Sorted Set集合(说明这些集合里面的元素占用的空间足够小),那么SCAN命令会返回集合中的所有元素,直接忽略COUNT属性
失效的多种情况可以看下面的链接
解惑:Redis的HSCAN命令中COUNT参数的"失效"场景
127.0.0.1:6379> hgetall hash1
1) "key1"
2) "cc"
3) "key2"
4) "11"
5) "key3"
6) "ccc"
7) "key4"
8) "22"
9) "key5"
10) "cccc"
11) "key6"
12) "33"
127.0.0.1:6379> hscan hash1 0 match key1 count 10
1) "0"
2) 1) "key1"
2) "cc"
127.0.0.1:6379> hscan hash1 3 match key2 count 10
1) "0"
2) 1) "key2"
2) "11"
127.0.0.1:6379> hscan hash1 3 match key* count 2
1) "0"
2) 1) "key1"
2) "cc"
3) "key2"
4) "11"
5) "key3"
6) "ccc"
7) "key4"
8) "22"
9) "key5"
10) "cccc"
11) "key6"
12) "33"
list是按照插入顺序排序
记忆法: L开头的都是插入头部取头部元素 R开头的都是插入尾部取尾部元素
命令 | 描述 | 返回值 |
---|---|---|
LPUSHX key value | 将一个值插入到已存在的列表头部 | |
LPUSH key value1 [value2] | 将一个或多个值插入到列表头部 | |
LSET key index value | 通过索引设置列表元素的值 | |
RPUSH key value1 [value2] | 在列表中添加一个或多个值 | |
RPUSHX key value | 为已存在的列表添加值 | |
LINSERT key BEFORE|AFTER pivot value | 在列表的元素前或者后插入元素 | |
LRANGE key start stop | 获取列表指定范围内的元素 | |
LINDEX key index | 通过索引获取列表中的元素 | |
BLPOP key1 [key2 ] timeout | 移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止 | |
BRPOP key1 [key2 ] timeout | 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止 | |
BRPOPLPUSH source destination timeout | 从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止 | |
LPOP key | 移出并获取列表的第一个元素 | |
LREM key count value | 移除列表元素 | |
RPOP key | 移除列表的最后一个元素,返回值为移除的元素 | |
RPOPLPUSH source destination | 移除列表的最后一个元素,并将该元素添加到另一个列表并返回 | |
LTRIM key start stop | 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除 | |
LLEN key | 获取列表长度 |
LPUSH LPUSHX是向列表头部插入元素 返回当前列表中元素的size
LSET按指定下标设置元素值 不能超过list的length 所以实际结果是覆盖指定下标下的值
RPUSH RPUSH是向列表尾部插入元素 返回当前列表中元素的size
LRANGE 获取列表中指定范围的元素
127.0.0.1:6379> LPUSH list value1 value2
(integer) 2
127.0.0.1:6379> LPUSH list value3
(integer) 3
127.0.0.1:6379> LRange list 0 10
1) "value3"
2) "value2"
3) "value1"
// value3 对应下标0 value2对应下标1 value3对应下标2
127.0.0.1:6379> Lset list 2 value4
OK
127.0.0.1:6379> Lrange list 0 10
1) "value3"
2) "value2"
3) "value4"
// rpush
127.0.0.1:6379> rpush list value5 value6
(integer) 5
127.0.0.1:6379> rpushx list value7
(integer) 6
127.0.0.1:6379> lrange list 0 10
1) "value3"
2) "value2"
3) "value4"
4) "value5"
5) "value6"
6) "value7"
// lset
127.0.0.1:6379> lset list 9 value9
(error) ERR index out of range
127.0.0.1:6379> lset list 6 value8
(error) ERR index out of range
127.0.0.1:6379> lset list 5 value1
OK
127.0.0.1:6379> lrange list 0 10
1) "value3"
2) "value2"
3) "value4"
4) "value5"
5) "value6"
6) "value1"
返回列表中数据个数
LINSERT key BEFORE|AFTER pivot value
在列表的元素前或者后插入元素
before:元素前 after:元素后
pivot:需要被插入前后的元素
LINDEX key index
根据索引返回列表中的指定索引元素
127.0.0.1:6379> linsert list before value5 hahaha
(integer) 7
127.0.0.1:6379> linsert list before value5 hehehe
(integer) 8
127.0.0.1:6379> lrange list 0 20
1) "value3"
2) "value2"
3) "value4"
4) "hahaha"
5) "hehehe"
6) "value5"
7) "value6"
8) "value1"
// LINDEX
127.0.0.1:6379> LINDEX list 7
"value1"
B:block阻塞 所以 timeout:过期时间
BLPOP 移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止 存在元素返回集合key并且返回移除的元素。
BRPOP 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止 存在元素返回集合key并且返回移除的元素
LREM key count value count移除符合value元素的数量 value值 从列表头部开始移除 返回移除数
127.0.0.1:6379> lrange list 0 20
1) "value3"
2) "value2"
3) "value4"
4) "hahaha"
5) "hehehe"
6) "value5"
7) "value6"
8) "value1"
127.0.0.1:6379> lpop list // 列表头取出value3
"value3"
127.0.0.1:6379> rpop list // 列表尾取出value1
"value1"
127.0.0.1:6379> lrange list 0 20
1) "value2"
2) "value4"
3) "hahaha"
4) "hehehe"
5) "value5"
6) "value6"
127.0.0.1:6379> blpop list 3 // 阻塞列表头部取出元素 等待三秒超时
1) "list"
2) "value2"
127.0.0.1:6379> brpop list 3 // 阻塞列表尾部取出元素 等待三秒超时
1) "list"
2) "value6"
127.0.0.1:6379> lrange list 0 20
1) "value4"
2) "hahaha"
3) "hehehe"
4) "value5"
127.0.0.1:6379> lrem list 1 value4 // 从头部开始删除1个等于value4的值
(integer) 1
127.0.0.1:6379> lrange list 0 20
1) "hahaha"
2) "hehehe"
3) "value5"
127.0.0.1:6379> lrem list 2 hahaha
(integer) 1
127.0.0.1:6379> lrange list 0 20
1) "hehehe"
2) "value5"
127.0.0.1:6379> lpush list hehehe
(integer) 3
127.0.0.1:6379> lpush list hehehe hehehe
(integer) 5
127.0.0.1:6379> lrange list 0 20
1) "hehehe"
2) "hehehe"
3) "hehehe"
4) "hehehe"
5) "value5"
127.0.0.1:6379> lrem list 2 hehehe // 从头部开始删除2个等hehehe的值
(integer) 2
127.0.0.1:6379> lrange list 0 20
1) "hehehe"
2) "hehehe"
3) "value5"
127.0.0.1:6379> rpush list hehehe hehehe
(integer) 5
127.0.0.1:6379> lrem list 2 hehehe
(integer) 2
127.0.0.1:6379> lrange list 0 20
1) "value5"
2) "hehehe"
3) "hehehe"
127.0.0.1:6379> lrem list 3 hehehe // 删除三个hehehe的元素 只存在两个返回值为2
(integer) 2
127.0.0.1:6379> lrange list 0 20
1) "value5"
127.0.0.1:6379> lrem list 1 value5
(integer) 1
127.0.0.1:6379> blpop list 3 // 阻塞删除头部第一个元素 等待3秒超时返回nil
(nil)
(3.02s)
127.0.0.1:6379> brpop list 3 // 阻塞删除尾部第一个元素 等待3秒超时返回nil
(nil)
(3.05s)
set类型,添加的元素是去重后的
set类型 支持两个集合取并集、交集、差集
命令 | 描述 | 返回值 |
---|---|---|
添加命令 | ||
SADD key member1 [member2] | 向集合添加一个或多个成员 | 元素在集合不存在返回设置元素成功的个数 存在返回0 |
SCARD key | 获取集合的成员数 | 成员数 |
SDIFF key1 [key2] | 返回第一个集合与其他集合之间的差异 | |
SDIFFSTORE destination key1 [key2] | 返回给定所有集合的差集并存储在 destination 中 | |
SINTER key1 [key2] | 返回给定所有集合的交集 | |
SINTERSTORE destination key1 [key2] | 返回给定所有集合的交集并存储在 destination 中 | |
SISMEMBER key member | 判断 member 元素是否是集合 key 的成员 | |
SMEMBERS key | 返回集合中的所有成员 | |
SMOVE source destination member | 将 member 元素从 source 集合移动到 destination 集合 | |
SPOP key | 移除并返回集合中的一个随机元素 | |
SRANDMEMBER key [count] | 返回集合中一个或多个随机数 | |
SREM key member1 [member2] | 移除集合中一个或多个成员 | |
SUNION key1 [key2] | 返回所有给定集合的并集 | |
SUNIONSTORE destination key1 [key2] | 所有给定集合的并集存储在 destination 集合中 | |
SSCAN key cursor [MATCH pattern] [COUNT count] | 迭代集合中的元素 |
元素在集合不存在返回设置元素成功的个数 存在返回0
127.0.0.1:6379> sadd set value1
(integer) 1
127.0.0.1:6379> sadd set value2
(integer) 1
127.0.0.1:6379> smembers set
1) "value2"
2) "value1"
127.0.0.1:6379> sadd set value1 // 设置已存在的元素返回0
(integer) 0
127.0.0.1:6379> sadd set value3 value4 value5 value6 // 设置四个元素 返回4
(integer) 4
127.0.0.1:6379> sadd set value3 value4 value5
(integer) 0
SCARD key:获取集合的成员数
SMEMBERS key:返回集合中的所有成员
SRANDMEMBER key [count] :返回集合中一个或多个元素(随机返回)
127.0.0.1:6379> smembers set
1) "value2"
2) "value3"
3) "value1"
4) "value5"
5) "value4"
6) "value6"
127.0.0.1:6379> scard set
(integer) 6
127.0.0.1:6379> srandmember set 2 // 随机返回两个元素
1) "value5"
2) "value3"
127.0.0.1:6379> srandmember set 2
1) "value1"
2) "value3"
SDIFF key1 [key2] : 返回key1set列表中key2不存在的元素(差集)
SDIFFSTORE destination key1 [key2] :返回key1set列表中在key2不存在的元素设置到destination集合中 元素为空返回0 不为空返回设置元素的个数
SINTER key1 [key2]:返回给定所有集合的交集
SINTERSTORE destination key1 [key2]:返回key1set列表中在key2存在的元素设置到destination集合中 元素为空返回0 不为空返回设置元素的个数
SUNION key1 [key2]:返回给定所有集合的并集
SUNIONSTORE destination key1 [key2]:返回key1和key2存在的元素设置到destination集合中 元素为空返回0 不为空返回设置元素的个数 (无序)
127.0.0.1:6379> sadd set1 1 3 5 7 9
(integer) 5
127.0.0.1:6379> sadd set2 2 4 6 8 10
(integer) 5
127.0.0.1:6379> sadd set3 1 2 3 4 5 6 7 8 9 10
(integer) 10
127.0.0.1:6379> sdiff set1 set2
1) "1"
2) "3"
3) "5"
4) "7"
5) "9"
127.0.0.1:6379> sdiff set2 set1
1) "2"
2) "4"
3) "6"
4) "8"
5) "10"
127.0.0.1:6379> sdiff set1 set3
(empty list or set)
127.0.0.1:6379> sdiffstore set4 set1 set2
(integer) 5
127.0.0.1:6379> sdiff set4
1) "1"
2) "3"
3) "5"
4) "7"
5) "9"
127.0.0.1:6379> sdiffstore set5 set1 set3
(integer) 0
127.0.0.1:6379> sdiff set5
(empty list or set)
127.0.0.1:6379> sinter set1 set2 // set1和set2交集为空
(empty list or set)
127.0.0.1:6379> sinter set1 set3
1) "1"
2) "3"
3) "5"
4) "7"
5) "9"
127.0.0.1:6379> sinterstore set6 set1 set3 // 将set1 set3 交集设置到set6当中
(integer) 5
127.0.0.1:6379> sdiff set6
1) "1"
2) "3"
3) "5"
4) "7"
5) "9"
127.0.0.1:6379> sadd set10 b a
(integer) 2
127.0.0.1:6379> sadd set11 f c
(integer) 2
127.0.0.1:6379> sadd set13 d e
(integer) 2
127.0.0.1:6379> sunion set10 set11 set13 // 返回结果无序
1) "c"
2) "f"
3) "b"
4) "a"
5) "d"
6) "e"
SMOVE source destination member:将 member 元素从 source 集合移动到 destination 集合 (member在source不存在返回0 存在返回1)
SPOP key :移除并返回集合中的一个随机元素 (返回被移除的元素)(集合为空返回nil)
SREM key member1 [member2] :移除集合中一个或多个成员 (返回移除成功元素的个数)
127.0.0.1:6379> sdiff set14
1) "c"
2) "f"
3) "b"
4) "a"
5) "d"
6) "e"
127.0.0.1:6379> spop set20 // key20 不存在返回nil
(nil)
127.0.0.1:6379> spop set14 // 随机移除一个元素 移除了b
"b"
127.0.0.1:6379> srem set14 a z // a在集合中 z不在集合中 z移除失败 返回移除成功的个数
(integer) 1
127.0.0.1:6379> sdiff set14
1) "d"
2) "e"
3) "c"
4) "f"
127.0.0.1:6379> smove set14 set15 z // z不在集合中 移除失败返回0
(integer) 0
127.0.0.1:6379> smove set14 set15 c // 移除成功返回1
(integer) 1