全局命令
Redis 有 5 种数据结构,它们是键值对中的值,对于键来说有一些通用的命令。
查看所有的键
keys *
![](https://img.haomeiwen.com/i6335892/e662957032598f1f.png)
键的总数
dbsize
![](https://img.haomeiwen.com/i6335892/fcd0ea652b9a8e16.png)
使用dbsize
会获取 Reids 内置的键总数变量,而 keys
命令会遍历所有键。所以,当 Redis 保存了大量键时,线上环境禁止使用。
检查键是否存在
exists key
删除键
del key [key ...]
![](https://img.haomeiwen.com/i6335892/3e9d4108c1528602.png)
键过期
expire key seconds
![](https://img.haomeiwen.com/i6335892/dc92a2c93f005232.png)
该命令会返回 3 种可能的值:
- 大于 0 的整数,表示键剩余的过期时间
- -1, 表示键没有设置过期时间
- -2, 表示键不存在
也可以通过ttl
命令来查看键的剩余时间。
键的数据结构类型
type key
![](https://img.haomeiwen.com/i6335892/ea84605ae96cf1b6.png)
数据结构和内部编码
每种数据结构都有自己底层的内部编码实现,而且是多种实现,在合适的场景下使用合适的内部编码。
查看内部编码
object encoding
![](https://img.haomeiwen.com/i6335892/5dbb2ac2cd78ac76.png)
这种设计的好处有两个:
- 可以改进内部编码,且不影响用户的使用。
- 多种内部编码可以适用于多种场合,充分利用不同编码的不同特性。
单线程架构
Redis 使用了单线程架构和 I/O 多路复用模型来实现高性能的内存数据库服务。
每一条从客户端到服务器的命令都会被加入队列,之后轮询执行。也就说,同一时刻,不会有两条命令执行。
同时,因为一下原因,所以这样单线程也能十分高效:
-
纯内存访问
内存的响应时间大约为100纳秒,这是 Redis 达到每秒万级别访问的重要基础。
-
非阻塞 I/O
Redis 使用 epoll 作为 I/O 多路复用技术的实现,再加上 Redis 自身的事件处理模型将 epoll 中的链接、读写、关闭都转换为事件,不在网络 I/O 上浪费太多的时间。
-
单线程避免了线程切换和竞态产生的消耗
但是单线程会产生一个问题:对于每个命令的执行时间是有要求的。如果某个命令执行过长,会造成其他命令的阻塞。
网友评论