IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Redis的相关总结 -> 正文阅读

[大数据]Redis的相关总结

1 为什么要使用redis?

主要从“高性能”和“高并发”这两点来看待这个问题

  • 并发能力强:mysql的并发能力是最多支持150个连接(默认),redis读支持10w-15w次/秒,写支持8w-10w次/秒
  • 速度快,因为redis直接内存作为存储媒介,速度快

2 redis为什么这么快?

  • 完全基于内存,绝大部分操作也都是纯粹的内存操作,非常快速

  • 采用单线程+多路IO复用技术,因为单线程,避免了上下文切换的时间,同时也避免了多线程的资源争抢,避免了死锁的发生,所以快

    多路:多个socket、多个客户端、多个黑窗口

    ? 复用:复用那一个线程

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lmT2rP4c-1651842992010)(assets/1651799971937.png)]

  • 数据结构简单,对数据的操作也非常简单(与关系型数据库对比)

3 Reids中有哪些数据类型?各自的特点是啥?

? 1 String:字符串类型,一个key对应一个值,可以存储任何内容,图片、视频都行,但是大小限制在512m以内

? 2 List:单键多值,值可以重

? 3 set:单键多值,值不可以重复

? 4 Hash:key后面跟field属性,从而确定一个值

? 5 zSet:单键多值,有序不重复集合,可以自动排序

4 Redis的使用场景?你在项目的哪些地方使用过redis?

  • 计数器:可以对 String 进行自增自减运算,从而实现计数器功能。Redis 这种内存型数据库的读写性能非常高,很适合存储频繁读写的计数量。

  • 缓存:将热点数据放到内存中,设置内存的最大使用量以及淘汰策略来保证缓存的命中率。

  • 消息队列(发布/订阅功能):List 是一个双向链表,可以通过 lpush 和 rpop 写入和读取消息。不过最好使用 Kafka、RabbitMQ 等消息中间件。

  • 分布式锁实现:在分布式场景下,无法使用单机环境下的锁来对多个节点上的进程进行同步。可以使用 Redis 自带的 SETNX 命令实现分布式锁。

  • 计数器:探花交友,给mongoDB的表生成自动增长的数字

  • 缓存:探花交友,推荐好友列表、推荐动态列表、推荐视频列表,权限认证的验证码等等

  • 消息队列:集信达项目,将发送短信的任务丢进redis的队列中,消费者从redis的队列中取出任务,发送短信

  • 分布式锁:秒杀项目,防止超卖

5 什么是redis的持久化?

? 持久化就是把内存中的数据写到磁盘上,防止服务宕机了内存数据丢失。

6 redis的持久化机制是什么?各自的优缺点是啥?

? redis提供两种持久化机制:RDB(默认)和AOF

  • RDB:

    • RDB持久化可以手动执行也可以根据配置定期执行,它的作用是将某个时间点上的内存中的数据保存到RDB文件中,RDB文件是一个压缩的二进制文件,通过它可以还原数据。由于RDB文件是保存在硬盘上的,所以即使redis崩溃或者退出,只要RDB文件存在,就可以用它来恢复数据。
    • 可以通过save或者bgsave来生成RDB文件。
    • SAVE命令会阻塞redis进程,直到RDB文件生成完毕,在进程阻塞期间,redis不能处理任何命令请求,这显然是不合适的。
    • BGSAVE则是会创建一个子进程,然后由子进程去负责生成RDB文件,父进程还可以继续处理命令请求,不会阻塞进程。
    • 缺点:RDB的持久化是间隔一段时间发生,可能会造成数据丢失
  • AOF:

    • AOF和RDB不同,AOF保存的是命令,将写的命令保存起来。

    • AOF通过追加、写入、同步三个步骤来实现持久化机制。

    ? 1.当AOF持久化处于激活状态,服务器执行完写命令之后,写命令将会被追加aof缓冲区的末尾

    ? 2.在服务器结束一个事件之前,将会调用flushAppendOnlyFile函数决定是否要将AOF缓冲区的内容保 存到AOF文件中,可以通过配置appendfsync来决定。

    ? 配置如下:

always实时同步
everysec每秒同步
no同步时间由操作系统决定

默认选项将会是everysec,每秒同步

? AOF的缺点:因为恢复需要重新执行命令,可能会执行很多冗余的命令,造成效率低下

  • RDB和AOF比较
    • RDB持久化的是数据,而AOF持久化的是命令
    • AOF文件的更新频率高于RDB的更新频率
    • AOF的数据安全性更好,不容易丢失数据
    • RDB的性能比AOF好
    • 如果两个都配置了,优先加载AOF

?

?

7 Redis的过期键的删除策略是啥?

redis主要有2种过期删除策略

  • 惰性删除

惰性删除指的是当我们查询key的时候才对key进行检测,如果已经达到过期时间,则删除。显然,他有一个缺点就是如果这些过期的key没有被访问,那么他就一直无法被删除,而且一直占用内存。

  • 定期删除

定期删除指的是redis每隔一段时间对数据库做一次检查,删除里面的过期key。由于不可能对所有key去做轮询来删除,所以redis会每次随机取一些key去做检查和删除。

8 什么是哨兵模式?

