redis数据类型及常用命令介绍(图文实例)
上图中即为redis中5种基本数据类型,在没接触过redis之前,听过最多相关的字眼就是键值对key-value之类,立马让我想到了HashMap。在HashMap中,key和value的的数据类型都可以指定,value也可以是HashMap类型。而在这里,redis的基本数据类型是针对的value,有这5种。
文中所用测试记录环境在Linux下,命令操作在SSH客户端下,这里使用的是Xshell 5,个人使用感觉很方便,同一系列的Xftp 5用于远程文件上传操作也很不错。如有需要,可直接进入官网下载,有免费版本(Free for Home/School),点击传送门。
一、字符串(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设计也会封装相应方法。建议命令过一遍,不一定非要所有命令记得死死的,重点要知道各个数据类型是什么结构,有什么特点,分别有些什么操作。