"那篝火在银河尽头~"
Redis-cli命令启动
现如今,我们已经启动了Redis服务,下⾯将介绍如何使⽤redis-cli连接、操作Redis服务。客户端与服务端交互的方式有两种:
● 第⼀种是交互式⽅式: 后续所有的操作都是通过交互式的⽅式实现,不需要再执⾏redis-cli了。
bash
redis-cli-h{host}-p{port}
进入redis后,我们可以敲下使用redis的一个命令:
● 第⼆种是命令⽅式: 就可以直接得到命令的返回结果.
bash
reids-cli -h {host} -p {port} {command}
这里有两点需要注意由于我们连接的Redis服务位于127.0.0.1,端⼝也使⽤的是默认的6379端⼝。所以很多时候,所以可以省略-h{host}-p{port}。
Redis全局命令:
如何理解全局命令?
(1) set与get
redis中最核心的两个命令就是: "set" 和 "get".set是用来把 "key" 和 "value"存储进去,而"get"是用来通过 "key" 获取 "value".
set命令使用:
set后面可以携带很多参数,但是开始学习阶段,我们就采取它最简单的用法。
对于上述的key value,如果你要表示字符串可以不用加 "",即便加上redis也不会报错。
get命令使用:
你说你现在设置了两个key就设置了嘛?你总得给我看看你设置的key是什么吧!
nil vs null:
null和nil都可以表示没有或者在价值上为0的概念,其中我们使用 "null"大多数用在数学、编程、商业等等,另一方面,在体育竞技或游戏方面使用 "nil"。
(2) Keys
|-----------|--------------------|
| 参数 | 效果 |
| ? | 匹配任意一个字符 |
| * | 匹配0个或多个任意字符 |
| [abcde] | 只能匹配到这个选型的任意一个 |
| [^e] | 匹配字符但 不包括e |
| [a-b] | 匹配a~b这个范围,范围都是闭区间 |
设置部分keys。
keys *:
keys命令的时间复杂度是O(n),这很好理解,就是遍历redis服务器是上存储的所有key。"keys *"其效果就是遍历访问 redis上的所有设置过的key!在生产环境中,一般会禁止使用"keys *"命令, 因为执行 " keys *"命令所花费的时间非常长,而Redis是一个单线程进程,此时就会导致redis服务器被阻塞住了,无法给其他客户端提供服务!
(3) EXISTS
redis中支持很多数据结构,指的是value可以是一些复杂的数据结构。相对于redis自身的键值对,是通过哈希表的方式来组织的。
为什么redis很多命令可以进行多参数传递?
这两次写法有什么区别?
我们需要了解,redis是一个网络服务,它的服务端和客户端的交流方式一定是以这样的形式:
如果输入多条命令,也就是需要多次网络传输网络通信,相反,如果将这些命令打包成一条命令,那么仅仅需要进行一次网络传输即可!大大减少了网络IO次数,提高数据处理的能力!
(4) DEL
(5) (P)EXPIRE\(P)TTL
返回值:1表⽰设置成功。0表⽰设置失败。
这里我们可以联想我们手机收到的验证码,什么几分钟内有效。
返回值:剩余过期时间。-1表⽰没有关联过期时间,-2表⽰key不存在。
对计算机而言,秒实在是很慢,所以你也会看到p开头的诸如 "pexpire\pttl"它们的时间是以毫秒为单位。
(6) type
当然这些数据结构,会在后面的篇幅中讲解。我们现在只需要观察结果,不用在意敲击的命令是什么意思。
我们通过type可以很快地知道,每个redis中存在的key存储的value是什么类型。
Redis中的过期策略
我们可以使用Expire命令设置key的到期时间。可是一个redis中一定不止一个key设置了过期时间,这些key一定需要什么管理其来,到一定的时间对这些key进行释放。redis咋可能知道哪些key已经过期需要被删除呢,哪些可以还没有过期呢?
可是Redis是一个单线程进程,如果是遍历所有的key,这样显然是行不通的,效率太低了,那么redis采取的过期策略是什么呢?
虽然上述两种策略相结合,但是仍然会残存很多的过期Key,没有得到及时的删除。因此,redis还提供了一系列内存淘汰的策略,解决这个问题。
有兴趣可以看看这篇讲解redis的内存淘汰策略的文章:
https://baijiahao.baidu.com/s?id=1729630215002937706&wfr=spider&for=pc
redis并没有选择使用定时器的方式来实现对key的过期删除,如果存在多个key需要被过期删除,那么一个定时器可以高效、节省cpu资源的前提下,完成对过期key的清理。
所以,借着这个机会,我们来看看定时器思想的两种实现方法。
定时器思想:
1) 基于优先级队列实现的定时器:
2) 基于时间轮实现的定时器
再次注意,redis中并没有采取这两种方案的任何一种来解决过期key的清理,但这两种方案都是高效的定时器实现方式,还是有一定的了解必要。
小结:
当前我们已经学了 redis几个基本的全局命令: get\set是redis的核心命令
① keys: 用来匹配规则pattern的所有key.
② exists: 用来判定指定的key是否存在.
③ (p)expire: 给key设置过期时间. ---> redis的过期策略
④ (p)ttl: 查询key的过期时间.
⑤ type: 查询key对应的value类型.
⑥ del: 删除指定的key
感谢你的阅读
祝你好运,向阳而生~