Redis 命令行使用指南
Redis 命令行中的两个核心(最基础)的命令
1.set命令
基础用法:
set key value(设置键值对)
example:
127.0.0.1:6379> set key1 value1
OK
127.0.0.1:6379> set key2 value2
OK
127.0.0.1:6379> set 'key3' "value3"
OK
set命令后面的键值对(即key和value)都是字符串数据类型,但我们并不需要给这两个值刻意添加单引号或者双引号,但是添加了也是无伤大雅的
2.get命令
基础用法:
get key(通过键获取对应的值)
example:
127.0.0.1:6379> get key1
"value1"
127.0.0.1:6379> get key2
"value2"
127.0.0.1:6379> get key3
"value3"
但是若尝试访问一个并没有被set的key时,会返回nil(即空)
127.0.0.1:6379> get key4
(nil)
全局环境的命令
一、keys
这个命令可以用来查找所有与查询要求相匹配的 key 值,用法如下:
keys pattern
pattern 就是一个匹配条件了,匹配方式如下:
在举例之前,我们先插入几个新的键值对方便演示:
127.0.0.1:6379> set hello 1
127.0.0.1:6379> set hallo 2
127.0.0.1:6379> set hcllo 3
127.0.0.1:6379> set hllo 4
127.0.0.1:6379> set heeeeeeeeeello 5
1、精准匹配
127.0.0.1:6379> keys hello
1) "hello"
127.0.0.1:6379> keys hlllo
(empty array)
这种匹配方式简单明了,你输入啥他就直接查询你所输入的键,他的作用可能就只能用来查询某个键是否存在了,不过与其这样,通过 exists 命令查询效率会更高
2、单字符模糊匹配
127.0.0.1:6379> keys h?llo
1) "hello"
2) "hcllo"
3) "hallo"
问号处可以用任意字符替代,符合该要求的键就会被筛选出来
3、单字符指定匹配
127.0.0.1:6379> keys h[ac]llo
1) "hcllo"
2) "hallo"
h和llo中间的字符只能是中括号中的任意一个字符,其余字符则不满足匹配要求
4、单字符范围指定匹配
127.0.0.1:6379> keys h[b-z]llo
1) "hello"
2) "hcllo"
与单字符指定匹配相似,这种方式是通过指定某个范围内的字符均可以匹配,如b到z之间的字符都匹配
5、内容模糊匹配
127.0.0.1:6379> keys h*llo
1) "hello"
2) "hllo"
3) "heeeeeeeeeello"
4) "hcllo"
5) "hallo"
‘*’中的内容可以是空字符,也可以是一个字符,也可以是多个字符,只要符合条件都可以匹配
6、排斥匹配
127.0.0.1:6379> keys h[^ac]llo
1) "hello"
上尖括号指的是除此之外的内容都适配,因此在这个示例中,只要中括号中的内容不是a和c,都可以匹配筛选出来排斥匹配可以和上面五中匹配方式自由搭配,例如:
127.0.0.1:6379> keys h[^a-c]llo
1) "hello"
127.0.0.1:6379> keys ^*
(empty array)
当然,像 keys ^* 就确实是没啥意义了,把自己选择的键全都给排斥掉了,一般也不会有这么用吧(maybe)
当然呢,keys命令在生产环境当中是不鼓励高频率使用的,因为他的时间复杂度是O(N),尤其是像 keys * 这样的命令更是不推荐使用,它会将所有的键全部都枚举出来,时间开销极大,肯定是不鼓励使用的,redis若在分布式环境中使用这条指令,是会导致redis的其他进程调度被阻塞住的,不利于生产环境
二、exists
这个命令是用来判断某个键值是否存在的,具体用法如下:
exists key [key ...]
没错,这个命令可以一次查询多个键值是否存在,返回结果为输入的键值中有几个是存在的,示例如下:
127.0.0.1:6379> exists hello hbllo hllo
(integer) 2
因为 hello 和 hllo 是存在的,而 hbllo 不存在,故返回2
那如果写成下面这种写法可以吗?
127.0.0.1:6379> exists hello
(integer) 1
127.0.0.1:6379> exists hllo
(integer) 1
127.0.0.1:6379> exists hbllo
(integer) 0
两种写法均可以查出这三个键值中有几个是存在的,看似两者的性能差不多,但是后者在实际生产环境中的效率肯定是更低的,要记住,redis 和 MySQL 一样,都是处理服务端与客户端之间交互的数据处理媒介,若对三个键值分别查询,就需要走三次网络通信,效率固然是不如一次性查询的,网络通信设计包的封装和分发,性能如何可想而知。当然,若需要知道某个指定的键值是否存在,那肯定是分别查询了
三、del
这个命令是用来删除 redis 中的键值的,用法和 exists 类似:
del key [key ...]
同样,这个命令可以单独删除某个键,也可以一次删除多个键,返回值是被删除的键值的数量,用法如下
127.0.0.1:6379> set k1 1
127.0.0.1:6379> set k2 2
127.0.0.1:6379> set k3 3
127.0.0.1:6379> del k1
(integer) 1
127.0.0.1:6379> del k2 k3 k4
(integer) 2
在 redis 中,删除命令就不会像 MySQL 那样风险极高了,因为 redis 一般是用来为 MySQL 分担压力的,对于热点数据,redis 会从 MySQL 中取出,利用内存的高性能从而解决大量的访问请求,若真的不小心删掉了,只需要从类似于 MySQL 这样的关系型数据库中再拿过来就行了,当然,对于某些对性能要求极高的商业场景,直接使用 redis 作为数据库,而不是作为一个中间介质,那误删带来的后果还是很大的
四、expire 和 ttl(pexpire 和 pttl)
expire 和 ttl命令通常是关联起来使用的,分别用来设置过期时间和查询剩余过期时间,单位为秒,而 pexpire 和 pttl 用法和 expire 以及 ttl一样,只不过时间单位是毫秒,因此这里我们只通过对 expire 和 ttl 的用法进行说明和举例,用法格式如下:
expire key seconds
ttl key
其中 expire 设置过期时间成功则返回1,否则返回0,而 ttl 正常则返回剩余过期时间,若返回-1则表明没有关联过期时间,若返回-2则表明 key 值不存在
下面是一个使用示例:
//k1 未被创建时查看 k1 剩余过期时间
127.0.0.1:6379> ttl k1
(integer) -2
//k1 未被创建时设置 k1 过期时间
127.0.0.1:6379> expire k1 20
(integer) 0
//设置键值 k1
127.0.0.1:6379> set k1 1
OK
//k1 未被设置过期时间时查询剩余过期时间
127.0.0.1:6379> ttl k1
(integer) -1
//设置 k1 过期时间
127.0.0.1:6379> expire k1 10
(integer) 1
//k1 距离过期剩余7秒
127.0.0.1:6379> ttl k1
(integer) 7
//k1 距离过期剩余4秒
127.0.0.1:6379> ttl k1
(integer) 4
//k1 距离过期剩余1秒
127.0.0.1:6379> ttl k1
(integer) 1
//k1 已过期,因此查询不到 k1,返回-2
127.0.0.1:6379> ttl k1
(integer) -2
//验证 k1 是否已经过期
127.0.0.1:6379> get k1
(nil)
redis 是如何处理过期的key的?
这是一个非常经典的面试题,redis 处理过期 key 的方法分为两个策略,分别为定期删除和惰性删除: 定期删除是每隔一段时间 redis 定期检查一部分 key 值是否过期,若过期则将他们删除 惰性删除则是在每次用户对 key 进行操作的时候检查该 key 时候过期,若过期则返回 nil 当然,几遍有了这两种策略,还是很难避免 redis 中有许多一直没有使用的残留 key 没有被及时清理,这就会导致内存有许多空间被不必要地占用了,因此,针对这种情况,redis 还提供了一系列的内存淘汰机制,通过这一套机制,可以基本保障过期 key 值不会对内存造成什么影响
正如前面所说,Redis 是非常注重效率的,因此,Redis 针对 set 和 expire 这两个命令是做了集合的,也就是说,这两个命令是可以一起使用的
命令格式如下;
set key value [expiration EX seconds | PX milliseconds] [NX | XX]
其中 NX 选项表示的是只有在当前不存在该键值的情况下才能创建对应的键值,也就是说加上了这个选项就无法通过 set 直接修改 key 所对应的 value 了 但通过 XX 选项只有在 key 值存在的情况下才可以修改 key 值,所以,XX 选项意味着 set 命令只能够修改某个 key 所对应的值,而无法创建一个新的键值对 使用示例如下:
127.0.0.1:6379> set k1 v1 ex 10
OK
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379> ttl k1
(integer) 3
127.0.0.1:6379> ttl k1
(integer) -2
127.0.0.1:6379> get k1
(nil)
127.0.0.1:6379> set k2 2 ex 10 XX
(nil)
127.0.0.1:6379> set k2 2 ex 10 NX
OK
五、type
显而易见,这个命令是用来判断 key 所对应的value的类型的,返回值为对应类型,命令格式如下:
type key
下面是一个使用示例:
127.0.0.1:6379> lpush k1 1 2 3
(integer) 3
127.0.0.1:6379> type k1
list
127.0.0.1:6379> set k2 123
OK
127.0.0.1:6379> type k2
string
综上,redis 中的一些基础命令就讲解完毕了