文章目录
  1. Redis基本命令的使用-预备
  2. 1. 通用的一些命令
  3. 2. Redis的数据结构
  4. 3. 单线程架构

[TOC]

Redis基本命令的使用-预备

1. 通用的一些命令

  • 查看所有键
1
$ keys *

示例

1
2
3
4
5
6
7
8
9
10
## 插入字符串类型的键值对
127.0.0.1:6379> set key1 value1
OK
127.0.0.1:6379> set key2 value2
OK

## 示例输出
127.0.0.1:6379> keys *
1) "key1"
2) "key2"
  • 查看键总数
1
dbsize

示例

1
2
3
## 依然是上述插入例子
127.0.0.1:6379> dbsize
(integer) 2

dbsize在计算总数时不会遍历所有键,而是直接获取内置的键总数变量,所以时间复杂度是O(1)。而keys命令会遍历所有键,时间复杂度是O(n),由于Redis是单线程架构(后面会说),所以当存在大量key的时候,线上禁止使用。

  • 检查key是否存在
1
exists key

示例

1
2
3
4
5
## 依然是上述插入例子
127.0.0.1:6379> exists key0
(integer) 0
127.0.0.1:6379> exists key1
(integer) 1

存在返回1,否则返回0

  • 删除键
1
2
3
del key [key ...]

# del是一个通用命令,无论是什么数据类型

示例

1
2
3
4
5
## 依然是上述插入例子
127.0.0.1:6379> del key0
(integer) 0
127.0.0.1:6379> del key1
(integer) 1

返回成功删除键的个数。

  • 键过期
1
2
3
expire key seconds

# 设置键的过期时间,当超过过期时间后,会自动删除键

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
127.0.0.1:6379> set key1 value1
OK
127.0.0.1:6379> expire key1 10
(integer) 1
127.0.0.1:6379> ttl key1
(integer) 8
127.0.0.1:6379> ttl key1
(integer) 6
127.0.0.1:6379> ttl key1
(integer) -2

# ttl返回键剩余的过期时间
* 大于等于0的整数:键剩余的过期时间
* -1:键未设置过期时间
* -2:键不存在
  • 查看键的数据结构类型
1
2
3
4
type key

# 返回string, list, set, zset 和 hash。
# 键不存在,返回none

示例

1
2
3
4
127.0.0.1:6379> set key1 value1
OK
127.0.0.1:6379> type key1
string

2. Redis的数据结构

  • 数据结构的内部编码实现,如下图
1
2
127.0.0.1:6379> object encoding key1
"embstr"

内部编码的好处

  1. 当内部编码改变时,对外的数据结构和命令没有影响,用户感知不到。
  2. 多种编码实现在不同场景可以发挥各自的优点。

3. 单线程架构

Redis使用了单线程架构和I/O多路复用模型

当有多个命令操作redis的时候,所有的命令都会进入一个队列中,然后逐个被执行,不会存在多个命令被同时执行的情况

为什么单线程还这么快?

  • 纯内存访问
  • 非阻塞IO
  • 单线程避免线程切换和竞争产生的消耗

单线程的好处

  • 避免并发操作数据结构的复杂性
  • 避免线程切换和竞争产生的消耗

单线程的问题

  • 如果一个命令执行时间过长,会导致其他命令阻塞(致命)

所以理解单线程模型是开发和运维人员使用和理解Redis的核心之一。

文章目录
  1. Redis基本命令的使用-预备
  2. 1. 通用的一些命令
  3. 2. Redis的数据结构
  4. 3. 单线程架构