JAVA面试(六)

缓存

  • Memcached
  • redis
    • Redis常见数据类型和使用
    • Redis缓存持久化
      • RDB-快照
      • AOF-追加文件
    • Redis数据过期机制
      • 惰性删除
      • 定期删除
    • Redis缓存淘汰策略(8种)
      • 算法
        • LRU (Least Recently Used):最近最少使用
        • LFU(Least Frequently Used):最近最少频率使用
    • Redis事务
    • Redis为什么要用分布式缓存
    • Redis集群
      • 主从模式 - 最简单的
      • 哨兵模式
      • Redis Cluster
    • Redis常见问题及解决方案
      • 缓存击穿
      • 缓存穿透
      • 缓存雪崩
      • bigKey
      • 热Key
      • 慢查询命令
      • 如何保障数据库和缓存数据的一致性
        • 延时双删
        • 异步更新缓存
  • MongDB

Memcached

简洁的key-value存储系统,其实是内存中维护一张巨大的Hash表。不支持集群,Memcached彼此之间不进行通信,所以,可能会造成数据丢失。
和redis对比

MemcachedRedis
数据类型只支持key-value
数据持久化Memcached 把数据全部存在内存之中Redis 支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用
集群模式支持没有原生的集群模式3.0 版本起是原生支持集群模式的
线程模型多线程,非阻塞 IO 复用的网络模型单线程的多路 IO 复用模型
特性支持Redis 支持发布订阅模型、Lua 脚本、事务等功能
过期数据删除只用了惰性删除策略惰性删除策略、定期删除策略

redis

redis是一个缓存中间件。
数据基于内存,内存的访问速度比磁盘快很多
单线程,基于I/O多路复用

  • 6.0后支持多线程,但是命令执行还是单线程

Redis 除了可以用作缓存之外,还可以用于分布式锁、限流、消息队列、延时队列等>场景

  • 延时队列:Redisson 内置了延时队列(基于 Sorted Set 实现的)
  • 消息队列:Redis 自带的 List 数据结构可以作为一个简单的队列使用。(Rpush +Lpop)
    Redis 5.0 中增加的 Stream 类型的数据结构更加适合用来做消息队列。
  • 限流: 通过 Redis + Lua 脚本的方式来实现限流。key是ip,value是访问次数
  • redis搜索引擎:借助 RediSearch
  • redis延时任务

Redis常见数据类型和使用

5 种基础数据类型
String(字符串)、List(列表)、Set(集合)、Hash(散列)、Zset(有序集合)。

  • String,二进制安全的,可以存储图片或者序列化的对象,值最大存储为512M
    set key value
    get key
  • Hash
    hset key field value
    hget key field
  • List
    lpush key value [value ...]
    lrange key start end
  • Set(集合)
    sadd key element [element ...]
    smembers key
  • ZSet(有序集合)
    zadd key score member [score member ...]
    zrank key member

3 种特殊数据类型
HyperLogLog(基数统计)、Bitmap (位图)、Geospatial
(地理位置)。

除了上面提到的之外,还有一些其他的比如 Bloom filter(布隆过滤器)open in new
window、Bitfield(位域)。

场景应用:排行耪

选用ZSet,这是一个有序集合。根据score来排序
Zrange (从小到大排序)、 ZrevRange (从大到小排序)、ZrevRank (指定元素排名)。

Redis缓存持久化

4.0之后,RDB 和 AOF 混合使用实现持久化

RDB-快照

AOF-追加文件

Redis数据过期机制

设置expire(过期时间)后才会触发。
Redis 采用的是 定期删除+惰性/懒汉式删除 结合的策略

惰性删除

当查询key时候,先看该key是否过期,没有过期就返回数据;负责,删除该key,且不返回数据

定期删除

在一定时间,随机抽取设置过期时间的key,若这些含的key大部分过期,就删除这些过期key

  • Redis 的定期删除过程是随机的(周期性地随机从设置了过期时间的 key 中抽查一批),所以并不保证所有过期键都会被立即删除。这也就解释了为什么有的 key 过期了,并没有被删除。

  • 并且,执行时间已经超过了阈值,那么就中断这一次定期删除循环,以避免使用过多的 CPU 时间

  • 可在配置文件中设置频率
    由 hz 参数控制的。hz 默认为 10,代表每秒执行 10 次

Redis缓存淘汰策略(8种)

当redis内存不够用的时候,当一个新key需要存放时候就会按某种规则将内存中的数据删掉,这个删除规则就是淘汰策略。

  • noeviction:默认策略。不删除任何key,新增的key也不写入,内部不足直接报错
  • volatile-ttl:对设置TTL时间的key,剩余时间越短的先删除
  • allkeys-random:对全体key随机淘汰
  • volatile-random:对设置TTL时间的key随机淘汰
  • allkeys-LRU:对全体key使用LRU短发淘汰
    有明显冷热数据区分
  • volatile-LRU: 对设置TTL时间的key使用LRU短发淘汰
    数据有置顶的需求 — 置顶数据不设置过期时间,这些数据就一直不被删除,会淘汰其他设置过期时间的数据
  • allkeys-LFU:对全体key使用LFU短发淘汰
  • volatile-LFU: 对设置TTL时间的key使用LFU短发淘汰

