面试题--redis篇
一、Redis支持的数据类型?
String (字符串)
Hash (哈希)
List (列表)
Set (集合)
zset (sorted set:有序集合)
1. String(字符串)
格式: set key value
string 类型是二进制安全的,意思是 redis
的 string 可以包含任何数据,比如 jpg 图
片或者序列化的对象
string 类型是 Redis 最基本的数据类型,
一个键最大能存储 512 MB
2. Hash(哈希)
格式: hmset name key1 value1 key2 value2
Redis hash 是一个键值(key=>value)对集
合
Redis hash 是一个 string 类型的 field 和
value 的映射表,hash 特别适合用于存储
对象
3. List(列表)
Redis 列表是简单的字符串列表,按照插
入顺序排序,可以添加一个元素到列表的
头部(左边)或者尾部(右边)
格式: lpush name value
在 key 对应 list 的头部添加字符串元素
格式: rpush name value
在 key 对应 list 的尾部添加字符串元素
格式: lrem name index
key 对应 list 中删除 count 个和 value
相同的元素
格式: llen name
返回 key 对应 list 的长度
4. Set(集合)
格式: sadd name value
Redis 的 Set 是 string 类型的无序集合
集合是通过哈希表实现的,所以添加,
删除,查找的复杂度都是 O(1)
5. ZSet(sorted set:有序集合)
格式: zadd name score value
Redis zset 和 set 一样也是 string 类型
元素的集合,且不允许重复的成员
不同的是每个元素都会关联一个 double
类型的分数,redis 正是通过分数来为集
合中的成员进行从小到大的排序
zset 的成员是唯一的,但分数 (score) 却可
以重复
二、什么是Redis持久化?Redis有哪几种持久化方式?优缺点是什么?
持久化就是把内存的数据写到磁盘中去,
防止服务宕机了内存数据丢失
Redis 提供了两种持久化方式:
RDB (默认)
AOF
1. RDB:
rdb 是 Redis DataBase 缩写
功能核心函数 rdbSave (生成RDB文件)
和 rdbLoad (从文件加载内存) 两个函数
2. AOF:
Aof 是 Append-only file 缩写
每当执行服务器(定时)任务或者函数时
flushAppendOnlyFile 函数都会被调用,
这个函数执行以下两个工作
aof 写入保存:
WRITE:根据条件,将 aof_buf 中的缓存
写入到 AOF 文件
SAVE:根据条件,调用 fsync 或 fdatasync
函数,将 AOF 文件保存到磁盘中
存储结构:
内容是 redis 通讯协议(RESP )格式的命令
文本存储
比较:
① aof 文件比 rdb 更新频率高,优先使用
aof 还原数据
② aof 比 rdb 更安全也更大
③ rdb 性能比 aof 好
④ 如果两个都配了优先加载AOF
RESP 是 redis 客户端和服务端之前使用的
一种通讯协议;
RESP 的特点:实现简单、快速解析、可读性好
For Simple Strings the first byte of the reply is "+" 回复
For Errors the first byte of the reply is "-" 错误
For Integers the first byte of the reply is ":" 整数
For Bulk Strings the first byte of the reply is "$" 字符串
For Arrays the first byte of the reply is "*" 数组
三、Redis 有哪些架构模式?讲讲各自的特点
② 主从模式
③ 哨兵模式
④ 集群模式
1. 单机模式
特点:
简单
问题:
① 内存容量有限
② 处理能力有限
③ 无法高可用
2. 主从模式
Redis 的复制 (replication) 功能允许用户根
据一个 Redis 服务器来创建任意多个该服
务器的复制品,其中被复制的服务器为主
服务器 (master),而通过复制创建出来的
服务器复制品则为从服务器 (slave)
只要主从服务器之间的网络连接正常,主
从服务器两者会具有相同的数据,主服务
器就会一直将发生在自己身上的数据更新
同步给从服务器,从而一直保证主从服务
器的数据相同
特点:
① master/slave 角色
② master/slave 数据相同
③ 降低 master 读压力在转交从库
问题:
① 无法保证高可用
② 没有解决 master 写的压力
3. 哨兵模式
Redis sentinel 是一个分布式系统中监控
redis 主从服务器,并在主服务器下线时
自动进行故障转移
其中三个特性:
监控 (Monitoring):Sentinel 会不断地检
查你的主服务器和从服务器是否运作正
常
提醒 (Notification):当被监控的某个
Redis 服务器出现问题时, Sentinel
可以通过 API 向管理员或者其他应用
程序发送通知
自动故障迁移 (Automatic failover):
当一个主服务器不能正常工作时,
Sentinel 会开始一次自动故障迁移操作
特点:
① 保证高可用
② 监控各个节点
③ 自动故障迁移
缺点:
① 主从模式,切换需要时间丢数据
② 没有解决 master 写的压力
4. 集群模式
(1) 集群 (proxy 型)
Twemproxy 是一个 Twitter 开源的一个 redis
和 memcache 快速/轻量级代理服务器;
Twemproxy 是一个快速的单线程代理程序,
支持 Memcached ASCII 协议和 redis 协议
特点:
① 多种 hash 算法:MD5、CRC16、CRC32、
CRC32a、hsieh、murmur、Jenkins
② 支持失败节点自动删除
③ 后端 Sharding 分片逻辑对业务透明,业务
方的读写方式和操作单个 Redis 一致
缺点:
① 增加了新的 proxy,需要维护其高可用
② failover 逻辑需要自己实现,其本身不能支
持故障的自动转移可扩展性差,进行扩缩容
都需要手动干预
从 redis 3.0 之后版本支持 redis-cluster 集群,
Redis-Cluster 采用无中心结构,每个节点保
存数据和整个集群状态,每个节点都和其他
所有节点连接
特点:
① 无中心架构 (不存在哪个节点影响性能瓶颈),
少了 proxy 层
② 数据按照 slot 存储分布在多个节点,节点间
数据共享,可动态调整数据分布
③ 可扩展性,可线性扩展到 1000 个节点,节
点可动态添加或删除。
④ 高可用性,部分节点不可用时,集群仍可用
通过增加 Slave 做备份数据副本实现故障自
动 failover,节点之间通过 gossip 协议交换
状态信息,用投票机制完成 Slave到 Master
的角色提升
缺点:
资源隔离性较差,容易出现相互影响的情况
数据通过异步复制,不保证数据的强一致性
四、使用过Redis分布式锁么,它是怎么实现的?
先拿 setnx 来争抢锁,抢到之后,再用 expire
给锁加一个过期时间防止锁忘记了释放
1. 如果在 setnx 之后执行 expire 之前进程意外
crash 或者要重启维护了,那会怎么样?
set 指令有非常复杂的参数,这个应该是可以
同时把 setnx 和 expire 合成一条指令来用的!
五、使用过Redis做异步队列么,你是怎么用的?有什么缺点?
一般使用 list 结构作为队列,rpush 生产消息,
lpop 消费消息
当 lpop 没有消息的时候,要适当 sleep 一会
再重试
在消费者下线的情况下,生产的消息会丢失,
得使用专业的消息队列如 rabbitmq 等
能不能生产一次消费多次呢?
使用 pub/sub 主题订阅者模式,可以实现
1:N 的消息队列
六、什么是缓存穿透?如何避免?什么是缓存雪崩?何如避免?
1. 缓存穿透
一般的缓存系统,都是按照 key 去缓存查
询,如果不存在对应的 value,就应该去
后端系统查找 (比如 DB)
一些恶意的请求会故意查询不存在的 key,
请求量很大,就会对后端系统造成很大的
压力,这就叫做缓存穿透
如何避免?
① 对查询结果为空的情况也进行缓存,缓
存时间设置短一点,或者该 key 对应的
数据 insert 了之后清理缓存
② 对一定不存在的 key 进行过滤,可以把
所有的可能存在的 key 放到一个大的
Bitmap 中,查询时通过该 bitmap 过滤
2. 缓存雪崩
当缓存服务器重启或者大量缓存集中在某
一个时间段失效,这样在失效的时候,会
给后端系统带来很大压力,导致系统崩溃
如何避免?
① 在缓存失效后,通过加锁或者队列来控
制读数据库写缓存的线程数量
比如对某个 key 只允许一个线程查询数
据和写缓存,其他线程等待
② 做二级缓存,A1 为原始缓存,A2 为拷
贝缓存,A1 失效时,可以访问 A2,A1
缓存失效时间设置为短期,A2 设置为长
期
③ 不同的 key,设置不同的过期时间,让
缓存失效的时间点尽量均匀
七、Redis 常用命令
1. 管理命令
# dbsize 返回当前数据库 key 的数量。
# info 返回当前 redis 服务器状态和一些统计信息。
# monitor 实时监听并返回redis服务器接收到的所有请求信息。
# shutdown 把数据同步保存到磁盘上,并关闭redis服务。
# config get parameter 获取一个 redis 配置参数信息。(个别参数可能无法获取)
# config set parameter value 设置一个 redis 配置参数信息。(个别参数可能无法获取)
# config resetstat 重置 info 命令的统计信息。(重置包括:keyspace 命中数、
# keyspace 错误数、 处理命令数,接收连接数、过期 key 数)
# debug object key 获取一个 key 的调试信息。
# debug segfault 制造一次服务器当机。
# flushdb 删除当前数据库中所有 key,此方法不会失败。小心慎用
# flushall 删除全部数据库中所有 key,此方法不会失败。小心慎用
2. 工具命令
#redis-server:Redis 服务器的 daemon 启动程序
#redis-cli:Redis 命令行操作工具。当然,你也可以用 telnet 根据其纯文本协议来操作
#redis-benchmark:Redis 性能测试工具,测试 Redis 在你的系统及你的配置下的读写性能
$redis-benchmark -n 100000 –c 50
#模拟同时由 50 个客户端发送 100000 个 SETs/GETs 查询
#redis-check-aof:更新日志检查
#redis-check-dump:本地数据库检查
相关文章:
面试题--redis篇
一、Redis支持的数据类型? String (字符串) Hash (哈希) List (列表) Set (集合) zset (sorted set:有序集合) 1. String(字符串) 格式: set key value string 类型是二进制安全的,意思是 redis 的 string 可以包含任…...
Android Studio 新建module报错:No signature of method
android平台uni原生插件开发过程中,使用Android Studio 新增 module 报错 选择app --> create new module ,填写相关信息 Android Studio 新建module报错: 原因:Android Studio 版本过高,新增了namespace&#x…...
python使用dir()函数获取对象中可用的属性和方法(看不到python源码又想知道怎么调用,DLL调用分析,SDK二次开发技巧)
有时候调用一些SDK,但是人家又是封装成dll文件形式调用的,这时没法看源码,也不想看其对应的开发文档(尤其有些开发文档写得还很难懂,或者你从某个开源社区拿过来,就根本没找到开发文档)…...
【MySQL系列】SQL语句入门(创建删除操作)、字符集和数据类型详解
💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …...
谈谈召回率(R值),准确率(P值)及F值
通俗解释机器学习中的召回率、精确率、准确率,一文让你一辈子忘不掉这两个词 赶时间的同学们看这里:提升精确率是为了不错报、提升召回率是为了不漏报 先说个题外话,暴击一下乱写博客的人,网络上很多地方分不清准确率和精确率&am…...
【脚本推荐】网页字体渲染插件
下图是三种网页字体增强的效果对比。 **SUM:**前面两个都是通过脚本运行,而最后一个是通过扩展插件;中间的脚本(字体渲染)效果是最好的,可惜输入框没有效果,也就意味着如果现在网页上写写学习笔…...
c++——c/c++中的static和const
C语言和c中的static关键字与const关键字 static: //改变存储区域,限制作用域 ①、改变存储区域: 在不同的上下文中,static 关键字可以用于改变变量或函数的存储区域。在函数内部,static 用于将局部变量的生存期从函数…...
解决git:‘remote-http‘ 不是一个 git 命令错误提示
Jenkins使用Maven构建工程时,设置Git源码管理时报错: Failed to connect to repository : Command “/usr/local/git/bin/git ls-remote -h – http://192.168.1.35/root/javademo.git HEAD” returned status code 128: stdout: stderr: git:…...
深度学习入门-3-计算机视觉-卷积神经网络
一、计算机视觉 1.概述 计算机视觉作为一门让机器学会如何去“看”的学科,具体的说,就是让机器去识别摄像机拍摄的图片或视频中的物体,检测出物体所在的位置,并对目标物体进行跟踪,从而理解并描述出图片或视频里的场…...
前端面试:【闭包】JavaScript世界的神秘法术
嘿,尊敬的代码探险家!欢迎来到JavaScript的奇妙世界,今天我们将探索一种神秘的魔法,那就是闭包。闭包,听起来像是一个古老的咒语,实际上,它是编程中的一个重要概念,让你能够创造出强…...
Ubuntu20 ctrl+alt+T无法打开终端
事情是这样的,某天改了下python版本,发现linux默认打开终端的快捷键ctrlaltT寄了,网上给出的都是修改快捷键不出意外肯定没用 但是幸好我们是会分析的,我看到,很多回答说新增一个快捷键运行的命令是gnome-terminal&…...
leetcode 387.字符串中第一个唯一字符
⭐️ 题目描述 🌟 leetcode链接:https://leetcode.cn/problems/first-unique-character-in-a-string/description/ 思路: 比较优的方式使用相对映射记录的方式。在 ASCII 表中小写字母 -97 就是 0 - 25。在依次从前遍历查找即可。需要注意的…...
【三次握手】TCP三次握手由入门到精通(完整版)
⬜⬜⬜ 🐰🟧🟨🟩🟦🟪(*^▽^*)欢迎光临 🟧🟨🟩🟦🟪🐰⬜⬜⬜ ✏️write in front✏️ 📝个人主页:陈丹宇jmu &am…...
Java 异步计算
CompletableFuture(可完成的Future) 一个可完成的Future,在我们调用他的get方法的时候,他会阻塞等待这个任务完成来获取他的结果。 当然也可以为这个任务注册一些回调,类似于完成时,出现异常时,…...
【FAQ】调用视频汇聚平台EasyCVR的iframe地址,视频无法播放的原因排查
有用户反馈,在调用iframe地址后嵌入用户自己的前端页面,视频无法播放并且要求登录。 安防监控视频汇聚平台EasyCVR基于云边端一体化架构,具有强大的数据接入、处理及分发能力,可提供视频监控直播、云端录像、视频云存储、视频集中…...
⛳ TCP 协议面试题
目录 ⛳ TCP 协议面试题🐾 一、为什么关闭连接的需要四次挥⼿,⽽建⽴连接却只要三次握⼿呢?🏭 二、为什么连接建⽴的时候是三次握⼿,可以改成两次握⼿吗?👣 三、为什么主动断开⽅在TIME-WAIT状态…...
C 语言的字符串函数 puts()
属于标准库 <stdio.h> 函数原型: int puts(const char *str) str – 这是要被写入的 C 字符串. 如果成功, 该函数返回一个非负值为字符串长度 (包括末尾的 \0), 如果发生错误则返回 EOF. 作用: puts() 函数只显示字符串, 把一个字符串写入到标准输出 stdout, 直到空…...
Flutter如何知道页面/组件可见?
在以前项目中,onPageShow和onPageHide由开源框架flutter_boost提供,在此次项目中,创新性的采用了fusion框架,fusion框架同样提供了类似的方法,但在实践中发现,当flutter页面相互replace或者多次pop页面后,onPageShow不会调用,这就导致了诸多bug,于是,需要探索如何了解…...
【MySQL】如何使用Named Pipe协议(Windows)连接MySQL数据库
文章目录 【MySQL】如何使用Named Pipe协议(Windows)连接MySQL数据库连接MySQL的协议使用Named Pipe协议(Windows)连接MySQL步骤1:确认MySQL服务器已启用Named Pipe连接启动Named Pipe连接方法 步骤2:客户端使用Named Pipe连接MySQL服务器。例1ÿ…...
【c++】c++的一些技术操作
pthread_create 的第三个参数,为函数指针,指向处理线程函数的地址。该函数,要求为静态函数。如果处理线程函数为类成员函数时,需要将其设置为静态成员函数。C静态成员函数访问非静态成员 https://blog.csdn.net/yueguangmuyu/arti…...
Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...
华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)
题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...
