Redis面试准备

news2025/2/28 23:28:09

1. redis网站 

Redis

Redis文档中心 -- Redis中国用户组(CRUG)

数据库排名网站:DB-Engines - Knowledge Base of Relational and NoSQL Database Management Systems

2. 基础知识

磁盘中的寻址速度是毫秒级,内存中寻址速度是纳秒级,在寻址上,磁盘比内存慢了10w倍

磁盘中,每个扇区是512字节

无论你读多少,操作系统都是最少从磁盘中拿4k

文件变大,磁盘io会成为瓶颈

数据库中有data page,大小是4k,和磁盘的读取大小一致

带宽:数据传输能力的大小

因为磁盘存储检索速度会变慢,内存存储价格比较昂贵,所以出现了缓存的概念,把少量数据存储在缓存中

3. 安装

1)下载

先去官网找到要下载的版本,例如:https://download.redis.io/releases/redis-6.2.7.tar.gz 

然后通过wget下载(也可以直接下载)

解压redis安装包 

tar -xf redis-6.2.7.tar.gz

 进入解压后的文件夹,其中有个README.md文件,可以查看这个文件进行操作

2)编译

make

3)启动

 执行src目录下的./redis-server命令,启动redis

./src/redis-server

安装redis到执行目录下

 make install PREFIX=/root/redis/redis6

4)配置文件 

在/tec/profile文件中,加redis_home

vim /etc/profile

export REDIS_HOME=/opt/redis/redis6
export PATH=$PATH:$REDIS_HOME/bin

重新加载配置文件

source /etc/profile

这样,在任意位置都可以执行redis的命令了

5)添加实例

执行安装目录的utils目录下的install_server命令

 ./utils/install_server.sh 

会出现端口号、文件地址、日志地址让选择,直接回车表示默认

 查看redis的状态(redis_6379 可以在/etc/init.d目录中查看)

service redis_6379 status

如果执行发生如下报错,

 注释掉 install_server.sh中的相关代码

 也可以继续在utils目录下执行install_server命令,启动更多的redis进程(实例)

6)连接redis

到安装路径下的bin目录中,执行

./redis-cli

4. redis相关小知识

redis是单进程、单线程、单实例的

epoll是Linux内核为处理大批量句柄而作了改进的poll

redis-cli:进入redis

redis-cli -h:查看帮助

redis默认有16个库

flushdb、flushall命令可以清库

help @String  查看string相关的命令

redis可以实现发布订阅功能:publish、subscribe

redis可以安装布隆过滤器的插件

5. IO

1.bio:同步阻塞io,read,write系统调用会阻塞,因此需要很多线程处理

2.nio:非阻塞io,同步非阻塞,但是需要循环多次进行系统调用read

3.同步非阻塞:select一次检测多个,循环read,但是需要在内核空间和用户空间来回拷贝

4.epoll:多路复用nio,依然是同步非阻塞io,因为虽然等待事件发生,但是依然需要自己调用read系统调用读取数据,先调用create创建一个注册器,ctl.add,del从注册器上新增或删除连接,wait等待连接产生事件,每次新链接绑定到注册器上,一次系统调用得到需要处理的socket,然后再循环处理有数据读写的socket连接

5.linux没有aio,windows的aio,read调用扔一个buffer到内核空间,内核读取数据到bugffer,完毕后通知用户线程进行操作

6. setNx和setXx

nx:不存在添加

xx:存在才能更新

7. 正反索引

正向的是 0、1、2...

反向的是-1、-2、-3...

8. 二进制安全

redis为了二进制安全,取的是字节流,

计算时,把字节流转换成数字

9. String

string:可以存字符串、数值、bitmap

bitmap的操作:setbit、bitcount、bitpos、bitop

10. List

list:链表,可以当做堆(同向操作)、队列(反向操作)、数组(lindex)、阻塞队列(BLPOP)

ltrim:删除队列两端的数据

11. Set

