分布式缓存数据库面试题redis

2023-11-19

redis和memcached什么区别?为什么高并发下有时单线程的redis比多线程的memcached效率要高?
区别:
1.mc可缓存图片和视频。rd支持除k/v更多的数据结构;
2.rd可以使用虚拟内存,rd可持久化和aof灾难恢复,rd通过主从支持数据备份;
3.rd可以做消息队列。
原因:mc多线程模型引入了缓存一致性和锁,加锁带来了性能损耗。

redis主从复制如何实现的?redis的集群模式如何实现?redis的key是如何寻址的?
主从复制实现:主节点将自己内存中的数据做一份快照,将快照发给从节点,从节点将数据恢复到内存中。之后再每次增加新数据的时候,主节点以类似于mysql的二进制日志方式将语句发送给从节点,从节点拿到主节点发送过来的语句进行重放。
分片方式:
-客户端分片
-基于代理的分片
● Twemproxy
● codis
-路由查询分片
● Redis-cluster(本身提供了自动将数据分散到Redis Cluster不同节点的能力,整个数据集合的某个数据子集存储在哪个节点对于用户来说是透明的)
redis-cluster分片原理:Cluster中有一个16384长度的槽(虚拟槽),编号分别为0-16383。每个Master节点都会负责一部分的槽,当有某个key被映射到某个Master负责的槽,那么这个Master负责为这个key提供服务,至于哪个Master节点负责哪个槽,可以由用户指定,也可以在初始化的时候自动生成,只有Master才拥有槽的所有权。Master节点维护着一个16384/8字节的位序列,Master节点用bit来标识对于某个槽自己是否拥有。比如对于编号为1的槽,Master只要判断序列的第二位(索引从0开始)是不是为1即可。这种结构很容易添加或者删除节点。比如如果我想新添加个节点D, 我需要从节点A、B、 C中得部分槽到D上。

使用redis如何设计分布式锁?说一下实现思路?使用zk可以吗?如何实现?这两种有什么区别?
redis:
1.线程A setnx(上锁的对象,超时时的时间戳t1),如果返回true,获得锁。
2.线程B 用get获取t1,与当前时间戳比较,判断是是否超时,没超时false,若超时执行第3步;
3.计算新的超时时间t2,使用getset命令返回t3(该值可能其他线程已经修改过),如果t1==t3,获得锁,如果t1!=t3说明锁被其他线程获取了。
4.获取锁后,处理完业务逻辑,再去判断锁是否超时,如果没超时删除锁,如果已超时,不用处理(防止删除其他线程的锁)。
zk:
1.客户端对某个方法加锁时,在zk上的与该方法对应的指定节点的目录下,生成一个唯一的瞬时有序节点node1;
2.客户端获取该路径下所有已经创建的子节点,如果发现自己创建的node1的序号是最小的,就认为这个客户端获得了锁。
3.如果发现node1不是最小的,则监听比自己创建节点序号小的最大的节点,进入等待。
4.获取锁后,处理完逻辑,删除自己创建的node1即可。
区别:zk性能差一些,开销大,实现简单。

知道redis的持久化吗?底层如何实现的?有什么优点缺点?
RDB(Redis DataBase:在不同的时间点将redis的数据生成的快照同步到磁盘等介质上):内存到硬盘的快照,定期更新。缺点:耗时,耗性能(fork+io操作),易丢失数据。
AOF(Append Only File:将redis所执行过的所有指令都记录下来,在下次redis重启时,只需要执行指令就可以了):写日志。缺点:体积大,恢复速度慢。

bgsave做镜像全量持久化,aof做增量持久化。因为bgsave会消耗比较长的时间,不够实时,在停机的时候会导致大量的数据丢失,需要aof来配合,在redis实例重启时,优先使用aof来恢复内存的状态,如果没有aof日志,就会使用rdb文件来恢复。Redis会定期做aof重写,压缩aof文件日志大小。Redis4.0之后有了混合持久化的功能,将bgsave的全量和aof的增量做了融合处理,这样既保证了恢复的效率又兼顾了数据的安全性。bgsave的原理,fork和cow, fork是指redis通过创建子进程来进行bgsave操作,cow指的是copy on write,子进程创建后,父子进程共享数据段,父进程继续提供读写服务,写脏的页面数据会逐渐和子进程分离开来。