主从架构中,主机宕机,从机无法自动上位,需要手动上位,而哨兵机制就是自动上位

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HUBI03nj-1651842992013)(assets/1651803293464.png)]

1.基于主从方案的缺点还是很明显的,假设主机宕机,那么就不能写入数据,那么从机也就失去了作用,整个架构就不可用了,除非你手动切换,主要原因就是没有自动故障转移机制。而哨兵具备自动故障转移、集群监控、消息通知等功能。

2.哨兵可以同时监视多个主从服务器,并且在被监视的主机下线时,自动将某个从机提升为主机,然后由新的主机继续接收命令。

3.哨兵会每隔1秒向所有实例(包括主从服务器和其他哨兵)发送ping命令,并且根据回复判断是否已经下线,这种方式叫做主观下线。当判断为主观下线时,就会向其他监视的哨兵询问,如果超过半数的投票认为已经是下线状态,则会标记为客观下线状态,同时触发故障转移。

9 缓存雪崩是什么?解决方案?

  • 缓存雪崩:redis中不存在这些key,数据库中存在,这些key在某一时间集中过期了,当大量请求过来的时候,请求会直接打到数据库上,引起数据库崩溃

  • 解决方案:

    • 加锁
    • 多级缓存
    • 设置key 的不同的过期时间,比如固定的过期时间上在随机1-10分钟

10 缓存穿透?解决方案?

  • 缓存穿透是指查询内存和数据库都不存在的数据,每次请求都会打到数据库上,从而压垮数据库。

  • 解决方案:

    • 1 缓存null:根据id=30000去数据可查找user,user=null,也将user=null放到redis中
    • 2 使用布隆过滤器:是一种数据结构,判断值肯定不存在或者可能存在
      • 准备一个足够长的bitmap数组,每个位置的默认值是0,将值存入数据库的时候,同时将key存入布隆过滤器,提供3个hash函数,对key进行hash,hash的位置放1
      • 查找key的时候,先去布隆过滤器中获取这个key的3个hash值,在根据hash值去布隆过滤器中获取值,三个值中有一个0,代表数据肯定不存在,如果三个值都是1,代表可能存在,再去数据库查找数据

在这里插入图片描述

11 缓存击穿?解决方案?

  • 缓存击穿:redis中不存在这个key,数据库中存在,key在redis中过期了,当大量请求过来的时候,请求会直接打到数据库上,引起数据库崩溃
  • 解决方案:
    • 加锁:操作数据库的时候加锁
    • 当某一个请求去数据库查询的时候,同时在redis中将值设为null,待他从数据库查到数据返回后,设置具体的值

12 如何保证缓存与数据库双写是的数据一致性?双写不一致肯定会发生

? 你只要使用缓存,使用数据库,就会发生双写不一致的问题!如何解决呢?

? 采用延时双删策略

  • 删除缓存
  • 更新数据库
  • 休眠xx秒
  • 删除缓存

13 分布式锁Redission执行原理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9D4LG9gy-1651842992016)(assets/image.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Yb1LE9M4-1651842992017)(assets/1651818608449.png)]

  • 原理

  • 为什么要使用lua语言
    因为一大堆复杂的业务逻辑,可以通过封装在lua脚本中发送给redis,保证这段复杂业务逻辑执行的原子性

  • 为什么要设置锁的过期时间?

    Redis分布式锁,一旦客户端没有释放锁,服务端就会一直持有这个锁的,其他进程中的线程是获取不了锁的,从而出现死锁。
    比如以下这两种情况:
    1.网络抖动
    进程A中的一个线程获取到了锁,然后执行finally中的释放锁的代码时,由程序到Redis的网络不好了,所以释放锁失败。此时对于redis服务端来说,它可不知道客户端曾经试图释放过锁,它会一直把锁给A,如此一来,其他进程的线程再也不能获取到这个锁了。
    如果用设置过期时间的方式,即使客户端和服务端的网络不通了,服务端依然在进行时间的计算,时间到了直接把锁释放掉,等网络通了,不影响获取锁。

    2.服务端宕机
    进程A获取到了锁,Redis服务器宕机了,所以锁没有释放。等到Redis再次恢复的时候,Redis服务端还会保持这这个锁给到A,就会锁死。
    如果是设置了过期时间的话,服务器恢复后就会继续倒计时,时间到了服务器自动把锁释放。

  • 看门狗策略是啥?

    1、客户端1加锁的默认生存时间是30秒,如果超过了30秒,客户端1还想一直持有这把锁,怎么办呢?

    Redisson中客户端1一旦加锁成功,就会启动一个watch dog看门狗,他是一个后台线程,会每隔10秒检查一下,如果客户端1还持有锁key,那么就会不断的延长锁key的生存时间。

    2、如果负责存储这个分布式锁的Redission节点宕机后,而且这个锁正好处于锁住的状态时,这个锁会出现锁死的状态,为了避免这种情况的发生,Redisson提供了一个监控锁的看门狗,它的作用是在Redisson实例被关闭前,不断的延长锁的有效期。默认情况下,看门狗的续期时间是30s,也可以通过修改Config.lockWatchdogTimeout来另行指定。

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-05-08 08:10:56  更:2022-05-08 08:11:17 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 0:22:10-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码