以下内容皆为作者总结,由于才疏学浅,总结不当之处还望诸位大佬指出!
什么是Redis
Redis是一个数据库,他的数据都存放在内存中,读写的速度非常快,适用于缓存,存储的时Key-value键值对数据
为什么Redis速度那么快?
1. redis基于内存,内存的访问速度是磁盘的上千倍。
2. redis内置了很多种优化过的数据结构。
3. redis有一套事件处理模型,基于单线程和Io多路复用。
Redis适用的场景
1.热点数据缓存。
2.排行榜。
3.分布式锁。
4.分页查询、模糊查询。
5.地图信息分析。
6. ......
Redis的数据类型
五种基本数据类型
1、String
String 可以存储字符串、数字和二进制数;
除了value是String类型外,所有的key也可以是String;
String最大的存储大小可以为2M的数据;
2、List
List有序且可重复,底层是链表。
3、Set
Set无序不可重复
4、Hash
5、Zset
zset是有序不可重复的,它通过给每个元素设置一个score来作为排序的依据;
三种特殊类型
1、HyperLogLogs :基数统计
2、Bitmap :位存储
3、Geospatial :地理位置
Redis持久化策略
为什么要进行持久化
因为数据是基于内存的,内存断电数据就会消失。如果数据消失了,从后端恢复比较困难。
Redis使用数据持久化来恢复数据。
持久化的方式
只要使用三种方式:RDB、AOF、RDB-AOF混合
RDB
RDB就是把当前的进程以生成快照的形式保存到硬盘。这是Redis默认的持久化方式
RDB的触发方式有两种:
1、手动触发:通过Sava 和 bgsave 命令
2、自动触发:通过设置配置选项,自动触发bgsave命令
RDB的优点:
1、存储的快照是压缩格式,占用内存极小。
2、数据恢复的速度很快。
RDB的缺点:
1、不能实时
2、每次调用bgsave命令都会调用fork子进程,这是重量级操作,执行成本高。
AOF
AOF以独立日志的方式记录了每次写入的命令,先写内存,后写日志。
AOF的优点:
解决了RDB不能实时的问题。
ADF缺点:
1、速度比RDB慢
2、占用的资源大
RDB-AOF混合
结合RDB和AOF的共同优点。
内存快照以一定的频率执行,在这两次快照之间,使用AOF日志来记录这期间的操作。
是比较常用的持久化策略。
Redis如何实现分布式锁
1、什么是分布式锁
当不在同一个系统的多个进程去访问同一个资源,可能会出现一些问题,用分布式锁控制多个进程对资源的访问。
2、redis如何实现分布式锁
1、使用String类型存一份代表锁的数据,通过setnx ..命令加锁,并设置过期时间。
将加锁命令、过期命令编排到一起,把他们变成原子操作,这样可以避免死锁。
2、基于setnx、get、getset的分布式锁
从高可用层面看,前两种有所欠缺,当redis是单点的情况下,发生故障时,整个业务的分布式锁都无法使用。
3、基于RedLok的分布式锁
基于多个Redis节点,它的基本逻辑如下:
- 这些节点相互独立,不存在主从复制或者集群协调机制;
- 加锁:以相同的KEY向N个实例加锁,只要超过一半节点成功,则认定加锁成功;
- 解锁:向所有的实例发送DEL命令,进行解锁;
4、基于Redisson的分布式锁
缓存穿透、缓存击穿、缓存雪崩的区别
1. 缓存穿透
客户端访问不存在的数据,请求服务直达数据库上,没有经过缓存。
解决方法:
a. 缓存空对象:
数据库没有命中后就返回个空值存到缓存中,下次在访问这个数据的时候缓存层直接返回空值。
b. 布隆过滤器:
将数据存入布隆过滤器,访问缓存之前经过过滤器拦截,如果请求的数据不存在直接返回空值。
2. 缓存击穿
一份热点数据,在其缓存失效后,客户端大量的访问这个数据,直接访问到数据库上,造成宕机。
解决方法
a. 将缓存中的热点数据设置为 永不过期 或者 过期时间比较长。
b. 加互斥锁:
请求数据库写数据到缓存之前,先获取互斥锁,保证只有一个请求会落到数据库上,减少数据库的压力。
当一个线程访问该数据时,其他线程只能等待。
这个线程访问过后,缓存中的数据将被重建,届时其他线程就可以直接从缓存中取值。
3. 缓存雪崩
缓存雪崩指的是缓存的大面积的请求访问失效(大量的数据过期),直接访问到数据库,造成数据库崩溃。
解决方法:
a. 避免大量数据同时过期,设置缓存随机过期时间。
b. 启用降级和熔断措施
c. 设置热点数据永不过期
d. 采用resid集群,一个宕机,别的还能用。
redis如何与数据库保持数据一致性
先更新数据库,在删除缓存,如果缓存删除失败,则采用重试机制(重试,直到成功)解决。
Redis 和 Memcached 的区别和共同点
共同点 :
1. 都是基于内存的数据库,一般都用来当做缓存使用。
2. 都有过期策略。
3. 两者的性能都非常高。
区别 :
1. Redis 支持更丰富的数据类型(支持更复杂的应用场景)。
2. Redis 支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用,
而 Memcached 把数据全部存在内存之中。
3. Redis 有灾难恢复机制。-- 持久化
4. Memcached 是多线程,非阻塞 IO 复用的网络模型;Redis 使用单线程的多路 IO 复用模型。
为什么要用 Redis?或者说我们为什么要用缓存?
高性能
假如用户第一次访问数据库中的某些数据的话,这个过程是比较慢,毕竟是从硬盘中读取的。
但是,如果说,用户访问的数据属于高频数据并且不会经常改变的话,那么我们就可以很放心地将该用户访问的数据存在缓存中。
操作缓存就是直接操作内存,所以速度相当快。
高并发
直接操作缓存能够承受的数据库请求数量是远远大于直接访问数据库的,所以我们可以考虑把数据库中的部分数据转移到缓存中去,这样用户的一部分请求会直接到缓存这里而不用经过数据库。进而,我们也就提高了系统整体的并发。
Redis的 过期键 的 删除策略
Redis的过期策略就是指当 Redis中缓存的key过期了,Redis该如何处理。
Redis是key-value数据库,我们可以设置Redis中缓存的key的过期时间。
Redis中同时使⽤了 惰性过期 和 定期过期 两种过期策略。
惰性过期
只有访问这个key时,才会判断这个key是否过期,若过期就删除。
缺点是:如果有大量的key都过期了,但是没有访问,他就不会自动清除,会占用内存。
定期过期:
每隔一定的时间,自动扫描一部分的key,如果过期就清理。(批量清理)
redis事务的实现
1. 事务开始:
执行 MULTI 命令,开启事务;
2. 命令入队:
批量执行redis的命令,先进先出的顺序。
如果客 户端发送的命令为MULTI、EXEC、WATCH、DISCARD中的⼀个,⽴即执⾏这个命令,
否则将命令放⼊⼀个事务队列⾥⾯ 。
3. 事务执行:
客户端发送 EXEC 命令,服务器执⾏ EXEC 命令逻辑。
事务的命令介绍
WATCH 命令是⼀个乐观锁,可以为 Redis 事务提供 check-and-set (CAS)⾏为。 可以监控⼀ 个或多个键,⼀旦其中有⼀个键被修改(或删除),之后的事务就不会执⾏,监控⼀直持续到 EXEC命令。
MULTI命令⽤于开启⼀个事务,它总是返回OK。 MULTI执⾏之后,客户端可以继续向服务器发送 任意多条命令,这些命令不会⽴即被执⾏,⽽是被放到⼀个队列中,当EXEC命令被调⽤时,所有 队列中的命令才会被执⾏。
EXEC:执⾏所有事务块内的命令。 返回事务块内所有命令的返回值,按命令执⾏的先后顺序排列。当操作被打断时,返回空值。
DISCARD:通过调⽤DISCARD,客户端可以清空事务队列,并放弃执⾏事务, 并且客户端会从事务状态中退出。
UNWATCH命令可以取消watch对所有key的监控。
Redis 主从复制的核心原理
什么是主从复制?
主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。
前者称为主节点(master),后者称为从节点(slave);
数据的复制是单向的,只能由主节点到从节点。
主库进行读写操作,写入的内容会同步到从库,但是从库只能读取,不能写入。
一个主库可以有多个从库,但一个从库只能有一个主库。
主从复制类型
全量复制、增量复制
全量复制
比如第一次同步的时候,复制全部的数据
增量复制
把主从库 网络断链 的时候,从库未收到的数据 同步给从库
Redis 主从复制主要是通过 PSYNC 命令实现。
复制分为 部分复制 以及 完整复制。
部分复制通过 复制偏移量、复制积压缓冲区、服务器ID来实现。
完整复制通过 RDB 以及 复制积压缓冲区来实现。
主从复制主要解决的是 数据备份、读写分离的问题。
为什么主从全量复制使用RDB而不使用AOF?
RDB文件内容是经过压缩的二进制数据,文件很小。
传输RDB文件可以尽量降低对主库机器网络带宽的消耗,从库在加载RDB文件时,一是文件小,读取整个文件的速度会很快,二是因为RDB文件存储的都是二进制数据,从库直接按照RDB协议解析还原数据即可,速度会非常快.
Redis集群策略
Redis提供了三种集群策略:
1、主从模式
2、哨兵模式
3、Cluster模式
1、主从模式
主库可以读写,并且会和从库进⾏数据同步 ,但是但主库或从库宕机后,客户端需要⼿动修改IP。
这种模式也⽐较难进⾏扩容,整个集群所能存储的数据受到某台机器的内存容量 。
2、哨兵模式
1、在主从的基础上新增了哨兵节点,当主库节点宕机后,哨兵会发现主库节点宕机,然后在从库中选择⼀个库作为新的主库。
2、哨兵也可以做集群,从⽽可以保证但某⼀个哨兵节点宕机后,还有其他哨兵节点可以继续⼯作 。
3、但是仍未解决扩容问题。
3、Cluster模式
Cluster模式是⽤得⽐较多的模式,它支持多主多从,这种模式会按照key进⾏槽位的分配,可以使得不同的key分散到不同的主节点上,利⽤这种模式可以使得整个集群⽀持更⼤的数据容量,同时每个主节点可以拥有⾃⼰的多个从节点。
如果该主节点宕机,会从它的从节点中选举⼀个新的主节点。
如果Redis要存的数据量不大,可以选择哨兵模式,如果Redis要存的数据量⼤,并且 需要持续的扩容,那么选择Cluster模式。