redis过期策略都有哪些?LRU算法知道吗?写一下java代码实现?
过期策略:
定时过期(一key一定时器),惰性过期:只有使用key时才判断key是否已过期,过期则清除。定期过期:前两者折中。
LRU:new LinkedHashMap<K, V>(capacity, DEFAULT_LOAD_FACTORY, true);
//第三个参数置为true,代表linkedlist按访问顺序排序,可作为LRU缓存;设为false代表按插入顺序排序,可作为FIFO缓存
LRU算法实现:1.通过双向链表来实现,新数据插入到链表头部;2.每当缓存命中(即缓存数据被访问),则将数据移到链表头部;3.当链表满的时候,将链表尾部的数据丢弃。

LinkedHashMap:HashMap和双向链表合二为一即是LinkedHashMap。HashMap是无序的,LinkedHashMap通过维护一个额外的双向链表保证了迭代顺序。该迭代顺序可以是插入顺序(默认),也可以是访问顺序。

缓存穿透、缓存击穿、缓存雪崩解决方案?
缓存穿透:指查询一个一定不存在的数据,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到DB去查询,可能导致DB挂掉。
解决方案:1.查询返回的数据为空,仍把这个空结果进行缓存,但过期时间会比较短;2.布隆过滤器:将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被这个bitmap拦截掉,从而避免了对DB的查询。
缓存击穿:对于设置了过期时间的key,缓存在某个时间点过期的时候,恰好这时间点对这个Key有大量的并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把DB压垮。
解决方案:1.使用互斥锁:当缓存失效时,不立即去load db,先使用如Redis的setnx去设置一个互斥锁,当操作成功返回时再进行load db的操作并回设缓存,否则重试get缓存的方法。2.永远不过期:物理不过期,但逻辑过期(后台异步线程去刷新)。
缓存雪崩:设置缓存时采用了相同的过期时间,导致缓存在某一时刻同时失效,请求全部转发到DB,DB瞬时压力过重雪崩。与缓存击穿的区别:雪崩是很多key,击穿是某一个key缓存。
解决方案:将缓存失效时间分散开,比如可以在原有的失效时间基础上增加一个随机值,比如1-5分钟随机,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件。

在选择缓存时,什么时候选择redis,什么时候选择memcache

选择redis的情况:

      1、复杂数据结构,value的数据是哈希,列表,集合,有序集合等这种情况下,会选择redis, 因为memcache无法满足这些数据结构,最典型的的使用场景是,用户订单列表,用户消息,帖子评论等。

      2、需要进行数据的持久化功能,但是注意,不要把redis当成数据库使用,如果redis挂了,内存能够快速恢复热数据,不会将压力瞬间压在数据库上,没有cache预热的过程。对于只读和数据一致性要求不高的场景可以采用持久化存储

      3、高可用,redis支持集群,可以实现主动复制,读写分离,而对于memcache如果想要实现高可用,需要进行二次开发。

      4、存储的内容比较大,memcache存储的value最大为1M。

选择memcache的场景:

     1、纯KV,数据量非常大的业务,使用memcache更合适,原因是,

           a)memcache的内存分配采用的是预分配内存池的管理方式,能够省去内存分配的时间,redis是临时申请空间,可能导致碎片化。

           b)虚拟内存使用,memcache将所有的数据存储在物理内存里,redis有自己的vm机制,理论上能够存储比物理内存更多的数据,当数据超量时,引发swap,把冷数据刷新到磁盘上,从这点上,数据量大时,memcache更快

           c)网络模型,memcache使用非阻塞的IO复用模型,redis也是使用非阻塞的IO复用模型,但是redis还提供了一些非KV存储之外的排序,聚合功能,复杂的CPU计算,会阻塞整个IO调度,从这点上由于redis提供的功能较多,memcache更快些

           d) 线程模型,memcache使用多线程,主线程监听,worker子线程接受请求,执行读写,这个过程可能存在锁冲突。redis使用的单线程,虽然无锁冲突,但是难以利用多核的特性提升吞吐量。