set可以做交并差集合操作

srandmember key count命令可以产生随机的列表(count是整数去重,负数不去重),可以用于抽奖

12. ZSet

zset:有序的,不可重复的;物理内存左小右大

可以进行交集、并集的集合操作(可以设置权重和聚合操作)

用skipList进行存储

13. 事务

multi:开启事务

discard:取消事务

exec:执行事务

watch:监控事务,如果监控的值被修改,事务不执行

先发送exec命令的先执行

通过管道实现事务

管道:将多个命令一次发送给服务器,降低通信成本

14. 缓存淘汰策略

redis可以设置内存大小,内存满了以后,执行淘汰策略

LRU:最久使用

LFU: 最少使用

15. 过期时间

过期时间不会随着使用延长;

如果重新写值,并且没有给定过期时间,过期时间为-1(没有过期时间)

redis的key也可以定时过期

16. redis淘汰过期key

 

17. 管道

Linux中,| 是管道的意思,

作为衔接,前一个命令的输出作为后一个命令的输入

管道会触发创建子进程

父进程可以让子进程看到数据(export)

子进程的修改不会破坏父进程

父进程的修改也不会破坏子进程

18. RDB

RDB,通过fork创建子进程并拷贝副本,来将数据写入磁盘,写入的是时点数据;父进程对数据进行修改,子进程看不到父进程的修改;

父子进程的数据是隔离的

save:手动rdb

bgsave:在后台通过fork进行rdb

也可以在配置文件中设置rdb的时间

 弊端:不是实时记录数据变化,可能会导致数据丢失

优点:恢复速度较快

19. AOF

缺点:体量大,恢复慢

优点:数据相对完整

4.0以前,会对aof日志进行重写,抵消部分日志,合并部分日志

4.0以后,会将rdb文件写到aof前面,将增量的操作以指令的方式写在后面

20. AKF

X:  增加副本,可以节点单点故障,读写分离

Y: 按照功能业务划分成多个进程

Z: 按照优先级、逻辑再拆分

21. 集群

强一致性可能会破坏可用性

主从:客户端可以访问主,也可以访问从

主备:客户端只访问主,当主挂了以后,备当主

集群一般使用奇数台,节省资源

replicaof:可以追随某个主节点,自己当从节点

redis通过哨兵和自动分区提供高可用

22. 哨兵,Sentinel

用于监控、提醒、自动故障转移

每个哨兵只知道主节点信息,通过发布订阅知道其他哨兵信息

23. 新增redis实例

新增redis实例可以解决数据量大的问题

可以根据业务或者逻辑来区分数据存放哪个redis,但是如果数据已经不能通过业务逻辑来区分的话

可以用hash+取模来决定数据放在哪个redis实例上,但是如果要增加redis实例的话,这种方式需要把所有数据重新算一下,再次存放

可以用一致性哈希算法,根据redis实例和数据来构成哈希环来解决所有数据都需要重新算的问题,但是这种,新增redis实例,会导致部分数据查询不到

 也可以通过代理层来解决访问redis实例

可以参考github中的twemproxy

也可以通过预分区的概念来选择访问redis实例(每个节点分几个hash值)

redis的cluster模式就是选用这种预分区的模式来进行redis实例选择,客户端先访问一个redis实例,然后进行hash计算,并且redis实例中有维护其他redis实例hash对应实例表,这样就可以返回这个key对应的是哪台redis实例。然后客户端再去访问对应的客户端

redis的连接成本很高,可以用nginx来解决

数据分布在不同的redis实例上以后,聚合操作、事务很难实现。可以人为的设置相同的前缀,然后用前缀来进行hash计算, {xx}k1,来实现需要进行聚合、事务操作的数据放进同一个redis实例上

24. 击穿

某个热点key过期,导致大量请求到了数据库

解决方案:

1. 设置热点key永不过期

2. 大量请求使用setnx分布式锁,只有获得锁的才能去请求数据库,并且将结果写入redis中,这样其他请求直接访问redis就好了

