Redis面试(三)

1.Redis报内存不足怎么处理

Redis内存不足的集中处理方式:

  • 修改配置文件redis.cof的maxmemory参数,增加Redis的可用内存
  • 通过命令修改set maxmemory动态设置内存上限
  • 修改内存淘汰策略,及时释放内存
  • 使用Redis集群,及时进行扩容

2.Redis的过期回收策略

  • 惰性删除: 惰性删除是指当我们查询key的时候才对key进行检测,如果已经达到过期时间,则删除,显然有一个缺点就是如果过期的key没有被访问,那么就会一直不被删除,而一直占用内存。
  • 定期删除:定期删除是指Redis每隔一段时间对数据库做一次检查,删除里面的过期key,由于不可能做轮询key,所以Redis是每次随机抽取一下key做检查

3.Redis有哪些内存溢出控制策略

内存达到maxmemory上限时候会触发响应的控制策略,Redis支持6种策略

  • noeviction: 默认策略,不会删除任何数据,拒绝写入任何数据并且返回错误信息,此时Redis只响应读操作
  • volatile-lru:根据lru算法设置了超时属性的值,知道腾出足够的空间为止,如果没有可删除的健对象,回退到noeviction策略。
  • allkeys-lru:根据LRU算法删除健,不管数据有没有设置超时属性,直到特腾出足够空间为止
  • allkeys-random:随机删除所有的健,直到腾出空间为止。
  • volatile-random:随机删除过期的健,直到腾出足够的空间
  • volatile-ttl:根据键值属性,删除最近将要过期的数据,如果没有回退到noeviction策略。

4.Redis阻塞?怎么解决

在这里插入图片描述

  • API或者数据结构不合理
    通常Redis执行命令速度非常快,但是不合理的使用命令,可能会导致执行速度变慢,导致阻塞,特别在高并发的时候,应该尽量避免在大对象执行算法复杂度超过O(n)的。
    对慢查询的处理分为两步
    1.使用查询show log get{n}命令可以获取最近的n条慢查询命令
    2.发现慢查询后可从以下两个方向优化
    - 修改为低算法的复杂度的命令,如hgetall改为hmget等,禁用keys,sort命令等
    - 调整大对象:缩短大对象数据或者把大对象进行拆分为多个小对象,防止一次命令操作过多的数据。

  • CPU饱和问题
    单线程的Redis处理命令时候只使用一个CPU,CPU饱和是指Redis单核CPU使用率接近100%。
    处理步骤如下:
    1.判断当前Redis并发量是否已经到达极限
    2.如果当前并发QPs是已经几万+,那么可能已经到极限,可能需要做集群的水平化扩容来分担压力。
    3.如果QPS只有几十,几百那么可能就要排查命令和内存的使用。

  • 持久化相关的阻塞
    对于开起了持久化功能的Redis节点,需要排查是否是持久化导致的阻塞。
    1.fork阻塞:fork发生在RDB和AOF重写的时,Redis主线程调用fork操作产生共享,由子进程完成持久化文件重写工作,如果fork操作本身耗时长,必然会导致主线程的阻塞。
    2.AOF刷盘阻塞:当我们开启AoF持久化的时候,文件的刷盘方式一般采用每秒一次,后台线程每秒对AOF文件做fsync操作,当硬盘压力过大,fsync需要等待直到写入完成,如果主线程发现距离上一次的fsync成功超过两秒,为了安全性它会阻塞直到后台线程完成fsync操作。
    3.Hugepage写操作阻塞:对于开启Transparent HugePages的 操作系统,每次写命令引起的复制内存页单位由4K变为2MB,放大了512 倍,会拖慢写操作的执行时间,导致大量写操作慢查询

5.大key问题

大key情况:

  • 单个key存储的value很大,超过10KB
  • hash,set,zset,list储存过多的元素(以万为单位)

大key会造成什么情况

  • 客户端耗时增加,甚至超时
  • 对大key进行IO操作时,会严重占用带宽和CPU造成Redis集群中数据倾斜。
  • 主动删除,被动删除可能会造成阻塞。

如何找到大key

  • bigkeys命令:使用bigkeys命令以遍历的方式分析Redis实例中的所有key,并返回整体统计信息并返回每个数据类型中Top1的大key
  • redis-db-tools::redis-rdb-tools是由Python写的用来分析Redis的rdb快照文件用的工具,它可以把rdb快照文件生
    成json文件或者生成报表用来分析Redis的使用详情

如何处理大key
在这里插入图片描述
删除大key

  • 当Redis版本大于4.0时,可使用UNLINK命令安全地删除大Key,该命令能够以非阻塞的方式,逐步地清理
    传入的Key。
  • 当Redis版本小于4.0时,避免使用阻塞式命令KEYS,而是建议通过SCAN命令执行增量迭代扫描key,然后判
    断进行删除。
    压缩和拆分key
  • 当vaule是string时,比较难拆分,则使用序列化、压缩算法将key的大小控制在合理范围内,但是序列化和
    反序列化都会带来更多时间上的消耗。
  • 当value是string,压缩之后仍然是大key,则需要进行拆分,一个大key分为不同的部分,记录每个部分的
    key,使用multiget等操作实现事务读取。
  • 当value是list/set等集合类型时,根据预估的数据规模来进行分片,不同的元素计算后分到不同的片。

6.使用Redis如何实现异步队列

  • 使用list作为消息队列,lpush生产消息,rpop消费消息
    这种方式,消费者死循环rpop从队列中消费消息,即使队列里面没有消息,也会进行rpop,导致redis的CPU消耗;可以通过让消费者休眠的方式来处理,但是这样又会有消息延迟的问题。
    在这里插入图片描述
  • 使用list作为消息队列,lpush生产消息,brpop进行消费消息
    brpop是rpop的阻塞版本,list为空的时候,他会一直阻塞,直到list中有消息或者超时,但这种方式只能进行一对一的消息队列。
    在这里插入图片描述
  • 使用Redis的pub/sub来进行消息的发布/订阅
    发布/订阅模式可以1:N的消息发布/订阅,发布者将消息发布到指定的频道,订阅响应频道的客户端都能收到消息。
    在这里插入图片描述
    但是这种消息是不可靠的,不保证订阅者一定能收到消息,也不进行消息的存储,所以一般的异步消息队列还是交给专业的消息队列。

7.Redis支持事务吗

Redis提供了简单的事务,但是它对事务ACID的支持并不完备。
multi命令表示事务的开始,exec命令表示事务结束。Redis事务的原理,是所有的指令在 exec 之前不执行,而是缓存在
服务器的一个事务队列中,服务器一旦收到 exec 指令,才开执行整个事务队列,执行完毕后一次性返回所有指令的运
行结果
Redis事务为什么不支持回滚
Redis的事务不支持回滚
如果执行的命令有语法错误,Redis 会执行失败,这些问题可以从程序层面捕获并解决。但是如果出现其他问题,则
依然会继续执行余下的命令。
这样做的原因是因为回滚需要增加很多工作,而不支持回滚则可以保持简单、快速的特性。

8.Redis实现分布式了解吗

Redis是分布式锁本质上要实现的目标就是在 Redis 里面占一个“茅坑”,当别的进程也要来占时,发现已经有人蹲
在那里了,就只好放弃或者稍后再试。

  • V1:setnx命令
    占坑一般使用的是setnx(set if not exists)指令,只允许被一个客户端占,用完了在调用对del指令释放。
    但是有个问题如果逻辑执行到中间出现了异常,可能会导致del指令没有被调用,陷入了死锁。

  • V2锁超时释放
    所以在拿到锁之后,再给锁加上一个过期时间,比如5秒,这样即使服务中间出现异常也可以保证5秒之后锁会自动释放。

  • V3:set指令
    这个问题在Redis 2.8版本中得到了解决,这个版本加入了set 指令的扩展参数,使得 setnx和expire指令可以一起执

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【MySQL】双写、重做日志对宕机时脏页数据落盘的作用的疑问及浅析

众所周知,双写机制、重做日志文件是mysql的InnoDB引擎的几个重要特性之二。其中两者的作用都是什么,很多文章都有分析,如,双写机制(Double Write)是mysql在crash后恢复的机制,而重做日志文件&am…

Java 集合 05 综合练习-返回多个数据

代码&#xff1a; import java.util.ArrayList; import java.util.Arrays;public class practice{public static void main(String[] args) {ArrayList<Phone> list new ArrayList<>();Phone p1 new Phone("小米",1000);Phone p2 new Phone("苹…

51单片机通过级联74HC595实现倒计时秒表Protues仿真设计

一、设计背景 近年来随着科技的飞速发展&#xff0c;单片机的应用正在不断的走向深入。本文阐述了51单片机通过级联74HC595实现倒计时秒表设计&#xff0c;倒计时精度达0.05s&#xff0c;解决了传统的由于倒计时精度不够造成的误差和不公平性&#xff0c;是各种体育竞赛的必备设…

数据结构.栈

一、栈的定义 二、初始化 #include<iostream> using namespace std; const int N 10; typedef struct {int data[N];int top; }SqStack; void InitSqStack(SqStack &S)//初始化 {S.top -1; } 三、进栈 void Push(SqStack& S, int x)//入栈 {S.data[S.top] x; …

深入了解Matplotlib中的子图创建方法

深入了解Matplotlib中的子图创建方法 一 add_axes( **kwargs):1.1 函数介绍1.2 示例一 创建第一张子图1.2 示例二 polar参数的运用1.3 示例三 创建多张子图 二 add_subplot(*args, **kwargs):2.1 函数介绍2.2 示例一 三 两种方法的区别3.1 参数形式3.2 布局灵活性3.3 适用场景3…

机器学习:多项式回归(Python)

多元线性回归闭式解&#xff1a; closed_form_sol.py import numpy as np import matplotlib.pyplot as pltclass LRClosedFormSol:def __init__(self, fit_interceptTrue, normalizeTrue):""":param fit_intercept: 是否训练bias:param normalize: 是否标准化…

