连接
- redis客户端连接,如果是本地的直接执行:redis-cli
- 如果要连接到远程服务器的即按照以下格式连接
端口号不是默认的6379需要加-p指定端口:redis-cli -h host -p port
有设置密码的需要加-a指定默认:redis-cli -h host -p port -a “password”
如果是集群的,还需要加上-c参数:redis-cli -h host -p port -c -a “password”
例:./redis-cli -h 192.168.37.11 -c -p 7006
统计redis内拥有的key的数量:[root@test11 redis-5.0.5]# ./src/redis-cli keys "*"|wc -l
字符
Redis 字符串数据类型的相关命令用于管理 redis 字符串值,基本语法如下:192.168.37.11:7003> command key_name
例:
192.168.37.11:7003> set test11 HelloWord
OK
192.168.37.11:7003> getset test11 HelloWorld
"HelloWord"
192.168.37.11:7003> get test11
"HelloWorld"
还有以下常用的字符串命令:
序号 命令及描述
1 SET key value #设置指定 key 的值
2 GET key #获取指定 key 的值
3 GETRANGE key start end #返回 key 中字符串值的子字符
4 GETSET key value #将给定 key 的值设为 value ,并返回 key 的旧值(old value)
5 GETBIT key offset #对 key 所储存的字符串值,获取指定偏移量上的位(bit)
6 MGET key1 [key2..] #获取所有(一个或多个)给定 key 的值
7 SETBIT key offset value #对key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。
8 SETEX key seconds value #将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)
9 SETNX key value #只有在 key 不存在时设置 key 的值
10 SETRANGE key offset value #用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始。
11 STRLEN key #返回 key 所储存的字符串值的长度。
12 MSET key value [key value ...] #同时设置一个或多个 key-value 对。
13 MSETNX key value [key value ...] #同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。
14 PSETEX key milliseconds value #这个命令和 SETEX 命令相似,但它以毫秒为单位设置 key 的生存时间,而不是像 SETEX 命令那样,以秒为单位
15 INCR key #将 key 中储存的数字值增一。
16 INCRBY key increment #将 key 所储存的值加上给定的增量值(increment)
17 INCRBYFLOAT key increment #将 key 所储存的值加上给定的浮点增量值(increment)
18 DECR key #将 key 中储存的数字值减一
19 DECRBY key decrement #key 所储存的值减去给定的减量值(decrement)
20 APPEND key value #如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾
哈希
Redis hash Redis hash 是一个键值对集合。是一个string类型的field和value的映射表,hash特别适合用于存储对象
我们设置了redis的一些描述信息(name, description, node, replicas) 到哈希表的 hashkey01 中,例:
192.168.37.11:7003> hmset hashkey01 name "redis cluster" description "version 5.0" node 3 replicas 2
-> Redirected to slot [8386] located at 192.168.37.11:7002
OK
192.168.37.11:7002> hgetall hashkey01
1) "name"
2) "redis cluster"
3) "description"
4) "version 5.0"
5) "node"
6) "3"
7) "replicas"
8) "2"
下表列出了 redis hash 基本的相关命令:
序号 命令及描述
1 HDEL key field2 [field2] #删除一个或多个哈希表字段
2 HEXISTS key field #查看哈希表 key 中,指定的字段是否存在
3 HGET key field #获取存储在哈希表中指定字段的值
4 HGETALL key #获取在哈希表中指定 key 的所有字段和值
5 HINCRBY key field increment #为哈希表 key 中的指定字段的整数值加上增量 increment
6 HINCRBYFLOAT key field increment #为哈希表 key 中的指定字段的浮点数值加上增量 increment
7 HKEYS key #获取所有哈希表中的字段
8 HLEN key #获取哈希表中字段的数量
9 HMGET key field1 [field2] #获取所有给定字段的值
10 HMSET key field1 value1 [field2 value2 ] #同时将多个 field-value (域-值)对设置到哈希表 key 中
11 HSET key field value #将哈希表 key 中的字段 field 的值设为 value
12 HSETNX key field value #只有在字段 field 不存在时,设置哈希表字段的值
13 HVALS key #获取哈希表中所有值
14 HSCAN key cursor [MATCH pattern] [COUNT count] #迭代哈希表中的键值对
列表
- Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)
- 一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素)
以下实例中我们使用了 LPUSH 将三个值插入了名为 listkey 的列表当中
192.168.37.11:7002> lpush listkey redis
-> Redirected to slot [15776] located at 192.168.37.11:7003
(integer) 1
192.168.37.11:7003> lpush listkey mongodb
(integer) 2
192.168.37.11:7003> lpush listkey mysql
(integer) 3
192.168.37.11:7003> lrange listkey 0 3
1) "mysql"
2) "mongodb"
3) "redis"
下表列出了redis list基本的相关命令
序号 命令及描述
01 LINSERT key BEFORE|AFTER pivot value #在列表的元素前或者后插入元素
02 LLEN key #获取列表长度
03 LPOP key #移出并获取列表的第一个元素
04 LPUSH key value1 [value2] #将一个或多个值插入到列表头部
05 LPUSHX key value #将一个或多个值插入到已存在的列表头部
06 LRANGE key start stop #获取列表指定范围内的元素,例如:lrange listkey 0 4就是从列表下标为0开始到4结束的元素
07 LREM key count value #移除列表元素,count > 0即从表头开始向表尾搜索,<0从表尾开始向表头搜索,count = 0移除表中所有与 VALUE 相等的值
08 LINDEX key index #通过索引获取列表中的元素,这里的index就是代表列表元素的下标0,1,2。。。等
09 LSET key index value #通过索引设置列表元素的值
10 LTRIM key start stop #对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
11 RPOP key #移除并获取列表最后一个元素
12 RPOPLPUSH source destination #移除列表的最后一个元素,并将该元素添加到另一个列表并返回
13 RPUSH key value1 [value2] #在列表中添加一个或多个值
14 RPUSHX key value #为已存在的列表添加值
集合
- Redis的Set是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据
- Redis 中 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)
- 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
以下实例中我们通过 SADD 命令向名为 setkey 的集合插入的三个元素:
192.168.37.11:7002> sadd setkey redis
-> Redirected to slot [2440] located at 192.168.37.11:7004
(integer) 1
192.168.37.11:7004> sadd setkey mongodb
(integer) 1
192.168.37.11:7004> sadd setkey mysql
(integer) 1
192.168.37.11:7004> sadd setkey mysql
(integer) 0
192.168.37.11:7004> smembers setkey
1) "mongodb"
2) "redis"
3) "mysql"
下表列出了redis set基本的相关命令:
序号 命令及描述
01 SADD key member1 [member2] #向集合添加一个或多个成员
02 SCARD key #获取集合的成员数
03 SDIFF key1 [key2] #返回给定所有集合的差集
04 SDIFFSTORE destination key1 [key2] #返回给定所有集合的差集并存储在 destination 中
05 SINTER key1 [key2] #返回给定所有集合的交集
06 SINTERSTORE destination key1 [key2] #返回给定所有集合的交集并存储在 destination 中
07 SISMEMBER key member #判断 member 元素是否是集合 key 的成员
08 SMEMBERS key #返回集合中的所有成员
09 SMOVE source destination member #将 member 元素从 source 集合移动到 destination 集合
10 SPOP key #移除并返回集合中的一个随机元素
11 SRANDMEMBER key [count] #返回集合中一个或多个随机数
12 SREM key member1 [member2] #移除集合中一个或多个成员
13 SUNION key1 [key2] #返回所有给定集合的并集
14 SUNIONSTORE destination key1 [key2] #所有给定集合的并集存储在 destination 集合中
15 SSCAN key cursor [MATCH pattern] [COUNT count] #迭代集合中的元素
有序集合
- Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。
- 不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
- 有序集合的成员是唯一的,但分数(score)却可以重复。
- 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 232 - 1 (4294967295, 每个集合可存储40多亿个成员)。
以下实例中我们通过命令 ZADD 向 sortedkey 的有序集合中添加了三个值并关联上分数:
192.168.37.11:7004> zadd sortedkey 1 redis
-> Redirected to slot [11273] located at 192.168.37.11:7003
(integer) 1
192.168.37.11:7003> zadd sortedkey 2 mongodb
(integer) 1
192.168.37.11:7003> zadd sortedkey 2 mysql
(integer) 1
192.168.37.11:7003> zrange sortedkey 0 5 withscores
1) "redis"
2) "1"
3) "mongodb"
4) "2"
5) "mysql"
6) "2"
192.168.37.11:7003> zadd sortedkey 3 mysql
(integer) 0
192.168.37.11:7003> zrange sortedkey 0 5 withscores
1) "redis"
2) "1"
3) "mongodb"
4) "2"
5) "mysql"
6) "3"
下表列出了redis sorted set基本的相关命令:
序号 命令及描述
01 ZADD key score1 member1 [score2 member2] #向有序集合添加一个或多个成员,或者更新已存在成员的分数
02 ZCARD key #获取有序集合的成员数
03 ZCOUNT key min max #计算在有序集合中指定区间分数的成员数
04 ZINCRBY key increment member #有序集合中对指定成员的分数加上增量 increment
05 ZINTERSTORE destination numkeys key [key ...] #计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中
06 ZLEXCOUNT key min max #在有序集合中计算指定字典区间内成员数量
07 ZRANGE key start stop [WITHSCORES] #通过索引区间返回有序集合成指定区间内的成员
08 ZRANGEBYLEX key min max [LIMIT offset count] #通过字典区间返回有序集合的成员
09 ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] #通过分数返回有序集合指定区间内的成员
10 ZRANK key member #返回有序集合中指定成员的索引
11 ZREM key member [member ...] #移除有序集合中的一个或多个成员
12 ZREMRANGEBYLEX key min max #移除有序集合中给定的字典区间的所有成员
13 ZREMRANGEBYRANK key start stop #移除有序集合中给定的排名区间的所有成员
14 ZREMRANGEBYSCORE key min max #移除有序集合中给定的分数区间的所有成员
15 ZREVRANGE key start stop [WITHSCORES] #返回有序集中指定区间内的成员,通过索引,分数从高到底
16 ZREVRANGEBYSCORE key max min [WITHSCORES] #返回有序集中指定分数区间内的成员,分数从高到低排序
17 ZREVRANK key member #返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序
18 ZSCORE key member #返回有序集中,成员的分数值
19 ZUNIONSTORE destination numkeys key [key ...] #计算给定的一个或多个有序集的并集,并存储在新的 key 中
20 ZSCAN key cursor [MATCH pattern] [COUNT count] #迭代有序集合中的元素(包括元素成员和元素分值)
数据过期
如下实例:
127.0.0.1:6379> set timeover 1122
OK
127.0.0.1:6379> ttl timeover #查看timeover的过期时间
(integer) -1 #-1代表永不过期
127.0.0.1:6379> help expire
EXPIRE key seconds
summary: Set a key's time to live in seconds
since: 1.0.0
group: generic
127.0.0.1:6379> expire timeover 5 #设置过期时间为5秒
(integer) 1
127.0.0.1:6379> ttl timeover #5秒过后再查看timeover的过期时间
(integer) -2 #-2代表这个key过期了
127.0.0.1:6379> get timeover
(nil)
发布订阅
- Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。
- Redis 客户端可以订阅任意数量的频道。
以下实例演示了发布订阅是如何工作的。在我们实例中我们创建了订阅频道名为 redisChat:
192.168.37.11:7003> subscribe redischat
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "redischat"
3) (integer) 1
现在,我们先重新开启个 redis 客户端,然后在同一个频道 redisChat 发布两次消息,订阅者就能接收到消息:
[root@test11 cluster-test]# ./redis-cli -h 192.168.37.11 -c -p 7001
192.168.37.11:7001> publish redischat "redis is quickly"
(integer) 0
192.168.37.11:7001> publish redischat "redis is good"
(integer) 0
# 刚才创建订阅者的客户端会显示如下消息:
1) "message"
2) "redischat"
3) "redis is quickly"
1) "message"
2) "redischat"
3) "redis is good"
下表列出了 redis 发布订阅常用命令:
序号 命令及描述
1 PSUBSCRIBE pattern [pattern ...] #订阅一个或多个符合给定模式的频道,例:psubscribe redis*
2 PUNSUBSCRIBE [pattern [pattern ...]] #退订所有给定模式的频道。
3 PUBSUB subcommand [argument [argument ...]] #查看订阅与发布系统状态。
- pubsub是一个查看pub/sub状态的内省命令,有以下几个用法:
- - pubsub channels[pattern]:列出当前的活跃频道;
- - pubsub numsub[channel_1....channel_n]:返回给定频道订阅者的数量;
- - pubsub numpat:返回订阅者的数量,所有客户端之和。
4 PUBLISH channel message #将信息发送到指定的频道。
5 SUBSCRIBE channel [channel ...] #订阅给定的一个或多个频道的信息。
6 UNSUBSCRIBE [channel [channel ...]] #指退订给定的频道。
Redis 事务
Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证:
- 事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
- Redis中,单条命令是原子性执行的,但事务不保证原子性,且没有回滚。事务可以理解为一个打包的批量执行脚本,事务中任意命令执行失败,其余的命令仍会被执行。
一个事务从开始到执行会经历以下三个阶段:
- 开始事务。
- 命令入队。
- 执行事务。
以下实例说明redis事务是如何工作的:
127.0.0.1:6379> set k2 v2
OK
127.0.0.1:6379> multi #标记一个事务的开始
OK
127.0.0.1:6379> set k1 11
QUEUED
127.0.0.1:6379> incr k2 #对k2值为v2进行+1
QUEUED
127.0.0.1:6379> set k3 33
QUEUED
127.0.0.1:6379> exec #执行所有事务块内的命令
1) OK
2) (error) ERR value is not an integer or out of range #这个说明了事务中存在任意命令执行失败,不影响其余的命令执行
3) OK
127.0.0.1:6379> watch k3 #开启对k3的监视,这种形式的锁被称作乐观锁,它是一种非常强大的锁机制
OK
127.0.0.1:6379> multi #标注1
OK
127.0.0.1:6379> incrby k1 10 #对k1 +10
QUEUED
127.0.0.1:6379> decrby k3 10 #对k3 -10
QUEUED
127.0.0.1:6379> exec #事务失败,因为在 WATCH 执行之后,EXEC 执行之前,有其他客户端修改了事务中的key的值,那么当前客户端的事务就会失败
(nil)
127.0.0.1:6379> get k3
"30"
127.0.0.1:6379> get k1
"11"
#这里是在开启事务后(标注1处),在新窗口执行标注2中的操作,更改balance的值
127.0.0.1:6379> get k3
"33"
127.0.0.1:6379> set k3 30 #标注2
OK
除上面用到的几个事务命令,还有下面两务相关命令:
- discard 取消事务,放弃执行事务块内的所有命令
- unwatch 取消 WATCH 命令对所有 key 的监视