25. 穿透

大量请求某个不存在的key

解决方案:

1. 将不存在的key写入redis中,值为null

2. 使用布隆过滤器,也可以使用布谷鸟(支持删除的布隆过滤器)

26. 雪崩

大量热点key过期,导致大量请求到了数据库

解决方案:

1. 如果过期时间不是必须是相同的,可以设置随机的过期时间

2. 其他解决方案同击穿

27. 分布式锁

可以用setnx做分布式锁,但是

1. 如果加锁部分执行有问题,一直不释放锁怎么办

2. 加过期时间,过期时间设置多久合适,设置太短会导致业务代码没有执行完,锁就释放了,设置太长可能会导致阻塞住了

3. 使用多线程来监控加锁代码什么时候执行完,这样会增加代码复杂度

28. redis常用的客户端

Jedis:线程不安全

Lettuce:RedisClient ;线程安全的,可以同步

RedisTemplate:StringRedisTemplate可以解决key序列化问题

springboot整合redis时,需要对key和value进行序列化

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

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

相关文章

[ vulhub漏洞复现篇 ] struts2远程代码执行漏洞s2-048(CVE-2017-9791)

一、漏洞编号 s2-048 CVE-2017-9791二、影响范围 Apache Struts 2.3.x系列中启用了struts2-struts1-plugin插件的版本三、漏洞描述 Apache Struts2 2.3.x 系列启用了struts2-struts1-plugin 插件并且存在 struts2-showcase 目录,其漏洞成因是当ActionMessage接收客户可控的参…

【论文精读】Focal Inverse Distance Transform Maps for Crowd Localization

文章目录摘要主要贡献主要内容一、FIDT二、LMDS三。I-SSIM loss摘要 在本文中,我们关注人群定位任务,这是人群分析的一个重要课题。基于回归的方法大多使用卷积神经网络( CNN )对密度图进行回归,在极度稠密的场景中无法准确定位实例&#xf…

跨境卖家如何以最少量的预算建立品牌知名度?

关键词:跨境卖家、品牌知名度 什么是品牌知名度? 品牌知名度反映了您的目标受众对您的品牌的了解、认可和记忆程度。 为什么品牌知名度至关重要? 当您的目标受众需要您提供的产品或服务时,您希望他们考虑您的品牌。为此&#xf…

windows下nginx隐藏HTTP 请求头文件中的Server信息

简介 本文主要是隐藏HTTP 请求头文件中的Server信息 解决问题主要分下面几步 一、准备编译所需要的环境 二、修改nginx源码改变配置 三、编译nginx源码生成新的nginx.exe 四、替换nginx.exe,重新启动nginx 1. 准备所需环境 环境都需要准备好,因为编译是…

精品spring boot+MySQL线上点餐系统vue

《spring bootMySQL线上点餐系统》该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等 使用技术: 操作系统:Windows 10、Windows 7、Windows 8 开发语言:Java 使用框架:spring boot 前端技术&#xff…

大数据毕业设计人体跌倒检测系统

文章目录前言1 实现方法传统机器视觉算法基于机器学习的跌倒检测SVM简介SVM跌倒检测原理算法流程算法效果实现代码深度学习跌倒检测最终效果网络原理最后前言 背景和意义 在美国,每年在65岁以上老人中,平均每3人中就有1人发生意外跌倒,每年…

[附源码]Node.js计算机毕业设计关于人脸识别的实验教学管理系统Express

项目运行 环境配置: Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境:最好是Nodejs最新版,我…

嵌入式分享合集122

一、分析电容降压电路工作原理 电容降压电路,因其成本低廉、体积小而被广泛地使用,此一优点足以掩盖其它所有缺点:输出电流小(一般控制在100mA以内),与市电直通非隔离而存在安全隐患,输出电压波…

饥荒服务器搭建(windows)