缓存与数据库不一致怎么办

假设采用的主存分离,读写分离的数据库,

如果一个线程A先删除缓存数据,然后将数据写入到主库当中,这个时候,主库和从库同步没有完成,线程B从缓存当中读取数据失败,从从库当中读取到旧数据,然后更新至缓存,这个时候,缓存当中的就是旧的数据。

发生上述不一致的原因在于,主从库数据不一致问题,加入了缓存之后,主从不一致的时间被拉长了

处理思路:在从库有数据更新之后,将缓存当中的数据也同时进行更新,即当从库发生了数据更新之后,向缓存发出删除,淘汰这段时间写入的旧数据。

主从数据库不一致如何解决

场景描述,对于主从库,读写分离,如果主从库更新同步有时差,就会导致主从库数据的不一致

1、忽略这个数据不一致,在数据一致性要求不高的业务下,未必需要时时一致性

2、强制读主库,使用一个高可用的主库,数据库读写都在主库,添加一个缓存,提升数据读取的性能。

3、选择性读主库,添加一个缓存,用来记录必须读主库的数据,将哪个库,哪个表,哪个主键,作为缓存的key,设置缓存失效的时间为主从库同步的时间,如果缓存当中有这个数据,直接读取主库,如果缓存当中没有这个主键,就到对应的从库中读取。

Redis常见的性能问题和解决方案

  1、master最好不要做持久化工作,如RDB内存快照和AOF日志文件

  2、如果数据比较重要,某个slave开启AOF备份,策略设置成每秒同步一次

  3、为了主从复制的速度和连接的稳定性,master和Slave最好在一个局域网内

  4、尽量避免在压力大得主库上增加从库

  5、主从复制不要采用网状结构,尽量是线性结构,Master<--Slave1<----Slave2 ....

Redis的数据淘汰策略有哪些

voltile-lru 从已经设置过期时间的数据集中挑选最近最少使用的数据淘汰

voltile-ttl 从已经设置过期时间的数据库集当中挑选将要过期的数据

voltile-random 从已经设置过期时间的数据集任意选择淘汰数据

allkeys-lru 从数据集中挑选最近最少使用的数据淘汰

allkeys-random 从数据集中任意选择淘汰的数据

no-eviction 禁止驱逐数据

Redis当中有哪些数据结构

字符串String、字典Hash、列表List、集合Set、有序集合SortedSet。如果是高级用户,那么还会有,如果你是Redis中高级用户,还需要加上下面几种数据结构HyperLogLog、Geo、Pub/Sub。

假如Redis里面有1亿个key,其中有10w个key是以某个固定的已知的前缀开头的,如果将它们全部找出来?

使用keys指令可以扫出指定模式的key列表。

对方接着追问:如果这个redis正在给线上的业务提供服务,那使用keys指令会有什么问题?

这个时候你要回答redis关键的一个特性:redis的单线程的。keys指令会导致线程阻塞一段时间,线上服务会停顿,直到指令执行完毕,服务才能恢复。这个时候可以使用scan指令,scan指令可以无阻塞的提取出指定模式的key列表,但是会有一定的重复概率,在客户端做一次去重就可以了,但是整体所花费的时间会比直接用keys指令长。

使用Redis做过异步队列吗,是如何实现的

    使用list类型保存数据信息,rpush生产消息,lpop消费消息,当lpop没有消息时,可以sleep一段时间,然后再检查有没有信息,如果不想sleep的话,可以使用blpop, 在没有信息的时候,会一直阻塞,直到信息的到来。redis可以通过pub/sub主题订阅模式实现一个生产者,多个消费者,当然也存在一定的缺点,当消费者下线时,生产的消息会丢失。

Redis如何实现延时队列

   使用sortedset,使用时间戳做score, 消息内容作为key,调用zadd来生产消息,消费者使用zrangbyscore获取n秒之前的数据做轮询处理。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

