Redis学习
0.基础操作
清空当前数据库所有key&value
127.0.0.1:6379>flushdb
清空所有数据库所有key&value
127.0.0.1:6379>flushall
返回当前数据库key的数量
127.0.0.1:6379>dbsize
实时打印出 Redis 服务器接收到的命令,调试用
127.0.0.1:6379>monitor
1.字符串基本操作
//直接赋值
127.0.0.1:6379> set company imoc
//获得值
127.0.0.1:6379> get company
"imoc"
//先获取值,再赋值
127.0.0.1:6379> getset company baidu
"imoc"
127.0.0.1:6379> get company
"baidu"
//删除key
127.0.0.1:6379> del person
/*
数值自增(如果这个值不存在就设置初始值为0,再加1)
如果这个值不是数值就会报错
*/
127.0.0.1:6379> incr num
1
/*
数值自减(如果这个值不存在就设置初始值为0,再减1)
如果这个值不是数值就会报错
*/
127.0.0.1:6379> decr num
0
/*
指定增加
*/
127.0.0.1:6379> incrby num 5
5
/*
指定减少
*/
127.0.0.1:6379> decrby num 3
2
/*
在指定值后面拼接字符串
*/
127.0.0.1:6379> append num 5
2 (这里返回的是字符串长度)
127.0.0.1:6379> get num
"35"
2.存储hash
每一个hash可以存储 2^32-1 个键值对
hashset赋值(myhash 是指 key, username 是具体filed,jack是指value )
127.0.0.1:6379> hset myhash username jack
127.0.0.1:6379> hget myhash username
"jack"
设置多个hashset
127.0.0.1:6379> hmset website google www.google.com yahoo www.yahoo.com
127.0.0.1:6379> hget website google
"www.google.com"
127.0.0.1:6379> hget website yahoo
"www.yahoo.com"
获取全部值
127.0.0.1:6379> hgetall website
1) "google"
2) "www.google.com"
3) "yahoo"
4) "www.yahoo.com"
删除单个或多个
127.0.0.1:6379> hdel website google yahoo
2
删除整个集合
127.0.0.1:6379> del website
1
给hash自增数据
127.0.0.1:6379> hincrby myhash age 5
5
127.0.0.1:6379> hget myhash age
"5"
判断hash中的域field是否存在(存在返回1,不存在返回0)
127.0.0.1:6379> hexists myhash age
1
返回哈希表 key 中,所有的域和值。
127.0.0.1:6379> hgetall myhash
1
返回哈希表中域的数量
127.0.0.1:6379> hlen myhash
2
返回哈希表key 中所有的field
127.0.0.1:6379> hkeys myhash
1) "username"
2) "age"
返回哈希表key 中所有的value
127.0.0.1:6379> hvals myhash
1) "username"
2) "age"
3.存储List
在redis中,list是按照插入顺序排序的一种链表,头部是左侧,尾部是右侧,进行插入,也就是头尾部的数据插入将会非常快。
List容量也是2^32-1个元素。有三种方式存储数据
1.ArrayList
2.linkedList
3.双向链表
链表头部开始添加
127.0.0.1:6379> lpush mylist a b c (链表形式 : c - b - a)
3
127.0.0.1:6379> lpush mylist 1 2 3
6
链表尾部开始添加
127.0.0.1:6379> rpush mylist2 a b c (链表形式 : a - b - c)
3
查看列表
127.0.0.1:6379> lrange mylist 0 5
1) "3"
2) "2"
3) "1"
4) "c"
5) "b"
6) "a"
127.0.0.1:6379> lrange mylist 0 -1
1) "3"
2) "2"
3) "1"
4) "c"
5) "b"
6) "a"
127.0.0.1:6379> lrange mylist 0 -2
1) "3"
2) "2"
3) "1"
4) "c"
5) "b"
移除并返回列表 key 的头元素
127.0.0.1:6379> lpop mylist
"3"
返回列表 key 的长度
127.0.0.1:6379> llen mylist
5
lpushx 将值 value 插入到列表 key 的表头,当且仅当 key 存在并且是一个列表。和 LPUSH 命令相反,当 key 不存在时, LPUSHX 命令什么也不做
127.0.0.1:6379> lpushx mylistkey 1 2 3
0
127.0.0.1:6379> rpushx mylistkey 1 2 3
0
lrem 根据参数 count 的值,移除列表中与参数 value 相等的元素
- count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count
- count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。
- count = 0 : 移除表中所有与 value 相等的值。
127.0.0.1:6379> lrange mylistkey 0 -1
1) "3"
2) "2"
3) "1"
4) "3"
5) "2"
6) "1"
7) "3"
8) "2"
9) "1"
127.0.0.1:6379> lrem mylistkey 2 3
(integer) 2
127.0.0.1:6379> lrange mylistkey 0 -1
1) "2"
2) "1"
3) "2"
4) "1"
5) "3"
6) "2"
7) "1"
127.0.0.1:6379> lrem mylistkey -2 1
(integer) 2
127.0.0.1:6379> lrange mylistkey 0 -1
1) "2"
2) "1"
3) "2"
4) "3"
5) "2"
127.0.0.1:6379> lrem mylistkey 0 2
(integer) 3
127.0.0.1:6379> lrange mylistkey 0 -1
1) "1"
2) "3"
lset 将列表 key 下标为 index 的元素的值设置为 value 。当 index 参数超出范围,或对一个空列表( key 不存在)进行 LSET 时,返回一个错误。(下标从0开始)
127.0.0.1:6379> lrange mylistkey 0 -1
1) "1"
2) "3"
127.0.0.1:6379> lset mylistkey 2 mmm
(error) ERR index out of range
127.0.0.1:6379> lset mylistkey 1 mmm
OK
127.0.0.1:6379> lrange mylistkey 0 -1
1) "1"
2) "mmm"
linsert 将值 value 插入到列表 key 当中,位于值 pivot 之前或之后。
- 当 pivot 不存在于列表 key 时,不执行任何操作。
- 当 key 不存在时, key 被视为空列表,不执行任何操作。
- 如果 key 不是列表类型,返回一个错误。
127.0.0.1:6379> lrange mylistkey 0 -1
1) "4"
2) "3"
3) "2"
4) "1"
5) "mmm"
127.0.0.1:6379> linsert mylistkey before mmm aaa
(integer) 6
127.0.0.1:6379> lrange mylistkey 0 -1
1) "4"
2) "3"
3) "2"
4) "1"
5) "aaa"
6) "mmm"
127.0.0.1:6379> linsert mylistkey after mmm bbb
(integer) 7
127.0.0.1:6379> lrange mylistkey 0 -1
1) "4"
2) "3"
3) "2"
4) "1"
5) "aaa"
6) "mmm"
7) "bbb"
127.0.0.1:6379> get num1
"1"
127.0.0.1:6379> linsert num1 before aaa bbb
(error) WRONGTYPE Operation against a key holding the wrong kind of value
命令 RPOPLPUSH 在一个原子时间内,执行以下两个动作:
- 将列表 source 中的最后一个元素(尾元素)弹出,并返回给客户端。
- 将 source 弹出的元素插入到列表 destination ,作为 destination 列表的的头元素。
127.0.0.1:6379> lpush mylist1 1 2 3
(integer) 3
127.0.0.1:6379> lpush mylist2 a b c
(integer) 3
127.0.0.1:6379> lrange mylist1 0 -1
1) "3"
2) "2"
3) "1"
127.0.0.1:6379> lrange mylist2 0 -1
1) "c"
2) "b"
3) "a"
127.0.0.1:6379> rpoplpush mylist1 mylist2
"1"
127.0.0.1:6379> lrange mylist2 0 -1
1) "1"
2) "c"
3) "b"
4) "a"
127.0.0.1:6379> lrange mylist1 0 -1
1) "3"
2) "2"
4.存储Set
sadd 将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。假如 key 不存在,则创建一个只包含 member 元素作成员的集合。当 key 不是集合类型时,返回一个错误
127.0.0.1:6379> sadd myset a b c
(integer) 3
srem 移除集合 key 中的一个或多个 member 元素,不存在的 member 元素会被忽略。当 key 不是集合类型,返回一个错误
127.0.0.1:6379> sadd myset a b c
(integer) 3
127.0.0.1:6379> sadd myset a b c
(integer) 3
127.0.0.1:6379> srem myset a b
(integer) 2
smembers 返回集合 key 中的所有成员
127.0.0.1:6379> smembers myset
1) "c"
sismember 判断 member 元素是否集合 key 的成员
127.0.0.1:6379> sismember myset a
(integer) 0
127.0.0.1:6379> sismember myset c
(integer) 1
sdiff 返回一个集合的全部成员,该集合是所有给定集合之间的差集。不存在的 key 被视为空集。(跟key的顺序有关系:既key1里有的,key2里没有的)
127.0.0.1:6379> sadd mya1 a b c
(integer) 3
127.0.0.1:6379> sadd myb1 c d 3 2
(integer) 4
127.0.0.1:6379> sdiff mya1 myb1
1) "a"
2) "b"
127.0.0.1:6379> sdiff myb1 mya1
1) "3"
2) "2"
3) "d"
127.0.0.1:6379> sadd myc1 c e f
(integer) 3
127.0.0.1:6379> sdiff myc1 mya1 myb1
1) "f"
2) "e"
sinter 返回一个集合的全部成员,该集合是所有给定集合的交集。不存在的 key 被视为空集。当给定集合当中有一个空集时,结果也为空集(根据集合运算定律)。
127.0.0.1:6379> sinter mya1 myb1 myc1
1) "c"
sunion 返回一个集合的全部成员,该集合是所有给定集合的并集。不存在的 key 被视为空集。
127.0.0.1:6379> sunion mya1 myb1 myc1
1) "f"
2) "3"
3) "c"
4) "a"
5) "2"
6) "e"
7) "b"
8) "d"
scard 返回集合 key 的基数(集合中元素的数量)。
127.0.0.1:6379> scard mya1
(integer) 3
srandmember 如果命令执行时,只提供了 key 参数,那么返回集合中的一个随机元素。
从 Redis 2.6 版本开始, SRANDMEMBER 命令接受可选的 count 参数:
如果 count 为正数,且小于集合基数,那么命令返回一个包含 count 个元素的数组,数组中的元素各不相同。
如果 count 大于等于集合基数,那么返回整个集合。
如果 count 为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count 的绝对值。
该操作和 SPOP 相似,但 SPOP 将随机元素从集合中移除并返回,而 SRANDMEMBER 则仅仅返回随机元素,而不对集合进行任何改动。
127.0.0.1:6379> srandmember mya1
"b"
127.0.0.1:6379> srandmember mya1 2
1) "a"
2) "b"
127.0.0.1:6379> srandmember mya1 -4
1) "a"
2) "a"
3) "b"
4) "b"
127.0.0.1:6379> srandmember mya1 -8
1) "b"
2) "b"
3) "b"
4) "b"
5) "a"
6) "c"
7) "b"
8) "a"
sdiffstore 这个命令的作用和 SDIFF 类似,但它将结果保存到 destination 集合,而不是简单地返回结果集。如果 destination 集合已经存在,则将其覆盖。destination 可以是 key 本身。
127.0.0.1:6379> smembers mya1
1) "c"
2) "a"
3) "b"
127.0.0.1:6379> smembers myb1
1) "3"
2) "2"
3) "c"
4) "d"
127.0.0.1:6379> smembers myc1
1) "f"
2) "c"
3) "e"
127.0.0.1:6379> sdiffstore myd1 mya1 myb1 myc1
(integer) 2
127.0.0.1:6379> smembers myd1
1) "a"
2) "b"
sinterstore 这个命令类似于 SINTER 命令,但它将结果保存到 destination 集合,而不是简单地返回结果集。如果 destination 集合已经存在,则将其覆盖。destination 可以是 key 本身。
127.0.0.1:6379> sinterstore mye1 mya1 myb1 myc1
(integer) 1
127.0.0.1:6379> smembers mye1
1) "c"
sunionstore 这个命令类似于 SUNION 命令,但它将结果保存到 destination 集合,而不是简单地返回结果集。如果 destination 已经存在,则将其覆盖。destination 可以是 key 本身。
127.0.0.1:6379> sunionstore myf1 mya1 myb1 myc1
(integer) 8
127.0.0.1:6379> smembers myf1
1) "f"
2) "3"
3) "c"
4) "a"
5) "2"
6) "e"
7) "b"
8) "d"
5.存储zset
zadd 将一个或多个 member 元素及其 score 值加入到有序集 key 当中。
如果某个 member 已经是有序集的成员,那么更新这个 member 的 score 值,并通过重新插入这个 member 元素,来保证该 member 在正确的位置上。
score 值可以是整数值或双精度浮点数。
如果 key 不存在,则创建一个空的有序集并执行 ZADD 操作。当 key 存在但不是有序集类型时,返回一个错误。
127.0.0.1:6379> zadd mysort 20 a1 30 a2 40 a3
(integer) 3
zrem 移除有序集 key 中的一个或多个成员,不存在的成员将被忽略。当 key 存在但不是有序集类型时,返回一个错误。
127.0.0.1:6379> zrem mysort a1
(integer) 1
zcard 返回有序集 key 的基数。
127.0.0.1:6379> zcard mysort
(integer) 2
zrange 返回有序集 key 中,指定区间内的成员。
- 其中成员的位置按 score 值递增(从小到大)来排序。
- 具有相同 score 值的成员按字典序(lexicographical order )来排列。
- 如果你需要成员按 score 值递减(从大到小)来排列,请使用 ZREVRANGE 命令。
- 下标参数 start 和 stop 都以 0 为底,也就是说,以 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。
- 你也可以使用负数下标,以 -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推。
- 超出范围的下标并不会引起错误。
- 比如说,当 start 的值比有序集的最大下标还要大,或是 start > stop 时, ZRANGE 命令只是简单地返回一个空列表。
- 另一方面,假如 stop 参数的值比有序集的最大下标还要大,那么 Redis 将 stop 当作最大下标来处理。
- 可以通过使用 WITHSCORES 选项,来让成员和它的 score 值一并返回,返回列表以 value1,score1, ..., valueN,scoreN 的格式表示。
- 客户端库可能会返回一些更复杂的数据类型,比如数组、元组等。
127.0.0.1:6379> zrange mysort 0 -1
1) "a2"
2) "a3"
127.0.0.1:6379> zrange mysort 0 -1 withscores
1) "a2"
2) "30"
3) "a3"
4) "40"
127.0.0.1:6379> zrevrange mysort 0 -1 withscores
1) "a3"
2) "40"
3) "a2"
4) "30"
zremrangebyrank 移除有序集 key 中,指定排名(rank)区间内的所有成员。
区间分别以下标参数 start 和 stop 指出,包含 start 和 stop 在内。
下标参数 start 和 stop 都以 0 为底,也就是说,以 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。
你也可以使用负数下标,以 -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推。
127.0.0.1:6379> zrange mysort 0 -1 withscores
1) "a2"
2) "30"
3) "a3"
4) "40"
5) "a4"
6) "50"
7) "a8"
8) "60"
127.0.0.1:6379> zremrangebyrank mysort 0 3
(integer) 4
127.0.0.1:6379> zrange mysort 0 -1 withscores
(empty list or set)
zremrangebyscore 移除有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。
自版本2.1.6开始, score 值等于 min 或 max 的成员也可以不包括在内,详情请参见 ZRANGEBYSCORE 命令。
127.0.0.1:6379> zrange mysort 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> zremrangebyscore mysort 1 3
(integer) 3
127.0.0.1:6379> zrange mysort 0 -1
1) "d"
2) "e"
zrangebyscore 返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列。
具有相同 score 值的成员按字典序(lexicographical order)来排列(该属性是有序集提供的,不需要额外的计算)。
可选的 LIMIT 参数指定返回结果的数量及区间(就像SQL中的 SELECT LIMIT offset, count ),注意当 offset 很大时,定位 offset 的操作可能需要遍历整个有序集,此过程最坏复杂度为 O(N) 时间。
可选的 WITHSCORES 参数决定结果集是单单返回有序集的成员,还是将有序集成员及其 score 值一起返回。
该选项自 Redis 2.0 版本起可用。区间及无限 min 和 max 可以是 -inf 和 +inf ,这样一来,你就可以在不知道有序集的最低和最高 score 值的情况下,使用 ZRANGEBYSCORE 这类命令。
默认情况下,区间的取值使用闭区间 (小于等于或大于等于),你也可以通过给参数前增加 ( 符号来使用可选的开区间 (小于或大于)。
127.0.0.1:6379> zrange mysort 0 -1 withscores
1) "d"
2) "4"
3) "e"
4) "5"
5) "aa"
6) "6"
7) "bb"
8) "7"
9) "dd"
10) "8"
127.0.0.1:6379> zrangebyscore mysort 5 7
1) "e"
2) "aa"
3) "bb"
127.0.0.1:6379> zrangebyscore mysort (5 7
1) "aa"
2) "bb"
127.0.0.1:6379> zrangebyscore mysort 5 7 limit 0 1
1) "e"
zincrby 为有序集 key 的成员 member 的 score 值加上增量 increment 。
可以通过传递一个负数值 increment ,让 score 减去相应的值,比如 ZINCRBY key -5 member ,就是让 member 的 score 值减去 5 。
当 key 不存在,或 member 不是 key 的成员时, ZINCRBY key increment member 等同于 ZADD key increment member 。
当 key 不是有序集类型时,返回一个错误。score 值可以是整数值或双精度浮点数。
127.0.0.1:6379> zrange mysort 0 -1 withscores
1) "d"
2) "4"
3) "e"
4) "5"
5) "aa"
6) "6"
7) "bb"
8) "7"
9) "dd"
10) "8"
127.0.0.1:6379> zincrby mysort 10 aa
"16"
zscore 返回有序集 key 中,成员 member 的 score 值。如果 member 元素不是有序集 key 的成员,或 key 不存在,返回 nil
127.0.0.1:6379> zscore mysort dd
"8"
zcount 返回有序集 key 中, score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max )的成员的数量。
127.0.0.1:6379> zcount mysort 5 17
(integer) 4
6.keys 操作
127.0.0.1:6379> keys *
1) "mysort"
127.0.0.1:6379> keys my?
(empty list or set)
127.0.0.1:6379> keys *
1) "mysort"
127.0.0.1:6379> keys my*
1) "mysort"
127.0.0.1:6379> del mysort
(integer) 1
127.0.0.1:6379> exists my1
(integer) 0
127.0.0.1:6379> set mycompany aaa
OK
127.0.0.1:6379> get mycompany
"aaa"
127.0.0.1:6379> rename mycompany com
OK
127.0.0.1:6379> get com
"aaa"
127.0.0.1:6379> expire com 2000
(integer) 1
127.0.0.1:6379> ttl com
(integer) 1993
127.0.0.1:6379> type com
string
redis 特性
数据移库
127.0.0.1:6379> set aaa bbb
OK
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> keys *
(empty list or set)
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> move aaa 1
(integer) 1
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> get aaa
"bbb"