Redis 基础命令

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"
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343