文章目录1. 获取服务器票据2. 新建游戏存档3. 饥荒服务器配置1. 获取服务器票据 步骤1:登录Klei官网 步骤2:点击菜单栏游戏——选择饥荒服务器 步骤3:创建服务器获取票据,后面将会用到。 2. 新建游戏存档 步骤1:下载…

Python开发游戏?也太好用了吧

程序员宝藏库:https://gitee.com/sharetech_lee/CS-Books-Store 当然可以啦! 现在日常能够用到和想到的场景,绝大多数都可以用Python实现。 效果怎么样暂且不提,但是得益于丰富的第三方工具包,的确让Python能够很容易…

二进制包安装公有云版k8s

目录公有云版k8s的架构是怎样的公有云中创建k8s实例的过程如下二进制法创建k8s的一般过程Kubernetes的重要性check nodes每台服务器执行基线配置CA rootetcd HA cluster根据CA根证书创建etcd的专有CA证书将etcd注册成为systemd服务配置各master节点的etcd.confansible配置各个m…

4线SPI驱动OLED常规操作

拿到一块点阵屏幕,首先找卖家拿驱动例程 步骤 目录 1.void LCD_IO_Cfg(void) 2.void wr_cmd(u8 wrcmd) 3.void wr_data(u8 wrdata) 4.void init_lcd(void) 5.void disp_all(void) 6.void Fresh(void) 注:根据商家的时序图可以知道数据在上升沿/下降…

[附源码]Node.js计算机毕业设计高校学科竞赛报名系统Express

项目运行 环境配置: Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术: Express框架 Node.js Vue 等等组成,B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境:最好是Nodejs最新版,我…

CBCC3 – A CBCC Algorithm with Improved Exploration/Exploitation Balance

0、论文背景 本文是在CBCC1和CBCC2的基础上提出了CBCC3。在本文中,证明了过度探索和过度开发是现有CBCC变体中性能损失的两个主要来源。在此基础上,提出了一种新的基于贡献的算法,可以在探索和开发之间保持更好的平衡。 Omidvar M N, Kazimi…

复现readme中的一个坑...

今天在运行一个项目的时候“Molecule Optimization via Fragment-based Generative Models”:GitHub - ninglab/Modof: The implementation of Modof for Molecule Optimization 然后妈的死活运行不出来,就是说在运行readme的时候都不行,我看…

Win10系统下与VMware中Ubuntu20.04建立共享文件夹

一、在VMware中设置 二、在Ubuntu中设置 1.在终端中输入下面命令,列出步骤一中设置的VMware共享文件夹名称,说明可以挂载 ~$ vmware-hgfsclient 返回 ubuntushare 2.执行下面命令,创建共享文件夹专用的挂载目录 ~$ sudo mkdir -p /mnt/hgfs …

基于ESP32-S3方案的2.1寸旋钮屏ZX2D10来了,同步分享ESP32应用功能技术之「WEB API接口」

启明智显基于ESP32-S3与国产芯高效开发平台8ms设计开发的一款磁编码结构的旋钮屏。结构紧凑、简单,外观精致;支持WIFI、蓝牙,语音交互等功能。 产品说明: 1. 使用乐鑫ESP32-S3 WI-FI SOC芯片,SOC提供WI-FI与BLE连接能力…

Java容器源码重点回顾——CopyOnWriteArrayList

1. CopyOnWriteArrayList概述 之前介绍过ArrayList,但是我们知道ArrayList是线程不安全的。如果多个线程同时写数据,就会抛出ConcurrentModificationException。然后我们又学过Vector,它的实现方式是在方法中都加入synchronized关键字&#…

selenium自动测试常用脚本

一、控制已经打开页面的浏览器(已登录状态) 1、简述: 自动化执行时,一些页面操作需要用户是登录状态才能进行访问。如果每次运行自动化脚本都需要重新登录、输入短信验证码,不利于自动化快速运行。因此,需…

[附源码]Python计算机毕业设计高校学生宿舍管理信息系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等…