算法

LRU (Least Recently Used):最近最少使用

用当前时间减去最后一次访问时间,这个值越大则淘汰优先级越高。

LFU(Least Frequently Used):最近最少频率使用

会统计每个key的访问频率,值越小淘汰优先级越高。

Redis的数据淘汰策略有哪些 ?- 以下回答背熟,大概用时1min。

redis有个策略叫数据淘汰策略,具体指的是当Redis中的内存不够用时,此时在向Redis中添加新的key,那么Redis就会按照某一种规则将内存中的数据删除掉。这个策略redis提供了8种方案,默认的叫noeviction,就是不删除任何数据,内部不足直接报错。方案的切换是可以在redis的配置文件中进行设置的,里面有两个非常重要的概念,一个是LRU,另外一个是LFU。
LRU,即Least Recently Used,意思就是最近最少使用,我们用当前时间减去最后一次访问时间,这个值越大则淘汰优先级越高。
LFU,即Least Frequently Used,意思就是最近最少频率使用。我们会统计每个key的访问频率,值越小淘汰优先级越高。

Redis事务

redis提供了一种命令,可以将多个命令打包一起后按顺序执行,执行途中不会被影响
MULTI(开始事务),EXEC(执行事务)直接包着命令集

Redis为什么要用分布式缓存

Redis集群

https://segmentfault.com/a/1190000043133394

主从模式 - 最简单的

这里是引用
Redis主从复制优点: 做到读写分离,提高服务器性能;
Redis主从复制缺点: 在主从模式中,一旦Master节点由于故障不能提供服务,需要人工将Slave节点晋升为Master节点

哨兵模式

当主服务器宕机后,需要手动把一台从服务器切换为主服务器,需要人工干预费事费力,为了解决这个问题出现了哨兵模式
哨兵模式优点:最大的优点就是主从可以自动切换,系统更健壮,可用性更高;

哨兵模式缺点:最大的缺点就是还要多维护一套哨兵模式,实现起来也变的更加复杂增加维护成本;
在这里插入图片描述

Redis Cluster

主要是针对海量数据+高并发+高可用的海量数据场景,Redis集群模式的性能和高可用性均优于哨兵模式。

Redis常见问题及解决方案

缓存击穿

热key在缓存中过期了,所以不在缓存中,会导致瞬时大量的请求直接打到了数据库上,对数据库造成了巨大的压力,可能直接就被这么多请求弄宕机了。
解决方案:

  • 永不过期(不推荐):设置热点数据永不过期或者过期时间比较长。
  • 提前预热(推荐):针对热点数据提前预热,将其存入缓存中并设置合理的过期时间比如秒杀场景下的数据在秒杀结束之前不过期。
  • 加锁(看情况);:在缓存失效后,通过设置互斥锁确保只有一个请求去查询数据库并更新缓存

缓存穿透

大量请求的 key 是不合理的,根本不存在于缓存中,也不存在于数据库中 。导致这些请求直接到了数据库上对数据库造成了巨大的压力,可能直接就被这么多请求弄宕机了。
解决方案:

  • 首先做好参数校验,不合法的参数请求直接抛出异常信息返回给客户端
  • 缓存无效 key,SET key value EX 10086 设置过期时间
  • 布隆过滤器
  • 接口限流,用户或者 IP 对接口进行限流,对于异常频繁的访问行为,还可以采取黑名单机制

缓存雪崩

缓存在同一时间大面积的失效,导致大量的请求都直接落到了数据库上,对数据库造成了巨大的压力
解决方案:

  • 针对 Redis 服务不可用的情况:
    Redis 集群
    多级缓存(本地缓存+Redis 缓存的二级缓存组合)
  • 针对大量缓存同时失效的情况
    设置随机失效时间
    针对热点数据提前预热,并设置合理的时间
    对于某些关键性和变化不频繁的数据,持久缓存永不过期

bigKey

一个 key 对应的 value 所占用的内存比较大,那这个 key 就可以看作是 bigkey.

  • String 类型的 value 超过 1MB
  • 复合类型(List、Hash、Set、Sorted Set 等)的 value 包含的元素超过 5000 个

产生原因:

  • 设计不当---- 使用string存储较大文件的二进制流
  • 数据规模考虑不到位---- 使用集合类型没有考虑到数据量的快速增长

带来什么问题 — 阻塞

  • 客户端超时阻塞:redis是单线程的,操作大key时候耗时