分布式缓存数据库面试题redis 的相关文章

  • 网络常见面试题

    1 OSI Open System Interconnect 开放系统互联 是一个七层的计算机网络模型 分别为 物理层 数据链路层 网络层 传输层 会话层 表示层和应用层 TCP IP Transmission Control Protoc
  • 面面俱到!涵盖Java所有核心技术,阿里新产2023版Java面试核心突击手册太全了!

    程序员面试背八股 可以说是现在互联网开发岗招聘不可逆的形式了 其中最卷的当属Java 网上动不动就是成千上百道的面试题总结 你要是都能啃下来 平时技术不是太差的话 面试基本上问题就不会太大 这时候尴尬的现象就出现了 虽然八股文背的好并不能代
  • Go面试题专题(一):聊聊你理解的Golang defer关键字

    defer关键字是我们工作中经常用到的go语言特性 也是面试官比较青睐的一个知识点 今天通过这篇文章带各位道友彻底掌握它 面试题文档下链接点击这里免积分下载 go语言入门到精通点击这里免积分下载 文章目录 defer两大特性 defer与r
  • php比较两个二维数组是否相同,多维数组

    欢迎加入 新群号码 99640845 几天前跟同事讨论一个很有趣的问题 一直想写下来结果总没有时间 今天终于有时间了 如题 php如何比较两个二维数组是否相同 这个问题我在群里也问了很多人 大多数就是遍历了 有的人遍历一次 有的人遍历两次
  • 美团面试官问:写一个你认为最好的单例模式?于是我写了7个

    各位CSDN的朋友 如果喜欢我的文章 记得点个关注 方便以后找到我 由于是刚开始创作 推荐量较低 如果不关注 以后就可能找不到我了 面试题 写一个你认为最好的单例模式 面试考察点 考察目的 单例模式可以考察非常多的基础知识 因此对于这种问题
  • 实施运维企业面试题-5

    NETWORK 1 请描述 TCP IP 协议中主机与主机之间通信的三要素 参考答案 IP 地址 IP address 子网掩码 subnet mask IP 路由 IP router 2 请描述 IP 地址的分类及每一类的范围 参考答案
  • uniapp部分面试题汇总

    1 谈谈你对uni app的理解 uni app是一个使用Vue js开发所有前端应用的框架 开发者编写一套代码 可以发布到IOS Android Web 响应式 以及各种小程序 快应用等多个平台 uniapp真正做到一套代码多端发行 支持
  • Go语言面试题--基础语法(15)

    文章目录 1 下面代码中 x 已声明 y 没有声明 判断每条语句的对错 2 下面代码输出什么 3 下面代码输出什么 1 下面代码中 x 已声明 y 没有声明 判断每条语句的对错 x f x f x y f x y f 参考答案及解析 错 对
  • HTTP请求的8种请求方式以及常见的HTTP状态码总结

    完整的HTTP状态码见 菜鸟教程 HTTP8种请求方式的原文 HTTP的8种请求方式的简单介绍 目录 一 HTTP请求的8种请求方式 二 什么是HTTP状态码 三 HTTP状态码的分类 一 HTTP请求的8种请求方式 序号 方法 描述 1
  • 一遍看懂面试算法——二叉树

    目录 二叉树的种类 满二叉树 完全二叉树 二叉搜索树 平衡二叉搜索树 二叉树的存储方式 二叉树的遍历方式 二叉树的递归遍历 二叉树的迭代遍历 前序遍历 迭代法 中序遍历 迭代法 后序遍历 迭代法 总结 二叉树的统一迭代法 二叉树层序遍历 以
  • MySQL事务、日志、锁和MVCC机制

    InnoDB中事务的四大特性 原子性 当前事务的操作要么全部成功要么全部失败 原理 原子性是由undo log来保证的 undolog记录着数据修改之前的值 比如我们insert一条语句 undolog就会记录一条delete语句 我们up
  • 面试题(1)封装c++

    前言 在学习的过程中我开始积累面试题 让我们一起开始学习 进步吧 卷起来 封装的定义 定义 将数据和操作数据的方法进行有机结合 隐藏对象的属性和实现细节 仅对外公开接口来和对象进行交互 封装本质上是一种管理 就好比如办画展的时候我们要把画用
  • java常见面试题及答案 11-20(JVM)

    11 JVM内存分哪几个区 每个区的作用是什么 java虚拟机主要分为以下一个区 方法区 1 有时候也成为永久代 在该区内很少发生垃圾回收 但是并不代表不发生GC 在这里进行的GC主要是对方法区里的常量池和对类型的卸载 2 方法区主要用来存
  • 【面试真题】今日头条大数据面试100题,收藏备用

    1 简述WordCount 的实现过程 2 简述MapReduce与 Spark 的区别与联系 3 Spark 在客户端与集群运行的区别 4 相同的 SQL 在 HiveSql 与 SparkSQL 的实现中 为什么 Spark 比 Had
  • 线程相关面试题

    1 ThreadPoolExecutor 线程池执行 有哪些常用的方法 1 执行线程池 submit excute 2 终止线程池 shutdown 3 判断线程是否终止 isShutdown 4 获取正在运行的线程数 getAcitive
  • 【面试题】宏任务和微任务

    1 宏任务和微任务 宏任务 macroTask 和微任务 microTask 都是异步中API的分类 宏任务 setTimeout setInterval Ajax DOM事件 微任务 Promise async await 微任务执行时机
  • 奇偶数排序

    题目描述 给定一个整数数组 请调整数组的顺序 使得所有奇数位于数组前半部分 所有偶数位于数组后半部分 要求时间复杂度为O n 分析与解法 最容易想到的办法是从头到尾扫描这个数组 每遇到一个偶数 就把他单独取出来 然后把该偶数后面的所有数往前
  • 操作系统常见面试题

    1 什么是进程 Process 和线程 Thread 有何区别 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动 进程是系统进行资源分配和调度的一个独立单位 线程是进程的一个实体 是CPU调度和分派的基本单位 它是比进程更小的能
  • 面试题:重量级锁的8连问,你能接住几个?

    文章目录 前言 名词解释 问题解析 问题1 ObjectMonitor和AQS有什么异同 问题2 为什么ObjectMonitor需要cxq和entryList两个等待队列 问题3 cxq队列中等待线程 什么时候会进到EntryList 问
  • 面试题:偏向锁的十连问,你能接住几个?

    文章目录 前言 名词解释 问题解析 问题1 如何判断当前锁对象为偏向锁 问题2 偏向锁如何判断锁重入 问题3 符合什么条件才会尝试获取偏向锁 问题4 线程进入偏向锁后 会不会创建lock record 问题5 偏向锁膨胀后

