Redis中的数据类型及常用命令备忘录
带目录版:Redis中的数据类型及常用命令备忘录
Redis安装及启停:Redis安装
Redis 键(key)
keys *
查询该数据库所有的键
exist key的名字
判断该键是否存在
示例:
![](https://img.haomeiwen.com/i18610384/8053a9f0cb74217a.png)
我们知道Redis中默认右16个库,当前是第0库中的关键词,当exists能找到key时返回1,不能则返回0
move key db
移动数据,key时关键词,db指哪个数据库,指把这个数据移到指定的数据库中去
![](https://img.haomeiwen.com/i18610384/81a7447d9f8ccf23.png)
- 执行一下,我们发现在数据库0中已经没有k1 ,理论上被移到了数据库1中去了
![](https://img.haomeiwen.com/i18610384/839b0f32b0b02af6.png)
- 再开一个,转到数据库1,第一次时没有移动之前的,第二次时移动之后的,我们发现k1已经到数据库1中了
expire key 秒钟
为给定的key设置过期时间
ttl key
查看还有多少秒过期,-1表示永不过期,-2表示已过期
![](https://img.haomeiwen.com/i18610384/e1143bb99f30aa56.png)
这组测试先存了一组 k1 hello,接下来查看状态,-1 表示存在,接下来设置过期时间为20秒,不停ttl查看发现时间一直在减少,期间hello是可以查到的,20秒过后,ttl发现变为-2,表示过期,则用get key 就查不到hello了
type key
查看你的key是什么类型
![](https://img.haomeiwen.com/i18610384/28e869cceebe10ff.png)
- 可以看到type命令可以查出不同类型,当然当key不存在的时候返回none
Redis的五大数据类型
string(字符串)
String(字符串)
string是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。
string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。
string类型是Redis最基本的数据类型,一个redis中字符串value最多可以是512M
常用命令
- set/get/del/append/strlen
- Incr/decr/incrby/decrby
- getrange/setrange
- setex(set with expire)键秒值/setnx(set if not exist)
- mset/mget/msetnx
- getset(先get再set)
![](https://img.haomeiwen.com/i18610384/c2cabf6e2e623ce9.png)
- append key value :如果键 key 已经存在并且它的值是一个字符串, APPEND 命令将把 value 追加到键 key 现有值的末尾,返回value的长度
- strlen key :返回value的长度
![](https://img.haomeiwen.com/i18610384/783695a783ac0bfc.png)
![](https://img.haomeiwen.com/i18610384/27b4ca618fbde6d3.png)
Incr key
为键 key 储存的数字值加上一。如果键 key 不存在, 那么它的值会先被初始化为 0 , 然后再执行 INCR 命令。如果键 key 储存的值不能被解释为数字, 那么 INCR 命令将返回一个错误。
![](https://img.haomeiwen.com/i18610384/3d4b256093bd1baa.png)
INCRBY key increment
为键 key 储存的数字值加上增量 increment 。如果键 key 不存在, 那么键 key 的值会先被初始化为 0 , 然后再执行 INCRBY 命令。如果键 key 储存的值不能被解释为数字, 那么 INCRBY 命令将返回一个错误。
![](https://img.haomeiwen.com/i18610384/6632fde33d8e87ca.png)
decr/decrby的效果类似,相当于Java中的 i = i-value;
GETRANGE key start end
返回键 key 储存的字符串值的指定部分, 字符串的截取范围由 start 和 end 两个偏移量决定 (包括 start 和 end 在内)。负数偏移量表示从字符串的末尾开始计数, -1 表示最后一个字符, -2 表示倒数第二个字符, 以此类推。GETRANGE 通过保证子字符串的值域(range)不超过实际字符串的值域来处理超出范围的值域请求。
SETRANGE key offset value
从偏移量 offset 开始, 用 value 参数覆写(overwrite)键 key 储存的字符串值。不存在的键 key 当作空白字符串处理。SETRANGE 命令会确保字符串足够长以便将 value 设置到指定的偏移量上, 如果键 key 原来储存的字符串长度比偏移量小(比如字符串只有 5 个字符长,但你设置的 offset 是 10 ), 那么原字符和偏移量之间的空白将用零字节(zerobytes, "\x00" )进行填充。
![](https://img.haomeiwen.com/i18610384/cf0a321392190875.png)
![](https://img.haomeiwen.com/i18610384/3dcea9498aeb2736.png)
SETEX key seconds value
将键 key 的值设置为 value , 并将键 key 的生存时间设置为 seconds 秒钟。如果键 key 已经存在, 那么 SETEX 命令将覆盖已有的值。
SETNX key value
只在键 key 不存在的情况下, 将键 key 的值设置为 value 。若键 key 已经存在, 则 SETNX 命令不做任何动作。SETNX 是『SET if Not eXists』(如果不存在,则 SET)的简写。
![](https://img.haomeiwen.com/i18610384/4d2af51d664c6520.png)
![](https://img.haomeiwen.com/i18610384/14307cf5f6236d5d.png)
MSET key value [key value …]
同时为多个键设置值。如果某个给定键已经存在, 那么 MSET 将使用新值去覆盖旧值, 如果这不是你所希望的效果, 请考虑使用 MSETNX 命令, 这个命令只会在所有给定键都不存在的情况下进行设置。MSET 是一个原子性(atomic)操作, 所有给定键都会在同一时间内被设置, 不会出现某些键被设置了但是另一些键没有被设置的情况。
MGET key [key …]
返回给定的一个或多个字符串键的值。如果给定的字符串键里面, 有某个键不存在, 那么这个键的值将以特殊值 nil 表示。
MSETNX key value [key value …]
当且仅当所有给定键都不存在时, 为所有给定键设置值。即使只有一个给定键已经存在, MSETNX 命令也会拒绝执行对所有键的设置操作。MSETNX 是一个原子性(atomic)操作, 所有给定键要么就全部都被设置, 要么就全部都不设置, 不可能出现第三种状态。
![](https://img.haomeiwen.com/i18610384/27d3d20c2afa3606.png)
![](https://img.haomeiwen.com/i18610384/e15842b9c03a1151.png)
- 也就是说MSETNX只有当所有key都不存在的时候才会将所有value插入,否则一个都不插入
hash(哈希,类似java里的Map)
Hash(哈希)Redis hash 是一个键值对集合。Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。类似Java里面的Map<String,Object>
常用命令
- hset/hget/hmset/hmget/hgetall/hdel
- hlen
- hexists key 在key里面的某个值的key
- hkeys/hvals
- hincrby/hincrbyfloat
- hincrby/hincrbyfloat
- hsetnx
HSET hash field value
- 将哈希表 hash 中域 field 的值设置为 value 。
- 如果给定的哈希表并不存在, 那么一个新的哈希表将被创建并执行 HSET 操作。
- 如果域 field 已经存在于哈希表中, 那么它的旧值将被新值 value 覆盖。
HGET hash field
- HGET 命令在默认情况下返回给定域的值。
- 如果给定域不存在于哈希表中, 又或者给定的哈希表并不存在, 那么命令返回 nil
![](https://img.haomeiwen.com/i18610384/3f8c92eef7fb0c55.png)
HMSET key field value [field value …]
- 同时将多个 field-value (域-值)对设置到哈希表 key 中。
- 此命令会覆盖哈希表中已存在的域。
- 如果 key 不存在,一个空哈希表被创建并执行 HMSET 操作。
HMGET key field [field …]
- 返回哈希表 key 中,一个或多个给定域的值。
- 如果给定的域不存在于哈希表,那么返回一个 nil 值。
- 因为不存在的 key 被当作一个空哈希表来处理,所以对一个不存在的 key 进行 HMGET 操作将返回一个只带有 nil 值的表。
![](https://img.haomeiwen.com/i18610384/e2d91053986eedcd.png)
HGETALL key
- 返回哈希表 key 中,所有的域和值。在返回值里,紧跟每个域名(field name)之后是域的值(value),所以返回值的长度是哈希表大小的两倍。
HDEL key field [field …]
- 删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略。
HLEN key
- 返回哈希表 key 中域的数量。
![](https://img.haomeiwen.com/i18610384/670281fdd9a54ee2.png)
HEXISTS hash field
- 检查给定域 field 是否存在于哈希表 hash 当中。
HKEYS key
- 返回哈希表 key 中的所有域。
HVALS key
- 返回哈希表 key 中所有域的值。
![](https://img.haomeiwen.com/i18610384/3e16e7bb914e1dbc.png)
HINCRBY key field increment
- 为哈希表 key 中的域 field 的值加上增量 increment 。
- 增量也可以为负数,相当于对给定域进行减法操作。
- 如果 key 不存在,一个新的哈希表被创建并执行 HINCRBY 命令。
- 如果域 field 不存在,那么在执行命令前,域的值被初始化为 0 。
- 对一个储存字符串值的域 field 执行 HINCRBY 命令将造成一个错误。
![](https://img.haomeiwen.com/i18610384/2d1df8c5dbdd785c.png)
![](https://img.haomeiwen.com/i18610384/ec31389b3a2f5e3a.png)
![](https://img.haomeiwen.com/i18610384/37f7de4ad3eb03f3.png)
HSETNX hash field value
- 当且仅当域 field 尚未存在于哈希表的情况下, 将它的值设置为 value 。
- 如果给定域已经存在于哈希表当中, 那么命令将放弃执行设置操作。
- 如果哈希表 hash 不存在, 那么一个新的哈希表将被创建并执行 HSETNX 命令。
![](https://img.haomeiwen.com/i18610384/caac344e52a7b255.png)
list(列表)
List(列表)Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)。它的底层实际是个链表
常用命令
lpush/rpush/lrange
lpop/rpop
lindex,按照索引下标获得元素(从上到下)
llen
lrem key 删N个value
ltrim key 开始index 结束index,截取指定范围的值后再赋值给key
rpoplpush 源列表 目的列表
lset key index value
linsert key before/after 值1 值2
LPUSH key value [value …]
- 将一个或多个值 value 插入到列表 key 的表头
- 如果有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到表头: 比如说,对空列表 mylist 执行命令 LPUSH mylist a b c ,列表的值将是 c b a ,这等同于原子性地执行 LPUSH mylist a 、 LPUSH mylist b 和 LPUSH mylist c 三个命令。
- 如果 key 不存在,一个空列表会被创建并执行 LPUSH 操作。
- 当 key 存在但不是列表类型时,返回一个错误。
RPUSH key value [value …]
- 将一个或多个值 value 插入到列表 key 的表尾(最右边)。
- 如果有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到表尾:比如对一个空列表 mylist 执行 RPUSH mylist a b c ,得出的结果列表为 a b c ,等同于执行命令 RPUSH mylist a 、 RPUSH mylist b 、 RPUSH mylist c 。
- 如果 key 不存在,一个空列表会被创建并执行 RPUSH 操作。
- 当 key 存在但不是列表类型时,返回一个错误。
LRANGE key start stop
- 返回列表 key 中指定区间内的元素,区间以偏移量 start 和 stop 指定。下标(index)参数 start 和 stop 都以 0 为底,也就是说,以 0 表示列表的第一个元素,以 1表示列表的第二个元素,以此类推。你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
- 超出范围的下标超出范围的下标值不会引起错误。如果 start 下标比列表的最大下标 end ( LLEN list 减去 1 )还要大,那么 LRANGE 返回一个空列表。如果 stop 下标比 end 下标还要大,Redis将 stop 的值设置为 end 。
- start 和stop是闭区间的
![](https://img.haomeiwen.com/i18610384/7e36901f3ab24e3c.png)
![](https://img.haomeiwen.com/i18610384/b2cdca9b98e3025f.png)
LPOP key
移除并返回列表 key 的头元素。
RPOP key
移除并返回列表 key 的尾元素。
![](https://img.haomeiwen.com/i18610384/de3f3d717b82384b.png)
LINDEX key index
返回列表 key 中,下标为 index 的元素。
LLEN key
返回列表 key 的长度。
![](https://img.haomeiwen.com/i18610384/daefaef2ffcbca6a.png)
LREM key count value
根据参数 count 的值,移除列表中与参数 value 相等的元素。
count 的值可以是以下几种:count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。
count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。
count = 0 : 移除表中所有与 value 相等的值。
![](https://img.haomeiwen.com/i18610384/a6880f6d8edaa587.png)
![](https://img.haomeiwen.com/i18610384/9821a7181f91e55f.png)
![](https://img.haomeiwen.com/i18610384/3d7be29df935bbe5.png)
LTRIM key start stop
- 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
![](https://img.haomeiwen.com/i18610384/d8e709384f3a489b.png)
RPOPLPUSH source destination
命令 RPOPLPUSH 在一个原子时间内,执行以下两个动作:
- 将列表 source 中的最后一个元素(尾元素)弹出,并返回给客户端。
将 source 弹出的元素插入到列表 destination ,作为 destination 列表的的头元素。- 如果 source 不存在,值 nil 被返回,并且不执行其他动作。
- 如果 source 和 destination 相同,则列表中的表尾元素被移动到表头,并返回该元素,可以把这种特殊情况视作列表的旋转(rotation)操作。
![](https://img.haomeiwen.com/i18610384/eefe84b5663dc42d.png)
LSET key index value
- 将列表 key 下标为 index 的元素的值设置为 value 。当 index 参数超出范围,或对一个空列表( key 不存在)进行 LSET 时,返回一个错误。
![](https://img.haomeiwen.com/i18610384/3ef596f894972f35.png)
LINSERT key BEFORE|AFTER pivot value
- 将值 value 插入到列表 key 当中,位于值 pivot 之前或之后。
- 当 pivot 不存在于列表 key 时,不执行任何操作。
- 当 key 不存在时, key 被视为空列表,不执行任何操作。
- 如果 key 不是列表类型,返回一个错误。
![](https://img.haomeiwen.com/i18610384/b501893da64f1a8a.png)
性能总结
它是一个字符串链表,left、right都可以插入添加;如果键不存在,创建新的链表;如果键已存在,新增内容;如果值全移除,对应的键也就消失了。链表的操作无论是头和尾效率都极高,但假如是对中间元素进行操作,效率就很惨淡了。
set(集合)
Set(集合)Redis的Set是string类型的无序集合。它是通过HashTable实现实现的
常用命令
SADD key member [member …]
- 将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略。
- 假如 key 不存在,则创建一个只包含 member 元素作成员的集合。
- 当 key 不是集合类型时,返回一个错误。
SMEMBERS key
- 返回集合 key 中的所有成员。不存在的 key 被视为空集合
SISMEMBER key member
- 判断 member 元素是否集合 key 的成员。
![](https://img.haomeiwen.com/i18610384/9ab07e7511e28ef1.png)
SRANDMEMBER key [count]
- 如果命令执行时,只提供了 key 参数,那么返回集合中的一个随机元素。
- 如果 count 为正数,且小于集合基数,那么命令返回一个包含 count 个元素的数组,数组中的元素各不相同。
- 如果 count 大于等于集合基数,那么返回整个集合。
- 如果 count 为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count 的绝对值。
![](https://img.haomeiwen.com/i18610384/8eb19954156fb069.png)
SPOP key
- 移除并返回集合中的一个随机元素。
![](https://img.haomeiwen.com/i18610384/2a2e2f1c92b07b66.png)
SMOVE source destination member
- 将 member 元素从 source 集合移动到 destination 集合。
- SMOVE 是原子性操作。
- 如果 source 集合不存在或不包含指定的 member 元素,则 SMOVE 命令不执行任何操作,仅返回 0 。
- 否则, member 元素从 source 集合中被移除,并添加到 destination 集合中去。
- 当 destination 集合已经包含 member 元素时, SMOVE 命令只是简单地将 source 集合中的 member 元素删除。
- 如果 member 元素被成功移除,返回 1 。 如果 member 元素不是 source 集合的成员,并且没有任何操作对 destination 集合执行,那么返回 0 。
![](https://img.haomeiwen.com/i18610384/558d7c2c662c55ba.png)
SDIFF key [key …]
- 返回一个集合的全部成员,该集合是所有给定集合之间的差集。
- 不存在的 key 被视为空集。
SINTER key [key …]
- 返回一个集合的全部成员,该集合是所有给定集合的交集。
SUNION key [key …]
-返回一个集合的全部成员,该集合是所有给定集合的并集
![](https://img.haomeiwen.com/i18610384/d3a74c460524709c.png)
zset(sorted set:有序集合)
zset(sorted set:有序集合)Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score)却可以重复。
常用命令
- zadd/zrange
- zrangebyscore key 开始score 结束score
- zrem
ZADD key score member [[score member] [score member] …]
- 将一个或多个 member 元素及其 score 值加入到有序集 key 当中。
- 如果某个 member 已经是有序集的成员,那么更新这个 member 的 score 值,并通过重新插入这个 member 元素,来保证该 member 在正确的位置上。
- score 值可以是整数值或双精度浮点数。
- 如果 key 不存在,则创建一个空的有序集并执行 ZADD 操作。
- 当 key 存在但不是有序集类型时,返回一个错误。
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
- 返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列。
- 具有相同 score 值的成员按字典序(lexicographical order)来排列(该属性是有序集提供的,不需要额外的计算)。
- 可选的 LIMIT 参数指定返回结果的数量及区间(就像SQL中的 SELECT LIMIT offset, count )
- 可选的 WITHSCORES 可以将有序集成员及其 score 值一起返回。
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]
- 返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列。
![](https://img.haomeiwen.com/i18610384/439145079f97494d.png)
![](https://img.haomeiwen.com/i18610384/e4cfb01636638876.png)
ZREM key member [member …]
- 移除有序集 key 中的一个或多个成员,不存在的成员将被忽略。当 key 存在但不是有序集类型时,返回一个错误。
![](https://img.haomeiwen.com/i18610384/8e96ddff05fff0a2.png)
ZCARD key
- 返回有序集 key 的基数。
ZCOUNT key min max
- 返回有序集 key 中, score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max )的成员的数量。
ZRANK key member
- 返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递增(从小到大)顺序排列。排名以 0 为底,也就是说, score 值最小的成员排名为 0 。
ZREVRANK key member
返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递减(从大到小)排序。
ZSCORE key member
- 返回有序集 key 中,成员 member 的 score 值。如果 member 元素不是有序集 key 的成员,或 key 不存在,返回 nil 。
![](https://img.haomeiwen.com/i18610384/77613761d1a0fb18.png)
![](https://img.haomeiwen.com/i18610384/bda475b97a01b640.png)
ZRANGE key start stop [WITHSCORES]
- 返回有序集 key 中,指定区间内的成员。
- 其中成员的位置按 score 值递增(从小到大)来排序。
- 具有相同 score 值的成员按字典序(lexicographical order )来排列。
- 如果你需要成员按 score 值递减(从大到小)来排列,请使用 ZREVRANGE key start stop [WITHSCORES] 命令。
- 可以通过使用 WITHSCORES 选项,来让成员和它的 score 值一并返回
ZREVRANGE key start stop [WITHSCORES]
- 其中成员的位置按 score 值递增(从大到小)来排序。
![](https://img.haomeiwen.com/i18610384/7120067b03650dd8.png)