如果解决

  • bigkeys 命令去扫描(redis-cli -p 6379 --bigkeys -i 3 表示扫描过程中每次扫描后休息的时间间隔为 3 秒)
  • 找到后,手动清理;用合适的数据结构

热Key

访问频率较高的Key。
会出现的问题

  • 某个热点数据访问量暴增 占用大量的 CPU 和带宽,影响redis的其他请求处理;严重情况下,导致宕机

如果查看

  • 可以通过hotkeys 参数来查找

如果解决

  • 读写分离:主节点处理写请求,从节点处理读请求。
  • 使用 Redis Cluster:将热点数据分散存储在多个 Redis 节点上
  • 二级缓存:hotkey 采用二级缓存的方式进行处理,将 hotkey 存放一份到 JVM 本地内存中(可以用 Caffeine)。

慢查询命令

为什么会有慢

如何保障数据库和缓存数据的一致性

延时双删

写入库的前后,都删除缓存【redis.del(key)操作】
步骤
先删除缓存 —> 再写数据库 —> 休眠 500 毫秒 —> 再次删除缓存
缺点:
最差的情况就是在超时时间内数据存在不一 致,而且又增加了写请求的耗时。

异步更新缓存

MySQL binlog 增量订阅消费+消息队列+增量数据更新到 redis
步骤

MongDB

分布式文件储存的数据库

  • 存储数据:数据库中存储的对象设计BSON,一种类似json的二进制文件,由键值对组成
  • 链接方式(默认为27017)
    mongodb://[username:password@]host1[:port1][,host2[:port2]
  • 库简单认识
    文档 - row
    集合 - table
    数据库 - database
  • 复制工作
    MongoDB的复制工作是基于主从复制实现的。其中一个节点被定义为主节点,其他的节点被定义为备份节点,数据会进行实时同步。在某些情况下,主节点可能会失效或消失,这时候从节点将被提升为主节点继续工作。
  • 支持存储过程吗
    支持,它是javascript写的,保存在db.system.js表中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/854411.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

day12--150. 逆波兰表达式求值+239. 滑动窗口最大值+ 347. 前 K 个高频元素

一、150. 逆波兰表达式求值 题目链接:https://leetcode.cn/problems/evaluate-reverse-polish-notation/description/ 文章讲解:https://programmercarl.com/0150.%E9%80%86%E6%B3%A2%E5%85%B0%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%B1%82%E5%80%BC.html 视频…

R可视化:微生物相对丰度或富集热图可视化