随机推荐

  • the type or namespace name ‘xxx‘ could not be found(vs for Mac)解决方法

    在visual studio for Mac中遇到 the type or namespace name xxx could not be found are you missing a using derective or an asse
  • Linux下 mysql8大小写敏感问题

    说明 已经在linux上安装过了mysql 通过以下步骤解决 1 先查看mysql的运行状态 service mysql status 如果为运行状态 则停止 service mysql stop 2 修改 etc my cnf文件 添加l
  • SpringBoot生成docker镜像,完成容器部署

    docker介绍 Docker 是一个开源的应用容器引擎 基于 Go语言 并遵从Apache2 0协议开源 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级 可移植的容器中 然后发布到任何流行的 Linux 机器上 也可以实现
  • Go 字符串处理

    一 字符串处理函数 我们从文件中将数据读取出来以后 很多情况下并不是直接将数据打印出来 而是要做相应的处理 例如 去掉空格等一些特殊的符号 对一些内容进行替换等 这里就涉及到对一些字符串的处理 在对字符串进行处理时 需要借助于包 strin
  • Spring boot thymeleaf 实现简单-页面国际化

    新建Spring boot项目 pom xml文件
  • python创建socket对象_python如何使用socket来传输对象

    2016 08 09 回答 现在记录https服务端的编写 import ssl socket time if name main context ssl sslcontext ssl protocol sslv23 context loa
  • ubuntu16.04 安装CUDA 8.0 和 cuDNN 5.1 /cudnn6.0,可适用于gpu版本的(tensorflow,caffe,mxnet)

    转载https zhuanlan zhihu com p 27890924文章 略有修改 感谢原作者 环境 ubuntu 16 04 GTX 960 安装步骤 安装Nvidia驱动 系统设置 gt 软件与更新 gt 附加驱动 如下图选择nv
  • Flutter-实现视频播放功能

    1 引入库 video player 0 10 0 2 import package flutter cupertino dart import package flutter material dart import package vi
  • html中如何写div中div的位置,position设置div的位置

    css怎么调整div的位置 可以使用css中的position来对div进行定位来改变div的位置 position可能的值如下 工具原料 编辑器 浏览器 通过设置一个div的position的值来调整div的位置 简单的代码示例如下 bo
  • C语言基础系列(四)——数组

    本期主题 c语言中的数组 C语言基础 数组 1 数组名 1 1 数组名的含义 2 空数组的用法 1 数组名 指针常量 特殊情框 2 指针数组 数组指针 3 空数组 1 数组名 1 1 数组名的含义 可以先看下面的这些声明 int a int
  • Java 工作2年后需要达到怎么样的技术水平

    请具体一点说要会什么技术 以及这些技术要达到什么水平 有人回答说这只能是大企业或者互联网企业的工程师才能拿到 也许是的 小公司或者非互联网企业拿两万的不太可能是码农了 应该是已经转管理后才有可能 还有区域问题 这个不在我的考虑范围内 因为除
  • qq键盘快捷键大全

    qq键盘快捷键大全 Ctrl A 全选 Ctrl B 整理收藏夹 Ctrl C 复制 Ctrl D 删除 添加收藏 在Word中是修改选定字符格式 在IE及傲游 中是保存为收藏 Ctrl E 搜索助理 在Word中是段落居中 Ctrl F
  • 哈希函数

    哈希函数 定义 Hash 一般翻译做散列 杂凑 或音译为哈希 是把任意长度的输入 又叫做预映射pre image 通过散列算法变换成固定长度的输出 该输出就是散列值 这种转换是一种压缩映射 也就是 散列值的空间通常远小于输入的空间 不同的输
  • 国产数据库梳理

    背景介绍及架构介绍 架构上划分 分库分表类 Spanner 架构 OceanBase Shared Storage 总结 当前国产数据库百花齐放 几乎每隔半年就会冒出一家数据库 各大厂商在去年也都更新了自己的数据库产品线名称 太多的数据库让
  • Winrar命令行解压带密码的压缩文件

    1 先自行安装好winrar 这个不用多说 2 我们创建一个压缩文件 这是一个文件夹 里边就2个txt文件 3 我们使用winrar对其进行加密压缩 现在我们就有一个带密码的压缩文件了 3 找到winrar的安装目录 把rar exe拷贝到
  • matlab读入从文件中读取大量的数据

    将文件导入matlab中 除了对利用菜单的操作 我们也可以使用matlab代码 这个是一个函数 这个函数我们提供所读文件的基础的名字 然后返回一个矩阵 function z readOneD basename readOneD BASENA
  • 我认为最好用的网页解析模块Parsel

    前言 众所周知 网页解析4大模块 1 正则表达式 re 2 bs4 BeautifulSoup 3 xpath lxml 4 css选择器 pyquery 大家一定都很熟悉 很多都是从这几个模块入手 本文不对这4个模块评价它们的优略 因为每
  • 攻防世界fileinclude题解

    目录 解题思路 file get contents 函数 PHP伪协议 解题思路续 解题思路 先看题目 打开题目场景 我们看到用了file get contents 函数 这里我忘了这个函数是什么意思了 于是又去翻了翻文档 file get
  • IDEA卡顿怎么办?快来用用这个办法

    IDEA卡顿解决方法 亲测有效 1 找到IDEA安装位置 打开这两个配置 2 修改配置 3 保存配置 重启IDEA 先介绍一下我电脑的情况 华硕dx80 8g运行 电脑配置一般 在跟同等价位的拯救者同时打开IDEA时 打开速度都差好多 为了
  • 分布式缓存数据库面试题redis

    redis和memcached什么区别 为什么高并发下有时单线程的redis比多线程的memcached效率要高 区别 1 mc可缓存图片和视频 rd支持除k v更多的数据结构 2 rd可以使用虚拟内存 rd可持久化和aof灾难恢复 rd通