共计 6612 个字符,预计需要花费 17 分钟才能阅读完成。
上图中即为 redis 中 5 种基本数据类型,在没接触过 redis 之前,听过最多相关的字眼就是键值对 key-value 之类,立马让我想到了 HashMap。在 HashMap 中,key 和 value 的的数据类型都可以指定,value 也可以是 HashMap 类型。而在这里,redis 的基本数据类型是针对的 value,有这 5 种。
文中所用测试记录环境在 Linux 下,命令操作在 SSH 客户端下,这里使用的是 Xshell 5,个人使用感觉很方便,同一系列的 Xftp 5 用于远程文件上传操作也很不错。如有需要,可直接进入官网下载,有免费版本(Free for Home/School), 传送门 http://www.linuxidc.com/Linux/2017-03/142010.htm。
一、字符串 (String) 常用命令
1 SET key value
设置指定 key 的值
2 GET key
获取指定 key 的值
3 GETRANGE key start end
返回 key 中字符串值的子字符串(这里的 start 和 end 即起始子字符的索引,例如字符串 abcde, 取 1 至 3,即拿到 bcd,索引从 0 开始计数)
4 GETSET key value
将给定 key 的值设为 value,并返回 key 的旧值
5 MSET key value [key value …]
同时设置一个或多个 key-value 对。(对比 MGET)
6 MGET key1 [key2..]
获取所有 (一个或多个) 给定 key 的值。(这里的 M 可以记忆为 Many,许多的意思,便于理解)
7 SETEX key seconds value
将值 value 关联到 key,并将 key 的过期时间设为 seconds (以秒为单位)。
8 SETNX key value
只有在 key 不存在时设置 key 的值。(这里的 SETNX,后面的 NX,个人记忆为 Not Exists,不存在的)
9 MSETNX key value [key value …]
同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。
10 STRLEN key
返回 key 所储存的字符串值的长度。(String 的 Length)
11 SETEX key seconds value
将值 value 关联到 key,并将 key 的过期时间设为 seconds (以秒为单位)。
12 PSETEX key milliseconds value
这个命令和 SETEX 命令相似,但它以毫秒为单位设置 key 的生存时间,而不是像 SETEX 命令那样,以秒为单位。
13 INCR key
将 key 中储存的数字值增一。(String 中存为类似 102、88 的数字字符串情况)
14 INCRBY key increment
将 key 所储存的值加上给定的增量值(increment)(上面的是加一,如果想增量为指定数值,即可用该命令)
15 INCRBYFLOAT key increment
将 key 所储存的值加上给定的浮点增量值(increment)。
16 DECR key
将 key 中储存的数字值减一。
17 DECRBY key decrement
key 所储存的值减去给定的减量值(decrement)。
18 APPEND key value
如果 key 已经存在并且是一个字符串,APPEND 命令将 value 追加到 key 原来的值的末尾。
二、Hash(哈希)常用命令
由于是 Hash 类型的相关命令,可以看到,命令开头字符均为 H。说起 Hash、Key-Value、键值对,第一时间想到了 Map/HashMap, 多个键值对?同时,我们在开发过程中操作的那些实体对象,往往有多个属性,而它们的属性和属性值一一对应起来是不是跟这里的键值对有点吻合,在 redis 里,每个 hash 可以存储 2 的 32 次方 - 1 个键值对(40 多亿),所以 hash 很适合存储对象。
1 HSET key field value
将哈希表 key 中的字段 field 的值设为 value。
2 HSETNX key field value
只有在字段 field 不存在时,设置哈希表字段的值。
3 HGET key field
获取存储在哈希表中指定字段的值。
4 HMSET key field1 value1 [field2 value2]
同时将多个 field-value (域 - 值)对设置到哈希表 key 中。
5 HMGET key field1 [field2]
获取所有给定字段的值
6 HGETALL key
获取在哈希表中指定 key 的所有字段和值(这个命令获取到其中完整内容了,实际情况下数据量巨大的时候不适用)
7 HKEYS key
获取所有哈希表中的字段
8 HVALS key
获取哈希表中所有值
9 HEXISTS key field
查看哈希表 key 中,指定的字段是否存在。
10 HLEN key
获取哈希表中字段的数量
11 HDEL key field1 [field2]
删除一个或多个哈希表字段
12 HINCRBY key field increment
为哈希表 key 中的指定字段的整数值加上增量 increment。
13 HINCRBYFLOAT key field increment
为哈希表 key 中的指定字段的浮点数值加上增量 increment。
三、列表 (List) 常用命令
Redis 的 list 是元素都为 String 类型的双向链表,既然是双向列表,操作也分双向,这里的列表头部即左边第一个或者首个,列表尾部即右边方向第一个或者首个。以 LRANGE key start stop 为例,该命令用于获取列表指定范围内的元素,这里 LRANGE 指定从左到右方向,key 为键名称,start 和 end 分别代表想要获取的范围起始元素的索引,例子: 创建列表 testList, 内容为 C C++ C# Java Php Python, 一共 6 个元素(命令 RPUSH testList C C++ C# Java Php Python),了解数组等结构的不难知道,由于索引是从 0 开始,所以这 6 个元素的索引从左至右分别为 0 1 2 3 4 5, 所以如果我们想要获取 Java Php Python 这 3 个元素,我们用(命令 LRANGE testList 3 5)即可得到想要的结果,引申到这里的 redis 双向列表,使用负数下标,以 -1 表示列表的最后一个元素,-2 表示列表的倒数第二个元素,以此类推,则上述 6 个元素的索引从左到右也可以置为 -6 -5 -4 -3 -2 -1,这样一来,我们的获取方式更加灵活了,不论列表长度多少,我们想要获取全部元素的话都可以通用 LRANGE Key 0 - 1 来实现。例子中四种方式如下图示意。
List 作为双向链表,下图简单示例双向操作过程
1 LPUSH key value1 [value2]
将一个或多个值从左插入到列表头部
2 LPUSHX key value
将一个值从左插入到已存在的列表头部
3 RPUSH key value1 [value2]
将一个或多个值从右插入到列表尾部
4 RPUSHX key value
将一个值从右插入到已存在的列表尾部
5 LLEN key
获取列表长度
6 LPOP key
移出并获取列表的第一个元素
7 RPOP key
移除并获取列表最后一个元素
8 LINDEX key index
通过索引获取列表中的元素
9 LSET key index value
通过索引设置列表元素的值
10 LRANGE key start stop
获取列表指定范围内的元素
11 LREM key count value
移除列表元素 (记忆为 left remove)
count > 0 : 从左向右,移除与 VALUE 相等的元素,数量为 COUNT。
count < 0 : 从右向左,移除与 VALUE 相等的元素,数量为 COUNT 的绝对值。
count = 0 : 移除表中所有与 VALUE 相等的值。
12 LTRIM key start stop
对一个列表进行修剪 (trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
13 BLPOP key1 [key2] timeout
移出并获取列表的第一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
14 BRPOP key1 [key2] timeout
移出并获取列表的最后一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。(与上者区别,一个是针对左边也就是列表首部,一个是右边
也就是尾部。这个 timeout 是阻塞时间,以秒为单位)
15 BRPOPLPUSH source destination timeout
从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它;如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
16 LINSERT key BEFORE|AFTER pivot value
在列表的元素前或者后插入元素 (这个地方要注意,如果里列表中有重复元素,插入过程只会发生在第一个元素上)
17 RPOPLPUSH source destination
移除列表的最后一个元素,并将该元素添加到另一个列表并返回
四、集合 (Set) 常用命令
Set 是 string 类型的无序集合,与列表 List 中可存放重复元素不同,Set 中不能出现重复元素。
命令均以首字母 s 开头
1 SADD key member1 [member2]
向集合添加一个或多个成员
2 SCARD key
获取集合的成员数
3 SISMEMBER key member
判断 member 元素是否是集合 key 的成员(是的话返回 1,否则返回 0)
4 SMEMBERS key
返回集合中的所有成员
5 SREM key member1 [member2]
移除集合中一个或多个成员(返回删除数量)
6 SPOP key
移除并返回集合中的一个随机元素
7 SRANDMEMBER key [count]
返回集合中一个或多个随机数
8 SDIFF key1 [key2]
返回给定所有集合的差集
9 SDIFFSTORE destination key1 [key2]
返回给定所有集合的差集并存储在 destination 中
10 SINTER key1 [key2]
返回给定所有集合的交集
11 SINTERSTORE destination key1 [key2]
返回给定所有集合的交集并存储在 destination 中
12 SUNION key1 [key2]
返回所有给定集合的并集
13 SUNIONSTORE destination key1 [key2]
所有给定集合的并集存储在 destination 集合中
示例操作如下图
五、有序集合 (sorted set) 命令
有序集合 (sorted set) 与集合(set)一样均不允许重复元素,区别在于有序集合是有序的,而且每个元素都会对应有一个 double 类型的分数(score), 这个分数就是排序的依据,按照分数从小到大(PS: 有序集合中元素不能重复,但是分数是可以重复的)。之前通过 SADD 命令添加集合元素我们是无法保证顺序和插入位置的,这里通过改变分数值来控制排序和插入位置。
命令区别于 set 均已 z 开头。
1 ZADD key score1 member1 [score2 member2]
向有序集合添加一个或多个成员,或者更新已存在成员的分数
2 ZRANGE key start stop [WITHSCORES]
通过索引区间返回有序集合成指定区间内的成员 (0 - 1 分别可以对应第一个和最后一个元素)
3 ZCARD key
获取有序集合的成员数
4 ZSCORE key member
返回有序集中,成员的分数值
5 ZRANK key member
返回有序集合中指定成员的索引 (从 0 开始,左至右)
6 ZCOUNT key min max
计算在有序集合中指定区间分数的成员数
7 ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT]
通过分数返回有序集合指定区间内的成员
8 ZREVRANK key member
返回有序集合中指定成员的排名,有序集成员按分数值递减 (从大到小) 排序(PS: 排名最高即分数最高的为 0,当分数相同时,与存储顺序反向排序定位)
9 ZREVRANGE key start stop [WITHSCORES]
返回有序集中指定区间内的成员,通过索引,分数从高到底
10 ZREVRANGEBYSCORE key max min [WITHSCORES]
返回有序集中指定分数区间内的成员,分数从高到低排序
11 ZINCRBY key increment member
有序集合中对指定成员的分数加上增量 increment
12 ZREM key member [member …]
移除有序集合中的一个或多个成员
13 ZREMRANGEBYRANK key start stop
移除有序集合中给定的排名区间的所有成员
14 ZREMRANGEBYSCORE key min max
移除有序集合中给定的分数区间的所有成员
15 ZINTERSTORE destination numkeys key [key …]
计算给定的一个或多个有序集的交集,并存储在新的 key 中
16 ZUNIONSTORE destination numkeys key [key …]
计算给定的一个或多个有序集的并集,并存储在新的 key 中
示例操作如下图
小结
乍一看感觉密密麻麻的命令一大堆,实际开发过程我们更多的是利用各种编程语言封装的 API 去操作 redis,比如 java 的 jedis 之类,但是在真正把 redis 上手或者引进开发项目之前,熟悉一下命令,有助于我们更好地理解其思想和提供的功能。例如很多数据库 API 设计也是对应了数据库功能或者命令,我们熟知的关系型数据库 MySQL、Oracle 之类,在数据库里命令操作常用 CRUD,所以相关持久层 API 设计也会封装相应方法。建议命令过一遍,不一定非要所有命令记得死死的,重点要知道各个数据类型是什么结构,有什么特点,分别有些什么操作。
下面关于 Redis 的文章您也可能喜欢,不妨参考下:
Ubuntu 14.04 下 Redis 安装及简单测试 http://www.linuxidc.com/Linux/2014-05/101544.htm
Redis 主从复制基本配置 http://www.linuxidc.com/Linux/2015-03/115610.htm
Redis 集群搭建与简单使用 http://www.linuxidc.com/Linux/2017-03/142210.htm
CentOS 7 下 Redis 的安装与配置 http://www.linuxidc.com/Linux/2017-02/140363.htm
Ubuntu 14.04 安装 Redis 与简单配置 http://www.linuxidc.com/Linux/2017-01/139075.htm
Ubuntu 16.04 环境中安装 PHP7.0 Redis 扩展 http://www.linuxidc.com/Linux/2016-09/135631.htm
Redis 单机 & 集群离线安装部署 http://www.linuxidc.com/Linux/2017-03/141403.htm
CentOS 7.0 安装 Redis 3.2.1 详细过程和使用常见问题 http://www.linuxidc.com/Linux/2016-09/135071.htm
Ubuntu 16.04 环境中安装 PHP7.0 Redis 扩展 http://www.linuxidc.com/Linux/2016-09/135631.htm
Ubuntu 15.10 下 Redis 集群部署文档 http://www.linuxidc.com/Linux/2016-06/132340.htm
Redis 实战 中文 PDF http://www.linuxidc.com/Linux/2016-04/129932.htm
Redis 热迁移实战总结 http://www.linuxidc.com/Linux/2017-02/141083.htm
Redis3.0 配置文件详解 http://www.linuxidc.com/Linux/2017-03/141369.htm
本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-11/148869.htm