注: 部分概念介绍来源于网络
一、常用管理命令
1、启动Redis
#redis-server [--port 6379]
如果命令参数过多,建议通过配置文件来启动Redis。
#redis-server [xx/xx/redis.conf]
6379是Redis默认端口号。
2、连接Redis客户端
#./redis-cli [-h 127.0.0.1 -p 6379 <-a password>]
3、停止Redis
#redis-cli shutdown
#kill redis-pid
以上两条停止Redis命令效果一样。
4、发送命令
给Redis发送命令有两种方式:
4.1、redis-cli带参数运行,如:
#redis-cli shutdown
not connected#
这样默认是发送到本地的6379端口。
4.2、redis-cli不带参数运行,如:
#./redis-cli
127.0.0.1:6379#shutdown
not connected#
5、测试连通性
127.0.0.1:6379#ping
PONG
二、key操作命令
1、获取所有键
语法:keys pattern
127.0.0.1:6379#keys *
1) "age"
查找匹配给定模式pattern的所有key。
KEYS * 匹配数据库中所有 key 。
KEYS h?llo 匹配 hello , hallo 和 hxllo 等。
KEYS h*llo 匹配 hllo 和 heeeeello 等。
KEYS h[ae]llo 匹配 hello 和 hallo ,但不匹配 hillo 。
特殊符号用 \ 隔开
2、获取键总数
语法:dbsize
127.0.0.1:6379#dbsize
(integer) 6
获取键总数时不会遍历所有的键,直接获取内部变量,时间复杂度O(1)。
3、查询键是否存在
语法:exists key [key ...]
127.0.0.1:6379#exists age java
(integer) 2
查询多个,返回存在的个数。
4、删除键
语法:del key [key ...]
127.0.0.1:6379#del java age
(integer) 1
可以删除多个,返回删除成功的个数。
5、查询键类型
语法:type key
127.0.0.1:6379#type age
string
6、移动键
语法:move key db
如把age移到2号数据库。
127.0.0.1:6379#move age 2
(integer) 1
127.0.0.1:6379#select 2
OK
语法:SELECT index
切换数据库(redis默认16个数据库 编号从0开始)
127.0.0.1:6379[2]#keys *
1) "age"
7、查询key的生命周期(秒)
秒语法:ttl key
毫秒语法:pttl key
127.0.0.1:6379[2]#ttl age
(integer) -1
-1:永远不过期。
8、设置过期时间
秒语法:expire key seconds
毫秒语法:pexpire key milliseconds
127.0.0.1:6379[2]#expire age 60
(integer) 1
127.0.0.1:6379[2]#ttl age
(integer) 55
设置永不过期
语法:persist key
127.0.0.1:6379[2]#persist age
(integer) 1
9、更改键名称
语法:rename key newkey
127.0.0.1:6379[2]#rename age age123
OK
三、字符串操作命令
字符串是Redis中最基本的数据类型,单个数据能存储的最大空间是512M。
1、存放键值
语法:set key value [EX seconds] [PX milliseconds] [NX|XX]
nx:如果key不存在则建立,xx:如果key存在则修改其值,也可以直接使用setnx/setex命令。
127.0.0.1:6379#set age 666
OK
2、获取键值
语法:get key
127.0.0.1:6379#get age
"666"
3、值递增/递减
如果字符串中的值是数字类型的,可以使用incr命令每次递增,不是数字类型则报错。
语法:incr key
127.0.0.1:6379#incr age
(integer) 667
一次想递增N用incrby命令,如果是浮点型数据可以用incrbyfloat命令递增。
同样,递减使用decr、decrby命令。
4、批量存放键值
语法:mset key value [key value ...]
127.0.0.1:6379#mset java1 1 java2 2 java3 3
OK
获取键值
语法:mget key [key ...]
127.0.0.1:6379#mget java1 java2
1) "1"
2) "2"
Redis接收的是UTF-8的编码,如果是中文一个汉字将占3位返回。
5、获取值长度
语法:strlen key
127.0.0.1:6379#strlen age
(integer) 3
6、追加内容
语法:append key value
127.0.0.1:6379#append age hi
(integer) 5
向键值尾部添加,如上命令执行后由666变成666hi
7、获取部分字符
语法:getrange key start end
#127.0.0.1:6379#getrange age 0 4
"javas"
四、散列/哈希(Hash)操作命令
redis字符串类型键和值是字典结构形式,这里的散列类型其值也可以是字典结构。
Redis hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。
hash使我们最常用的,因为他可以存储对象,字典等。hash里面是一个string类型的key value映射集合,每一个都叫做域。
同时将多个 field-value (域-值)对设置到哈希表 key 中
1、存放键值
单个语法:hset key field value
127.0.0.1:6379#hset user name age
(integer) 1
多个语法:hmset key field value [field value ...]
127.0.0.1:6379#hmset user name age age 20 address china
OK
不存在时语法:hsetnx key field value
127.0.0.1:6379#hsetnx user tall 180
(integer) 0
2、获取字段值
单个语法:hget key field
127.0.0.1:6379#hget user age
"20"
多个语法:hmget key field [field ...]
127.0.0.1:6379#hmget user name age address
1) "age"
2) "20"
3) "china"
3、获取所有键与值语法:hgetall key
127.0.0.1:6379#hgetall user
1) "name"
2) "age"
3) "age"
4) "20"
5) "address"
6) "china"
在返回值里,紧跟每个域名(field name)之后是域的值(value),所以返回值的长度是哈希表大小的两倍
4、获取所key 中的所有域语法:hkeys key
127.0.0.1:6379#hkeys user
1) "name"
2) "address"
3) "tall"
4) "age"
5、获取所有值语法:hvals key
127.0.0.1:6379#hvals user
1) "age"
2) "china"
3) "170"
4) "20"
6、判断域是否存在
语法:hexists key field
127.0.0.1:6379#hexists user address
(integer) 1
如果哈希表含有给定域,返回 1 。
如果哈希表不含有给定域,或 key 不存在,返回 0 。
7、获取字段数量
语法:hlen key
127.0.0.1:6379#hlen user
(integer) 4
8、递增/减
语法:hincrby key field increment
127.0.0.1:6379#hincrby user tall -10
(integer) 170
9、删除字段
语法:hdel key field [field ...]
127.0.0.1:6379#hdel user age
(integer) 1
10、HINCRBY key field increment
为哈希表 key 中的域 field 的值加上增量 increment 。
增量也可以为负数,相当于对给定域进行减法操作。
如果 key 不存在,一个新的哈希表被创建并执行 HINCRBY 命令。
如果域 field 不存在,那么在执行命令前,域的值被初始化为 0 。
11、HINCRBYFLOAT key field increment
为哈希表 key 中的域 field 加上浮点数增量 increment 。
如果哈希表中没有域 field ,那么 HINCRBYFLOAT 会先将域 field 的值设为 0 ,然后再执行加法操作。
如果键 key 不存在,那么 HINCRBYFLOAT 会先创建一个哈希表,再创建域 field ,最后再执行加法操作。
五、列表操作命令
列表类型是一个有序的字段串列表,内部是使用双向链表实现,所有可以向两端操作元素,获取两端的数据速度快,通过索引到具体的行数比较慢。
列表类型的元素是有序且可以重复的。
1、存储值
左端存值语法:lpush key value [value ...]
127.0.0.1:6379#lpush number 1 2 3 4
(integer) 4
右端存值语法:rpush key value [value ...]
127.0.0.1:6379#rpush number 5 6 7 8
(integer) 8
2、索引存值
语法:lset key index value
127.0.0.1:6379#lset number 4 10
OK
3、弹出元素
左端弹出语法:lpop key
127.0.0.1:6379#lpop number
4
右端弹出语法:rpop key
127.0.0.1:6379#rpop number
8
4、获取元素个数
语法:llen key
127.0.0.1:6379#llen number
(integer) 6
5、获取列表元素
查看范围段的value。(可以用来分页)
两边获取语法:lrange key start stop
127.0.0.1:6379#lrange number 0 3
1) "3"
2) "2"
3) "1"
4) "10"
6、获取所有
127.0.0.1:6379#lrange number 0 -1
1) "3"
2) "2"
3) "1"
4) "10"
5) "6"
6) "7"
7、从右端索引
127.0.0.1:6379#lrange number -3 -1
1) "10"
2) "6"
3) "7"
8、索引获取语法:lindex key index
127.0.0.1:6379#lindex number 3
"10"
9、从右端获取
127.0.0.1:6379#lindex number -4
"1"
10、删除元素
根据值删除语法:lrem key count value
// count #0 从左端删除前count个
127.0.0.1:6379#lrem number 4 2
(integer) 4
// count < 0 从右端删除前count个
127.0.0.1:6379#lrem number -3 2
(integer) 3
// count=0 删除所有
127.0.0.1:6379#lrem number 0 2
(integer) 5
范围删除语法:ltrim key start stop
// 只保留1-2之间的元素
127.0.0.1:6379#ltrim list 1 2
OK
11、RPOPLPUSH source destination
移除列表的最后一个元素,并将该元素添加到另一个列表并返回
12、BRPOPLPUSH source destination timeout
从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
13、LINSERT key BEFORE|AFTER pivot value
将值 value 插入到列表 key 当中,位于值 pivot 之前或之后。
当 pivot 不存在于列表 key 时,不执行任何操作。多个pivot时只操作第一个。
当 key 不存在时, key 被视为空列表,不执行任何操作。
如果 key 不是列表类型,返回一个错误。
14、BLPOP key1 [key2 ] timeout
移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
15、BRPOP key1 [key2 ] timeout
移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
六、集合操作命令
集合类型和列表类型相似,只不过是集合是无序且不可重复的。
1、集合存储值
语法:sadd key member [member ...]
// 这里有9个值(2个java),只存了8个
127.0.0.1:6379#sadd strings java python shell C c++ Linux go elasticsearch java
(integer) 8
2、获取元素
获取所有元素语法:smembers key
127.0.0.1:6379#smembers strings
1) "shell"
2) "C"
3) "c++"
4) "go"
5) "Linux"
6) "python"
7) "java"
8) "elasticsearch"
3、随机获取语法:srandmember strings count
127.0.0.1:6379#srandmember strings 3
1) "c++"
2) "java"
3) "elasticsearch"
如果命令执行时,只提供了 key 参数,那么返回集合中的一个随机元素。
如果 count 为正数,且小于集合基数,那么命令返回一个包含 count 个元素的数组,数组中的元素各不相同。如果 count 大于等于集合基数,那么返回整个集合。
如果 count 为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count 的绝对值。
该操作和 SPOP 相似,但 SPOP 将随机元素从集合中移除并返回,而 SRANDMEMBER 则仅仅返回随机元素,而不对集合进行任何改动。
4、判断集合是否存在元素,返回1 表示存在 0表示不存在。
语法:sismember key member
127.0.0.1:6379#sismember strings go
(integer) 1
5、获取集合元素个数
语法:scard key
127.0.0.1:6379#scard strings
(integer) 8
6、删除集合元素
语法:srem key member [member ...]
127.0.0.1:6379#srem strings Linux elasticsearch
(integer) 2
7、弹出元素
语法:spop key [count]
127.0.0.1:6379#spop strings 2
1) "go"
2) "java"
移除并返回集合中的一个随机元素。
如果只想获取一个随机元素,但不想该元素从集合中被移除的话,可以使用 SRANDMEMBER 命令。
8、SMOVE source destination member
将 member 元素从 source 集合移动到 destination 集合。
SMOVE 是原子性操作。
如果 source 集合不存在或不包含指定的 member 元素,则 SMOVE 命令不执行任何操作,仅返回 0 。否则, member 元素从 source 集合中被移除,并添加到 destination 集合中去。
当 destination 集合已经包含 member 元素时, SMOVE 命令只是简单地将 source 集合中的 member 元素删除。
当 source 或 destination 不是集合类型时,返回一个错误。
集合运算
9、SDIFF key [key ...]
返回一个集合的全部成员,该集合是所有给定集合之间的差集。返回给定所有集合的差集
10、SDIFFSTORE destination key [key ...]
这个命令的作用和 SDIFF 类似,但它将结果保存到 destination 集合,而不是简单地返回结果集。
如果 destination 集合已经存在,则将其覆盖。
destination 可以是 key 本身。(如果destination不存在 则新建一个)
11、SINTER key [key ...]
返回一个集合的全部成员,该集合是所有给定集合的交集。
不存在的 key 被视为空集。
当给定集合当中有一个空集时,结果也为空集(根据集合运算定律)。
12、SDIFFSTORE destination key [key ...]
这个命令的作用和 SDIFF 类似,但它将结果保存到 destination 集合,而不是简单地返回结果集。
如果 destination 集合已经存在,则将其覆盖。
destination 可以是 key 本身。
13、SUNION key [key ...]
返回一个集合的全部成员,该集合是所有给定集合的并集。
不存在的 key 被视为空集。
14、SUNIONSTORE destination key [key ...]
这个命令类似于 SUNION 命令,但它将结果保存到 destination 集合,而不是简单地返回结果集。
如果 destination 已经存在,则将其覆盖。
destination 可以是 key 本身。
15、SSCAN key cursor [MATCH pattern] [COUNT count]
迭代集合中的元素
七、有序集合和列表的区别:
1、列表使用链表实现,两头快,中间慢。有序集合是散列表和跳跃表实现的,即使读取中间的元素也比较快。
2、列表不能调整元素位置,有序集合能。
3、有序集合比列表更占内存。
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
有序集合的成员是唯一的,但分数(score)却可以重复。
1、存储值
语法:zadd key [NX|XX] [CH] [INCR] score member [score member ...]
127.0.0.1:6379#zadd key 16011 tid 20082 huny 2893 nosy
(integer) 3
2、获取元素分数
语法:zscore key member
127.0.0.1:6379#zscore key tid
"16011"
如果 tid 元素不是有序集 key 的成员,或 key 不存在,返回 nil 。
3、获取排名范围排名语法:zrange key start stop [WITHSCORES]
// 获取所有,没有分数
127.0.0.1:6379#zrange key 0 -1
1) "nosy"
2) "tid"
3) "huny"
// 获取所有及分数
127.0.0.1:6379#zrange key 0 -1 Withscores
1) "nosy"
2) "2893"
3) "tid"
4) "16011"
5) "huny"
6) "20082"
这个可以用来做分页。
通过索引区间返回有序集合成指定区间内的成员。
返回有序集 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 的格式表示。
客户端库可能会返回一些更复杂的数据类型,比如数组、元组等。
4、ZREVRANGE key start stop [WITHSCORES]
可以做分页
返回有序集 key 中,指定区间内的成员。
其中成员的位置按 score 值递减(从大到小)来排列。
具有相同 score 值的成员按字典序的逆序(reverse lexicographical order)排列。
除了成员按 score 值递减的次序排列这一点外, ZREVRANGE 命令的其他方面和 ZRANGE 命令一样。
5、获取指定分数范围排名语法:zrangebyscore key min max [WITHSCORES] [LIMIT offset count]
127.0.0.1:6379#zrangebyscore key 3000 30000 withscores limit 0 1
1) "tid"
2) "16011"
返回有序集 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 版本起可用。
6、增加指定元素分数
语法:zincrby key increment member
127.0.0.1:6379#zincrby key 2000 tid
"18011"
为有序集 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 值可以是整数值或双精度浮点数。
7、获取集合元素个数
语法:zcard key
127.0.0.1:6379#zcard key
(integer) 3
8、获取指定范围分数个数
语法:zcount key min max
127.0.0.1:6379#zcount key 2000 20000
(integer) 2
9、删除指定元素
语法:zrem key member [member ...]
127.0.0.1:6379#zrem key huny
(integer) 1
10、获取元素排名
语法:zrank key member
127.0.0.1:6379#zrank key tid
(integer) 1
使用 ZREVRANK 命令可以获得成员按 score 值递减(从大到小)排列的排名。
11、ZREVRANK key member
返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递减(从大到小)排序。
排名以 0 为底,也就是说, score 值最大的成员排名为 0 。
使用 ZRANK 命令可以获得成员按 score 值递增(从小到大)排列的排名。
12、ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]
返回有序集 key 中, score 值介于 max 和 min 之间(默认包括等于 max 或 min )的所有的成员。有序集成员按 score 值递减(从大到小)的次序排列。
具有相同 score 值的成员按字典序的逆序(reverse lexicographical order )排列。
除了成员按 score 值递减的次序排列这一点外, ZREVRANGEBYSCORE 命令的其他方面和 ZRANGEBYSCORE 命令一样。
13、ZLEXCOUNT KEY MIN MAX
计算有序集合中指定字典区间内成员数量。
14、ZREMRANGEBYRANK key start stop
移除有序集 key 中,指定排名(rank)区间内的所有成员。
区间分别以下标参数 start 和 stop 指出,包含 start 和 stop 在内。
下标参数 start 和 stop 都以 0 为底,也就是说,以 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。
你也可以使用负数下标,以 -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推。
15、ZREMRANGEBYSCORE key min max
移除有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。
自版本2.1.6开始, score 值等于 min 或 max 的成员也可以不包括在内,详情请参见 ZRANGEBYSCORE 命令。
下面 集合运算
16、ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
计算给定的一个或多个有序集的交集,其中给定 key 的数量必须以 numkeys 参数指定,并将该交集(结果集)储存到 destination 。
默认情况下,结果集中某个成员的 score 值是所有给定集下该成员 score 值之和.
关于 WEIGHTS 和 AGGREGATE 选项的描述,参见 ZUNIONSTORE 命令。
17、ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE SUM|MIN|MAX]
计算给定的一个或多个有序集的并集,其中给定 key 的数量必须以 numkeys 参数指定,并将该并集(结果集)储存到 destination 。
默认情况下,结果集中某个成员的 score 值是所有给定集下该成员 score 值之 和 。
18、WEIGHTS
使用 WEIGHTS 选项,你可以为 每个 给定有序集 分别 指定一个乘法因子(multiplication factor),每个给定有序集的所有成员的 score 值在传递给聚合函数(aggregation function)之前都要先乘以该有序集的因子
如果没有指定 WEIGHTS 选项,乘法因子默认设置为 1 。
19、AGGREGATE
使用 AGGREGATE 选项,你可以指定并集的结果集的聚合方式。
默认使用的参数 SUM ,可以将所有集合中某个成员的 score 值之 和 作为结果集中该成员的 score 值;使用参数 MIN ,可以将所有集合中某个成员的 最小 score 值作为结果集中该成员的 score 值;而参数 MAX 则是将所有集合中某个成员的 最大 score 值作为结果集中该成员的 score 值。