了解Redis客户端
想要输入Redis命令,必须先进入Redis客户端
使用redis-cli连接本机的命令行客户端
redis-cli
如果想连接其他的ip和端口的客户端,可以使用下面命令
redis-cli -h 主机 -p 端口
遇到不会的命令,可以查看Redis官方文档Commands | Docs
set 和 get
set的用法
set key value
key和value是字符串类型的
例如:
key和value是不需要加上引号的,如果加上也是可以的(单引号和双引号都行)
另外,Redis的命令是不区分大小写的
get的用法
get key
如果输入的key不存在,会返回nil,表示空,和 C++和Java中的NULL、null差不多
Redis全局命令
Redis是键值对结构,key固定是字符串,value可以是字符串、哈希表、列表、集合、有序集合,操作不同的数据结构会有不同的命令
全局命令,是可以搭配任意一个数据结构来使用的命令
keys命令
keys pattern
上述命令会返回所有满足pattern 样式的key,这个命令的时间复杂度是O(N)
pattern书写规则:
-
?匹配任意一个字符
-
* 匹配0个或者多个任意字符
-
[ab] 只能匹配a或者b,其他都不行
-
[^a] 表示排除a,除了a其他都能匹配
-
[a-e] 表示a~e这个范围内都匹配(闭区间)
例如:
先设置如下key
?匹配任意字符
* 匹配0个或者多个任意字符
[ae] 匹配a和e
[^e] 除了e都能匹配
[a-e] 匹配a~e范围内的值(闭区间)
查看Redis中所有的key
keys *
这个命令在生产环境中一般不推荐使用,因为执行keys * 的时间可能会非常长,会使Redis服务器阻塞,无法给其他的客户端提供服务
exists命令
这个命令的作用是判断key是否存在,可以判断一个key,也可以判断多个key,多个key使用空格分开,返回值是key存在的个数,这个操作的时间复杂度是O(N)N只的是key的个数
exists key [key ...]
exists key1 key2的写法和exists key1、exists key2分开的写法的区别:分开写会产生更多的网络通信,一次网络通信的成本比较高,所以尽可能一次网络通信完成多个操作
del命令
删除指定的key,可以一次删除一个或者多个
del key [key ...]
返回值是删除key的个数
expire命令
作用是给指定的key设置过期时间(前提是这个key已经存在),单位秒,达到指定的时间之后,这个key就会被自动删除
expire key seconds
返回值1表示设置成功,0表示设置失败
除了expire外,还有一个命令pexpire用法和expire一致,只不过pexpire的单位是毫秒
pexpire key milliseconds
ttl命令
time to alive,使用这个命令可以查看指定的key的过期时间还剩多少
ttl key
返回值是是剩余的过期时间,-1表示没有设置过期时间,-2表示key不存在,单位是毫秒
另外还有一个pttl命令,用法和ttl一致,只不过pttl的时间单位是毫秒
pttl key
Redis中key的过期策略
一个Redis中,可能同时存在很多key,这些key中很可能大部分都有过期时间,Redis服务器是如何知道哪些key已经过期要被删除,哪些key还没过期?
Redis的策略是:定期删除和惰性删除结合
1、定期删除:每次只抽取一部分的key检查是否过期,因为如果把所有的key都扫描一遍,成本比较大,Redis是一个单线程的程序,主要任务(处理命令、扫描过期的key等任务)都是在一个线程中完成,如果扫描过期key消耗的时间过多,处理正常请求命令就被阻塞了,这时Redis不能快速的处理请求,所以不能让扫描过期key的时间消耗过多
2、惰性删除:假设这个key已经到过期时间,但是暂时还没删除(还在服务器中存在),后面再次访问这个key时,这次的访问就会让Redis触发删除key的操作,同时返回一个nil。也就是说,当我们不用这个key的时候,这个key已经过期了,但是还在服务器中存储着,当我们使用到的服务器时候发现key已经过期,这时才会触发删除操作。
虽然有上述两种策略的结合,但是可能还会有很多过期的key残留,因此Redis提供了内存淘汰策略
type
查看key对应的value的类型
type key
key对应的value的类型有:none(表示key不存在)、string(字符串)、list(列表)、set(集合)、zset(有序集合)、hash(哈希表)、stream(当Redis作为消息队列时使用stream类型的value),type命令时间复杂度为O(1)