参考:图解Redis介绍 | 小林coding (xiaolincoding.com)
目录
Redis的优点?
快,就是快。
Redis基于内存的数据库,对数据的读写都是在内存中完成的,所以它的读写速度非常快,适用于服务器与数据库间的缓存,还可以用来做分布式锁,秒杀,消息队列。
Redis为什么快?
1 因为它是基于内存的数据库,对数据的读写都是在内存中完成的。
2 并采用了高效的数据结构,cpu不是瓶颈,自然采用单线程的解决方案)
这句话多意思就是说,cpu并不是影响redis读写操作速度的因素
其次是它采用的是单线程,相比多线程快,避免了多线程之间等竞争,
省去了多线程切换带来的时间和性能上的开销,也不会导致死锁问题
3 redis采用了I/o多路复用机制处理大量的客户端socket请求,啊啊啊这是神马!
为什么要用redis作为mysql的缓存?
因为redis具备高性能,高并发两种特性
redis具备高性能:
用户第一次访问mysql中的某些数据,这个过程会很慢,因为是从硬盘上读取的。将该用户访问的数据缓存在redis当中,下一次访问的时候就可以直接从缓存中获取了,
操作redis直接就是操作内存,所以速度非常快
redis具备高并发:
补充:直接访问redis能够承受的请求上远远大于直接访问mysql的,把数据库中的部分数据放到redis中,这样一部分请求会直接到缓存里而不用经过数据库
五种常见redis数据类型:
String,Sett,Zset,Hash,Lsit
三种持久化方式:
AOP日志:每执行一条执行操作命令,就把该命令以追加的方式存到文件当中
RDB快照:将某一时刻的内存数据,以二进制的方式写入磁盘
混合持久化:就是集成aop和RDB快照这两种方式的优点
持久化的意思是什么,就是说我们接收客户端写入,第一次读写数据库是MySQL读写的,是在硬盘当中读写的,所以会很慢,然后下一次重启redis的时候之前的数据都消失了,那怎么办呢?就是将这些数据存入redis当中,下一次访问的时候就不用再经过数据库了,直接来到redis里面读写,所以会很快
补充:持久化机制会把数据存储到磁盘,这样在redis重启就能够从磁盘中恢复原有的数据
redis单线程:
redis单线程指的是:当接收到客户端请求后,redis就解析这个请求,并进行数据读写操作,然后发送给客户端
redis是单线程的,但是redis程序不是单线程的。
因为在redis启动的时候,后台线程也启动了,然后把这些线程放到主线程当中处理,就容易造成线程拥塞
关闭文件任务队列:当队列有任务后,后台线程会调用关闭文件任务队列关闭文件
AOF刷盘任务队列:刷盘
lazy_free任务队列:释放
redis采用单线程为什么还这么快?
1 redis大部分操作都是在内存中进行的,所以快
2 redis采用单线程模型可以避免多线程之间的竞争
3 redis采用了i/o多路复用机制
redis6之前还在用单线程,redis6版本之后引入了多线程,但是执行命令的还是单线程,不代表执行的是多线程命令
补充:redis6.0版本引入的多线程i/o特性对性能的提升至少是一倍以上
其次不会出现多线程的那些问题,多线程会比较复杂,还有线程切换,加锁解锁,出现死锁问题等
分布式锁
满足分布式系统或者集群模式下多线程可见并且互斥。
1分布式系统 集群模式
2多线程可见 互斥
四个关键词
分布式锁的实现和四个特性?
可靠性,安全性,对称性,互斥性。
可靠:不管做什么都要考虑它可靠不可靠吧
互斥:就是要保证每一个竞争者都有自己的锁
补充:锁的目的是获取资源的使用权,所以只让一个竞争者持有锁,这一点要保证啊,
安全:能够避免死锁情况发生(我去这里乱套了把对称性的点都写到这来了)
补充:当一个竞争者在持有锁期间,由于意外崩溃-》而导致未能主动解锁,不要慌,其持有的锁也能被正常释放 并保证后续其他竞争者也能加锁
对称性:同一个锁,加锁和解锁都要在同一个竞争者上,不能其他的竞争者释放了锁,
可不可以用一条语句来完成加锁操作
可以。
补充:Redis的set命令有个NX参数可以实现(key不存在才插入),所以可以用它来实现分布式锁
key不存在,则插入成功,加锁成功
key存在,则插入不成功,加锁失败
AOF日志是如何实现的
redis在执行完一条操作命令后,就会把改命令以追加的方式写入一个文件里,然后redis重启时,会读取文件记录的命令,然后逐一执行的命令来进行数据恢复
为什么要先执行命令,然后再把数据写入日志呢
为了避免额外的检查开销
你要是先把命令写入日志再执行,那日志里的命令是对是错都不知道,redis在使用日志恢复数据的时候就容易出错
不会阻塞当前操作命令的执行
那肯定啊,你在那写入日志是不是就会影响了操作命令的执行效率
缺点:
数据可能会丢失:执行命令和写入日志是俩进程,你在执行命令的时候还没来得及写入日志,服务器就宕机了。。。
可能会阻塞其他操作的执行,具体是什么操作我也不知道
AOF日志文件
AOF重写工作原理:就是客户端写入两条命令,一条是set name xiaolin,另一条是set name yixiaolin,然后redis执行这两条命令,最后以一条命令set name yixiaolin写入AOF日志文件当中
补充:扫描数据库中所有数据,逐一把内存数据的键值对转换成一条命令,再将命令记录到重写日志