Redis笔记
文章目录
- Redis笔记
- 通用命令
- get和set
- keys
- exists
- del
- expire
- ttl
- Redis的key过期策略
- 定时器的实现原理
- type
- 持久化
- RDB(Redis DataBase)---定期备份
- bgsave
- AOF(Append Only File)---实时备份
Redis笔记
Redis是一个“客户端-服务器”结构的程序,客户端和服务器之间通过网络来进行通信
通用命令
官方文档
get和set
127.0.0.1:6379> set key1 value1
OK
127.0.0.1:6379> set key2 value2
OK
127.0.0.1:6379> get key1
"value1"
127.0.0.1:6379> get key2
"value2"
127.0.0.1:6379> get key3
(nil)
keys
- ?:匹配任意一个字符
- *:匹配0个或多个任意字符
- [abcde]:只能匹配到abcde中的一个,别的就不行,相当于给出了固定的选项
- [^e]:排除e,只有e匹配不了,其它的都能匹配
- [a-e]:表示可以匹配a到e闭区间的一个字符
127.0.0.1:6379> set hello 1
OK
127.0.0.1:6379> set hallo 1
OK
127.0.0.1:6379> set hbllo 1
OK
127.0.0.1:6379> set hllo 1
OK
127.0.0.1:6379> set heeeeeeeeeeello 1
OK
127.0.0.1:6379> set heeeeeeeeello 1
OK
127.0.0.1:6379> keys h?llo
1) "hello"
2) "hbllo"
3) "hallo"
127.0.0.1:6379> keys h*llo
1) "hello"
2) "hbllo"
3) "heeeeeeeeeeello"
4) "hallo"
5) "heeeeeeeeello"
6) "hllo"
127.0.0.1:6379> keys h[abe]llo
1) "hello"
2) "hbllo"
3) "hallo"
127.0.0.1:6379> keys h[^e]llo
1) "hbllo"
2) "hallo"
127.0.0.1:6379> keys h[a-e]llo
1) "hello"
2) "hbllo"
3) "hallo"
时间复杂度是O(n),所以在生产环境上,一般会禁止使用keys命令,尤其是keys *
exists
判断key是否存在,时间复杂度O(1)
127.0.0.1:6379> exists hello
(integer) 1
127.0.0.1:6379> exists key1
(integer) 1
127.0.0.1:6379> exists hello key1
(integer) 2
不能将前两个操作等价于第三个操作,我们知道redis是一个客户端-服务器结构的程序,在一次命令的执行就需要客户端向服务器发送一次请求,这个请求是通过网络进行通信的,网络的IO通信速度正常来说要比磁盘IO都要慢的,所以前两次的请求和第三次的请求所消耗的时间是不一样的
del
删除指定key,返回值是删掉的key个数
127.0.0.1:6379> del key2 key3
(integer) 1
expire
给指定的key设置过期时间
- expire key second
- pexpire key 毫秒
返回1表示设置成功。返回0表示设置失败
ttl
获取指定key的过期时间,返回秒,-1表示未设定过期时间,-2表示不存在key
Redis的key过期策略
1、定期删除:每隔一段时间检测Redis中是否有过期的key,并删除。每次抽取一部分验证过期时间,以免阻塞
2、惰性删除:在查询的时候某些key可能没有被删除,但是在查询前会先检查key是否过期,如果过期了就删除key并返回nil
通常是两种结合的方式
定时器的实现原理
- 优先队列:过期时间越早的,优先级越高—但Redis没有采用
- 基于时间轮实现:把时间轮划分成很多小段
Redis过期策略并没有采用以上两种方案
type
返回key对应的value
持久化
为了保证速度快,Redis决定内存中存数据,硬盘上也存数据,理论上两份数据是完全相同的。硬盘的数据只是在Redis重启的时候用来恢复内存的
RDB(Redis DataBase)—定期备份
二进制格式记录
触发时机:
1、手动触发:程序员通过redis客户端执行命令触发快照。save和bgsave,一般不用save
2、自动触发:在redis配置文件中配置
在redis重启之后会加载
bgsave
实现原理:多进程实现并发,达到在背后偷偷备份不影响客户端的请求的效果。fork在进行内存拷贝的时候并不是无脑把所有数据拷贝一份,如果父子进程的数据都完全一样,直接共用一份数据。只有当某一方内存数据做了修改才会真正意义上触发数据拷贝。称为写时拷贝
AOF(Append Only File)—实时备份
文本格式记录
AOF并不会影响到Redis的请求速度:
1、AOF机制并非是直接让工作线程把数据写入硬盘,而是先写入缓冲区,积累一波之后才统一写入硬盘,写入硬盘的次数比一次写入硬盘的大小影响更大,就好比嗑瓜子仍瓜子
2、AOF是顺序存储的,硬盘上顺序读写数据要比随机读写快的
触发时机:
1、手动触发:
2、自动触发: