douyin LSY_HELLOWORLD,已成功入职互联网大厂,请关注我,了解非科班的程序员的工作生活把
Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API。
Redis 通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)等类型。
优点
运行在内存上,读写性能好,10W/S
支持数据持久化
支持事务
支持主从复制
数据结构丰富
缺点
数据库容量受到物理内存的限制
不具备自动恢复功能
主机宕机,从机未能及时同步,导致数据不一致问题
较难支持在线扩容
单线程
Redis是单线程,但并不是只有一个线程,只是网络IO中只有一个线程,因此不需要考虑并发安全性,其他模块,离例如AOF和RDB使用另外线程。
为什么要是设计成单线程?
绝大部分请求是存粹的内存操作,非常快速,足够了
避免了不必要的上下文切换和竞争
非阻塞IO,内部采用epoll多路复用
Redis内部使用文件事件处理器
文件事件处理器包含四部分
多个socket
IO多路复用程序
文件事件分派器
事件处理器(连接应答,命令请求,命令回复)
多个socker对应不同请求,多路复用监听不同的socker,把其放入队列中,文件事件分派器从队列中取出一个事件,交给事件处理器处理。
适用情况
热点数据进行缓存
分布式锁
消息队列
排行榜
计数器
特定限时数据的存放
缓存穿透,缓存击穿和缓存雪崩
缓存穿透是访问的数据在缓存和数据库里都没有,会不断穿过缓存重复访问数据库。
解决办法,对对访问进行校验,不合法的直接返回;如果数据库中没有,则缓存里存一个空置;布隆过滤器;
缓存击穿是数据库中有该数据,但是缓存中该热点数据过期,导致同时访问该数据的请求都越过缓存访问数据库。
解决办法,让热点数据永不过期;
缓存雪崩是一大批数据同时过期,查询这批数据的访问都到了数据库。
解决办法,设置随机过期时间;热点数据永不过期;对于集群部署,将热点数据分布在不同缓存中;应用层限流;多级缓存。
主从复制、读写分离
主库master负责写,同时对数据持久化,从节点根据主库的日志进行重写,实现同步。主库负责写,从库负责读。
哨兵模式
哨兵负责监控redis集群主库的状态,在主库宕机时,要从slave中选择一个升级为master,通知客户端新的master。
RDB快照
1 save命令
主进程来创建RDB快照,创建完成之前,主进程阻塞
2 bgsave命令
主进程fork一个子进程,在fork子进程的时候是阻塞的,由子进程来负责RDB快照
AOF日志
将写入操作记录到日志里实现持久化。
策略三种:
always,每执行一次写入操作就记录到日志中,性能最低
everysec,每秒钟写入一次,性能适中
no,由操作系统决定什么时候写入,性能较高
在服务宕机的时候,丢失数据的程度由低到高。
AOF重写
在AOF文件大到一定程度时,进行重写,将命令合并,写入另一个文件,写完的时候替换原来的,以此来缩小文件大小。