欢迎大家关注全网生信学习者系列: WX公zhong号:生信学习者Xiao hong书:生信学习者知hu:生信学习者CDSN:生信学习者2介绍 热图(Heatmap)是一种数据可视化方法,它通过颜色的深浅或色调的变化来展示数据的分布和密度。在微生物学领域,热图常用于表示微生物在不同分组(如…

【leetcode刷题】面试经典150题 , 27. 移除元素

leetcode刷题 面试经典150 27. 移除元素 难度:简单 文章目录 一、题目内容二、自己实现代码2.1 方法一:直接硬找2.1.1 实现思路2.1.2 实现代码2.1.3 结果分析 2.2 方法二:排序整体删除再补充2.1.1 实现思路2.1.2 实现代码2.1.3 结果分析 三、…

字符串专题详解

目录 字符串hash进阶 KMP算法 next数组 KMP算法 KMP算法优化 字符串hash进阶 字符串hash是指将一个字符串S映射为一个整数,使得该整数可以尽可能唯一地代表字符串S。那么在一定程度上,如果两个字符串转换成的整数相等,就可以认为这两个…

麻了,5年Java竟然不知道幂等......

在分布式系统中,接口幂等性是确保操作一致性的关键特性。 啥是幂等性 幂等性 指的是在给定的条件下,无论操作执行多少次,其结果都保持不变。在接口设计中,幂等性意味着使用相同的参数多次调用接口,应产生与单次调用相…

STM32学习笔记(五)--TIM输出比较PWM详解

(1)配置步骤1.配置RCC外设时钟 开启GPIO以及TIM外设2.配置时基单元的时钟 包含时钟源选择配置初始化时基单元3.配置输出比较单元 包含CCR的值 输出比较模式 极性选择 输出使能等4.配置GPIO口 初始化为复用式推挽输出的配置5.运行控制 启动计数器 输出PWM…

Windows CSC服务特权提升漏洞(CVE-2024-26229)

文章目录 前言声明一、漏洞描述二、漏洞成因三、影响版本四、漏洞复现五、CVE-2024-26229 BOF六、修复方案 前言 Windows CSC服务特权提升漏洞。 当程序向缓冲区写入的数据超出其处理能力时,就会发生基于堆的缓冲区溢出,从而导致多余的数据溢出到相邻的…

QT 的文件

QT 和C、linux 一样,也有自带的文件系统. 它的操作和C、c差不多,不过也需要我们来了解一下。 输入输出设备类 QObject 有一个子类,名为 QIODevice 类,如其名字,该类是管理所有输入输出设备的类。 比如文件、网络套…

【ic-tool】timegen使用

一、前言 TimeGen是一个用于时序波形编辑的CAD工具,它允许数字设计工程师快速有效地绘制数字时序图。TimeGen时序图可以很容易地导出到其他窗口程序,如microsoftword,用于编写设计规范。可直接从官网下载TimeGEN软件:TimeGen Pro…

vue音乐播放条

先看效果 再看代码 <template><div class"footer-player z-30 flex items-center p-2"><div v-if"isShow" class"h-12 w-60 overflow-hidden"><div :style"activeStyle" class"open-detail-control-wrap&…

有什么可以创建ai聊天的软件?5个软件帮助你快速创建ai聊天

有什么可以创建ai聊天的软件&#xff1f;5个软件帮助你快速创建ai聊天 AI聊天软件是一种利用人工智能技术构建的聊天机器人系统&#xff0c;它能够模拟人类的对话方式&#xff0c;回答用户提出的问题或者进行对话。这类软件在各个领域都有广泛的应用&#xff0c;可以用于客户服…

【产品经理】订单处理5-可售库存管理

可售库存即销售库存&#xff0c;本文讲解订单处理过程中的可售库存的管理。 本次讲解订单处理过程中的可售库存的管理。 可售库存即销售库存&#xff0c;电商ERP中的可售库存共分三种&#xff1a;商品的可售现货库存、商品的预售库存以及赠品的可售库存。 一、商品的可售现货…

Python基础用法 之 转义字符

将两个字符进⾏转义 表示⼀个特殊的字符 \n ---> 换⾏&#xff0c;回⻋ \t ---> 制表符, tab键 注意&#xff1a; print( end\n)&#xff1a; print() 函数中默认有⼀个 end\n, 所以,每个 print 结束之后, 都会输出⼀ 个换行。 未完待续。

HTML中的资源提示关键词

渲染阻塞问题 之前在学习浏览器的渲染原理的时候我们就知道&#xff1a;因为浏览器一次只能开启一个渲染主线程&#xff0c;所以当浏览器解析到script标签时会停止DOM树的构建&#xff0c;转而去执行script&#xff0c;如果script中引用的是外部脚本&#xff0c;则浏览器会先从…

MySQL Server和Server启动程序(一)

MySQL Server mysqld&#xff0c;也称为MySQL Server&#xff0c;是一个单线程多任务的程序&#xff0c;它在MySQL安装中执行大部分工作。它不会生成额外的进程。MySQL Server管理对包含数据库和表的MySQL数据目录的访问。数据目录也是其他信息&#xff08;如日志文件和状态文…

目标检测:NMS代码

非极大值抑制NMS是目标检测常用的后处理算法&#xff0c;用于剔除冗余检测框 总体概要&#xff1a; 对NMS进行分类&#xff0c;大致可分为以下六种&#xff0c;这里是依据它们在各自论文中的核心论点进行分类&#xff0c;这些算法可以同时属于多种类别。 分类优先&#xff1a;…

专业学习|博弈论-课程沿革

学习来源&#xff1a;北京大学刘霖《博弈论》MOOC公开课 备注&#xff1a;仅做学习分享&#xff0c;请勿转载&#xff0c;转载必究&#xff01; &#xff08;一&#xff09;博弈论的预备知识 基本的微积分的知识和概率论的知识。简单的说会求导数&#xff0c;会求简单的积分&am…

消息队列-Rabbit运行机制

Producer(生产者) 和 Consumer(消费者) Producer(生产者) :生产消息的一方&#xff08;邮件投递者&#xff09;Consumer(消费者) :消费消息的一方&#xff08;邮件收件人&#xff09; 消息一般由 2 部分组成&#xff1a;消息头&#xff08;或者说是标签 Label&#xff09;和 …

【已解决】chrome视频无法自动播放的问题

问题&#xff1a; 在用datav开发大屏的时候&#xff0c;放了一个视频组件&#xff0c;但是发现视频组件即使设置了自动播放&#xff0c;仍然无法自动播放 原因&#xff1a; 76 以上版本的谷歌浏览器只能在系统静音下自动播放 解决&#xff1a; 音频自动播放浏览器白名单设置&…

kafka在windows上的启动

启动zookeeper 解压kafka安装包到对应目录下&#xff0c;找到对应config目录下的zookeeper.properties文件 新建一个data文件夹&#xff0c;随便放哪 打开该文件&#xff0c;找到 dataDir/tmp/zookeeper 属性 将原来的属性值&#xff0c;修改为新建data文件夹地址&#xff0c;…