1.1 什么是redis?
- redis本质是一个Key–Value类型的内存数据库
- 整个数据库加载到内存中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存
- 因为是内存操作,redis的性能非常出色,每秒可以处理超过10万次读写操作,是最快的key-values数据库
1.2 redis特点
- redis为什么快?
- 纯内存操作
- 单线称避免上下文切换
- 非阻塞IO多路复用机制
- redis缺点
- 内存限制,不能用作海量数据储存
1.3 redis五种数据类型
-
说明:
- redis中所有数据结构都以唯一的key字符串作为名称,然后通过唯一的key来获取对应value得值
- 不同的数据类型结构差异就在于value的结构不一样
1.3.1 字符串(string)
- value的数据结构
1. 字符串value的数据结构类似于数组,采用与分配容易空间来减少内存频繁分配
2. 当字符串长度小于1M时,扩容就是加倍现有空间
1.3.2 列表 list
- value的数据结构(双向链表)
1. 列表的数据结构是双向链表,意味着插入和删除的时间复杂度是0(1),索引的时间复杂度为0(n)
2. 当列表弹出最后一个元素后,该数据结构会被删除,内存被回收
1.3.3 hash 字典
- value的数据结构(HashMap)
- redis中的字典也是HashMap(数据+列表)的二维结构
- 不同的是redis的字典的值只能是字符串
- hash的使用场景(缓存)
- hash也可以缓存用户信息,与字符串一次性全部系列化整个对象不同,hash可以对每个字段进行单独储存
- 可以获取部分用户信息,节省网络流量
- hash也有缺点,hash结构的储存消耗高于单个字符串
1.3.4 set 集合
1.value的数据结构(字典)
1. redis中的集合相当于一个特殊字典,字典的所有value都位于null 2. 当集合中的最后一个元素被移除后,数据结构会被自动删除,内存被回收 3. set使用场景 1. set结构可以用来储存某个活动中,中间的用户ID,因为有去重功能,可以保证同一个用户不会中奖两次
1.2.5 zset 有序集合
- value的数据结构 (跳跃列表+字典)
1. zset 一方面是一个set,保证了内部的唯一性
2. 另一个方面可以给一个value赋予一个值,代表这个value的权重
3. zset内部实现用的是一种跳跃列表的数据结构
4. zset最后一个元素被移除后,数据结构就会被自动删除,内存也会被回收 - zset应用场景
- 排行榜
- 粉丝列表:value(粉丝id)、score(关注时间)、可以轻松关注事件排序
redis数据同步
-
CPA原理
- CPA原理是分布式储存理论的基石:c(一致性)、A(可用性)、P(分区容忍性)
- 当主从网络无法连接时,修改操作无法同步到节点,所以一致性无法满足
- 除非我们牺牲可用性,就是暂停分布式节点服务,不再提供修改数据功能,直接到网络恢复
- 一句话概括CPA:放网络分区发生时,一致性可用行两难全
-
全量同步(快照同步):RDB
注:redis全量复制一般发生在slave初始化阶段,这是slave需要Mater上的所以数据都复制一份 1. 从服务器连接主服务器,发送SYNC命令 2. 主服务器接收到SYNC命令后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有命令 3. 主服务器BGSAVE执行完后,向所有从的服务器发送快照文件,并在发送期间继续记录被执行的写命令 4. 从服务器接收到快照文件丢弃旧文件,载入收到的快照 5. 主服务器快照发送完了开始向从服务器发送缓冲区中的写命令 6. 从服务器完成载入快照,开始接受命令,并执行来自主服务器缓冲区的写命令 7. 这是从服务器就可以接收到来自用户的读请求
-
增量同步:AOF
- 指的是redis增量slave正常工作了主服务器发生的写操作同步到从服务器的过程
- 增量同步的过程是主服务器执行一个写命令就会向从服务器发送相同的命令,从服务器接收到并执行写命令
-
redis主从同步策略
- 主从刚刚连接的时候,进行全量同步,全同步结束后,进行增量同步
- 当然,如果有需要,slave在任何时候都可以发起全量同步
- redis策略是,无论如何,首先进行增量同步,如果不成功,要求从机进行全量同步
-
注意点
- 如果多个slaave短线了,需要重启时候,因为只有slave启动,就发送sync请求和主机全量同步
- 当多个同时出现的时候,可能会导致Master IO 剧增 宕机。
-
主从原理
- 和MySQL主从复制的原因一样,Redis虽然读取写入的速度都特别快,但是也会产生读压力特别大的情况。
- 为了分担读压力,Redis支持主从复制,Redis的主从结构可以采用一主多从或者级联结构。
- Redis主从复制可以根据是否是全量分为全量同步和增量同步。
- 注:redis主节点Master挂掉时,运维让从节点Slave接管(
redis主从默认无法自动切换,需要运维手动切换
)
-
主从复制优点
- 主服务器可以将数据同步到从服务器,可以进行读写分离
- 可以分载Master的读操作压力,slave服务器可以给客户端提供只读服务,写服务必须由Master完成
-
主从复制的缺点
- redis不具备自动容错和修复功能,主机从机一旦宕机都会倒是前端读写请求失败
- 需要人工介入,需要重启或手动切换前端的IP才能恢复
- 主机宕机,宕机前由数据没同步到从机,切换IP后还会引入数据不一致的问题,降低了系统的可用性
哨兵模式
- sentinel 作用
1. 当用redis作主从策略,加入Master宕机,redis本事无法自动进行主备切换
2. redis-sentinel 是一个独立运行的进程,他能监控多个Master集群,发现Master宕机后自动切换 - sentinel原理
- sentel负责监控主节点的健康,当主节点挂掉时,自动切换一个最优的从节点切换成主节点
- 从节点连接集群是会首先连接sentel,通过sentel来查询主节点地址
- 当主节点发生故障时,sentel会将最新的主节点地址告诉客户端,可以实现不误重启自动切换redis
- sentel支持集群
- 只使用单个sentinel进程来监控redis集群是不可靠的,当sentinel进程进入宕机后sentinel本身也有单点问题
- 如果有多个sentinel,redis客户端可以随意连接任意一个sentinel来获取关于redis集群洪中的信息
- 哨兵模式的优缺点
- 优点
- 哨兵模式是基于主从模式,所有主从的优点,哨兵模式都具有
- 主从可以自动切换,系统更健壮,系统可用性更高(可以看作自动版的主从复制)
- 缺点
- redis较难支持在线扩容,在集群量达到上限是在线扩容会变得很复杂
redis 雪崩、穿透、击穿
-
缓存穿透(查询一个不存在的key)
- 定义
- 是指查询一个不存在的数据,由于缓存不命中,接着查询数据库也查不到结果
- 虽然也不会写入缓存中,但是会导致每个查询都会请求数据库,造成缓存穿透
- 解决方案:布隆过滤器
- 对所有可查询到的数据与hash格式储存,在这个控制层先进行校验,不符合则丢弃,从而避免对储存层查询
- 定义
-
缓存击穿
热点key突然失效,倒是直接查询mysql 1. 定义 1. 就是这个key非常热点,访问非常频繁,处于集中式高并发访问情况 2. 这个key在失效瞬间,大量的请求就击穿了缓存,直接访问数据库 2. 解决方法 1. 可以将热点数据设置成永远不过期 2. 或者基于 redis 实现互斥锁,等待一个请求构建完缓存之后,在释放锁,进而其他请求才能通过该key访问数据
-
缓存雪崩(缓存层全部失败)
- 定义
- 由于缓存层承载着大量的请求,有效的保护着储存曾,但是因为某种原因不提供服务
- 于是所有请求就会达到储存曾,储存曾调用会暴增,造成储存曾也会挂掉
- 解决方法
- 保证缓存层服务高可用性
- 依赖隔离组件为后端限流降级处理
- 定义
布隆过滤器
-
布隆过滤器是什么?
-
本质上是一种数据类型,比较巧妙的概率型数据结构
-
特点是搞笑的插入和查询,可以用来告诉某个东西一定不存在后者可能存在
-
相比于传统的list、set、map、等数结构,他更高效,占用空间少,缺点就是返回的结果是概率性的,不是确切的
-
使用
- 在nosql数据库领域运用的非常广泛
- 当用户来查莫一个row时,可以先通过布隆过滤器 过滤掉大量的不存在的row,然后再去查询磁盘
- 布隆过滤器说这个值不存在,那就是一定不存在,可以降低数据库的IO请求数量
5 . 应用场景
- 场景一(给用户推荐新闻)
- 当用户看过的新闻坑定会被过滤掉,对于没看到的新闻,可能会过滤极少一部分
- 这样可以保证推送给用户的新闻都是无重复的
- 场景二(爬虫url去重)
- 在爬虫系统中,我们需要对url去重,已经爬取的页面不在爬
-