verdaccio搭建npm私服

一、安装verdaccio 注&#xff1a;加上–unsafe-perm的原因是防止报grywarn权限的错 npm install -g verdaccio --unsafe-perm 二、启动verdaccio verdaccio 三、配置文件 找到config.yml一般情况下都在用户下的这个文件夹下面 注&#xff1a;首次启动后才会生成 C:\Users\h…

/etc/profile错误,命令失效

source /etc/profile后所有命令失效 执行 export PATH/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin 修改后 执行:wq! 执行:w !sudo tee %

怎么控制Element的数据树形表格展开所有行;递归操作,打造万能数据表格折叠。

HTML <el-button type"success" size"small" click"expandStatusFun"> <span v-show"expandStatusfalse"><i class"el-icon-folder-opened"></i>展开全部</span><span v-show"expan…

鸿蒙原生应用开发已全面启动,你还在等什么?

2019年&#xff0c;鸿蒙系统首次公开亮相&#xff0c;你们说&#xff0c;等等看&#xff0c;还不成熟&#xff1b; 2021年&#xff0c;鸿蒙系统首次在手机端升级&#xff0c;你们说&#xff0c;等等看&#xff0c;还不完善&#xff1b; 2024年&#xff0c;鸿飞计划发布&#…

STM32以太网接口在TCP/IP通信中的应用案例

在STM32的以太网通信中&#xff0c;TCP/IP协议广泛应用于各种领域&#xff0c;如远程监控、物联网、工业控制等。下面以一个STM32基于TCP/IP协议的以太网通信的应用案例为例进行介绍。 ✅作者简介&#xff1a;热爱科研的嵌入式开发者&#xff0c;修心和技术同步精进 ❤欢迎关注…

C#颜色拾取器

1&#xff0c;目的&#xff1a; 获取屏幕上任意位置像素的色值。 2&#xff0c;知识点: 热键的注册与注销。 /// <summary>/// 热键注册/// </summary>/// <param name"hWnd">要定义热键的窗口的句柄 </param>/// <param name"id…

如何使用Python Flask搭建一个web页面并实现远程访问

文章目录 前言1. 安装部署Flask并制作SayHello问答界面2. 安装Cpolar内网穿透3. 配置Flask的问答界面公网访问地址4. 公网远程访问Flask的问答界面 前言 Flask是一个Python编写的Web微框架&#xff0c;让我们可以使用Python语言快速实现一个网站或Web服务&#xff0c;本期教程…

C++多线程1(复习向笔记)

创建线程以及相关函数 当用thread类创建线程对象绑定函数后&#xff0c;该线程在主线程执行时就已经自动开始执行了,join起到阻塞主线程的作用 #include <iostream> #include <thread> #include <string> using namespace std; //测试函数 void printStrin…

Java强训day10(选择题编程题)

选择题 public class Test01 {public static void main(String[] args) {try{int i 100 / 0;System.out.print(i);}catch(Exception e){System.out.print(1);throw new RuntimeException();}finally{System.out.print(2);}System.out.print(3);} }编程题 题目1 import jav…

day 59 503.下一个更大元素II 42. 接雨水

vector的扩充要熟悉 vector<int> numsT(nums.begin(),nums.end()); nums.insert(nums.end(),numsT.begin(),numsT.end()); class Solution { public:vector<int> nextGreaterElements(vector<int>& nums) {stack<int> st;vector<int> nums…

C++入门(一)— 使用VScode开发简介

文章目录 C 介绍C 擅长领域C 程序是如何开发编译器、链接器和库编译预处理编译阶段汇编阶段链接阶段 安装集成开发环境 &#xff08;IDE&#xff09;配置编译器&#xff1a;构建配置配置编译器&#xff1a;编译器扩展配置编译器&#xff1a;警告和错误级别配置编译器&#xff1…

自动驾驶代客泊车AVP决策规划详细设计

背景 随着产品的不断迭代&#xff0c;外部停车场的铺开&#xff0c;PAVP车辆需要应对的场景将越来越复杂&#xff0c;因此整体算法泛化能力的提升显得尤为关键。为了打磨巡航规划的能力&#xff0c;算法架构应当设计的更为灵活&#xff0c;可以针对使用场景迁入更为先进有效的算…

Springboot 快速集成 ES

1、Springboot 官网给出的版本选择标准 2、选择版本依赖 我的 elasticsearch 服务版本为 7.17.13&#xff0c;所以 springboot 版本我选用 2.7.10 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies<…

电脑上如何压缩图片?这个方法简单又方便

电脑上如何压缩图片&#xff1f;我们在需要压缩图片大小的时候&#xff0c;最经常使用的就是下载安装一些图片处理软件&#xff0c;这样的方法不仅耽误时间&#xff0c;有些软件的操作步骤还特别繁琐&#xff0c;对新手小白非常不友好&#xff0c;所以小编今天就给大家介绍一个…