常见 Redis 知识点

2023-05-16

常见 Redis 知识点

1、Redis有哪些基本数据结构?

StringHashListSetSortedSet

它还有三种特殊的数据结构类型

Geospatial(地理空间,经纬度)、Hyperloglog(基数统计)、Bitmap(位图)

2、如果有大量的 key 需要设置同一时间过期,一般需要注意什么?

如果大量的key过期时间设置的过于集中,到过期的那个时间点,Redis可能会出现短暂的卡顿现象。严重的话会出现缓存雪崩,我们一般需要在时间上加一个随机值,使得过期时间分散一些。

3、Redis为什么这么快?

  1. 基于内存存储实现

    内存读写是比在磁盘快很多的,Redis基于内存存储实现的数据库,相对于数据存在磁盘的MySQL数据库,省去磁盘I/O的消耗。

  2. 高效的数据结构

    Mysql索引为了提高效率,选择了B+树的数据结构。其实合理的数据结构,就是可以让你的应用/程序更快。

  3. 合理的数据编码

    Redis 支持多种数据数据类型,每种基本类型,可能对多种数据结构。什么时候,使用什么样数据结构,使用什么样编码,是redis设计者总结优化的结果。

  4. 合理的线程模型

    I/O 多路复用

    多路I/O复用技术可以让单个线程高效的处理多个连接请求

    单线程模型

    Redis是单线程模型的,而单线程避免了CPU不必要的上下文切换和竞争锁的消耗。

  5. 虚拟内存机制

    Redis直接自己构建了VM机制 ,不会像一般的系统会调用系统函数处理,会浪费一定的时间去移动和请求。

    Redis的虚拟内存机制是啥呢?

    虚拟内存机制就是暂时把不经常访问的数据(冷数据)从内存交换到磁盘中,从而腾出宝贵的内存空间用于其它需要访问的数据(热数据)。通过VM功能可以实现冷热数据分离,使热数据仍在内存中、冷数据保存到磁盘。这样就可以避免因为内存不足而造成访问速度下降的问题。

4. 什么是缓存穿透、缓存雪崩、缓存击、?

  1. 缓存穿透问题

    先来看一个常见的缓存使用方式:读请求来了,先查下缓存,缓存有值命中,就直接返回;缓存没命中,就去查数据库,然后把数据库的值更新到缓存,再返回。

    缓存穿透:指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,进而给数据库带来压力。

    通俗点说,读请求访问时,缓存和数据库都没有某个值,这样就会导致每次对这个值的查询请求都会穿透到数据库,这就是缓存穿透。

    2.缓存雪奔问题

    **缓存雪奔:**指缓存中数据大批量到过期时间,而查询数据量巨大,请求都直接访问数据库,引起数据库压力过大甚至 down 机。

    • 缓存雪奔一般是由于大量数据同时过期造成的,对于这个原因,可通过均匀设置过期时间解决,即让过期时间相对离散一点。如采用一个较大固定值 + 一个较小的随机值,5 小时 +0 到1800 秒酱紫。
    • Redis 故障 down 机也可能引起缓存雪奔。这就需要构造 Redis 高可用集群啦。

    3.缓存击穿问题

    缓存击穿:热点key在某个时间点过期的时候,而恰好在这个时间点对这个Key有大量的并发请求过来,从而大量的请求打到db。

    和缓存雪崩看着有点像,其实它两区别是,缓存雪奔是指数据库压力过大甚至down机,缓存击穿只是大量并发请求到了DB数据库层面。可以认为击穿是缓存雪奔的一个子集吧。有些文章认为它俩区别,是区别在于击穿针对某一热点key缓存,雪奔则是很多key。

5.Redis 过期策略和内存淘汰策略

定时过期

每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即对key进行清除。该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。

惰性过期

只有当访问一个key时,才会判断该key是否已过期,过期则清除。该策略可以最大化地节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存。

定期过期

每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key。该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果。

expires字典会保存所有设置了过期时间的key的过期时间数据,其中,key是指向键空间中的某个键的指针,value是该键的毫秒精度的UNIX时间戳表示的过期时间。键空间是指该Redis集群中保存的所有键。

Redis中同时使用了惰性过期和定期过期两种过期策略。

  • 假设Redis当前存放30万个key,并且都设置了过期时间,如果你每隔100ms就去检查这全部的key,CPU负载会特别高,最后可能会挂掉。
  • 因此,redis采取的是定期过期,每隔100ms就随机抽取一定数量的key来检查和删除的。
  • 但是呢,最后可能会有很多已经过期的key没被删除。这时候,redis采用惰性删除。在你获取某个key的时候,redis会检查一下,这个key如果设置了过期时间并且已经过期了,此时就会删除。

Redis 内存淘汰策略

  • volatile-lru:当内存不足以容纳新写入数据时,从设置了过期时间的key中使用LRU(最近最少使用)算法进行淘汰;
  • allkeys-lru:当内存不足以容纳新写入数据时,从所有key中使用LRU(最近最少使用)算法进行淘汰。
  • volatile-lfu:4.0版本新增,当内存不足以容纳新写入数据时,在过期的key中,使用LFU算法进行删除key。
  • allkeys-lfu:4.0版本新增,当内存不足以容纳新写入数据时,从所有key中使用LFU算法进行淘汰;
  • volatile-random:当内存不足以容纳新写入数据时,从设置了过期时间的key中,随机淘汰数据;。
  • allkeys-random:当内存不足以容纳新写入数据时,从所有key中随机淘汰数据。
  • volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的key中,根据过期时间进行淘汰,越早过期的优先被淘汰;
  • noeviction:默认策略,当内存不足以容纳新写入数据时,新写入操作会报错。

6.Redis 的持久化机制有哪些?

RDB:

就是把内存数据以快照的形式保存到磁盘上。

什么是快照?可以这样理解,给当前时刻的数据,拍一张照片,然后保存下来。

RDB持久化,是指在指定的时间间隔内,执行指定次数的写操作,将内存中的数据集快照写入磁盘中,它是Redis默认的持久化方式。执行完操作后,在指定目录下会生成一个dump.rdb文件,Redis 重启的时候,通过加载dump.rdb文件来恢复数据。

在 m 秒内数据集存在 n 次修改,自动触发 RDB 机制

RDB 的优点

  • 适合大规模的数据恢复场景,如备份,全量复制等

RDB缺点

  • 没办法做到实时持久化/秒级持久化。
  • 新老版本存在RDB格式兼容问题

AOF(append only file):

持久化,采用日志的形式来记录每个写操作,追加到文件中,重启时再重新执行AOF文件中的命令来恢复数据。它主要解决数据持久化的实时性问题。默认是不开启的。

AOF的优点

  • 数据的一致性和完整性更高

AOF的缺点

  • AOF记录的内容越多,文件越大,数据恢复变慢。

7.怎么实现Redis的高可用?

我们在项目中使用Redis,肯定不会是单点部署Redis服务的。因为,单点部署一旦宕机,就不可用了。为了实现高可用,通常的做法是,将数据库复制多个副本以部署在不同的服务器上,其中一台挂了也可以继续提供服务。 Redis 实现高可用有三种部署模式:主从模式,哨兵模式,集群模式

  1. 主从模式

    主从模式中,Redis部署了多台机器,有主节点,负责读写操作,有从节点,只负责读操作。从节点的数据来自主节点,实现原理就是主从复制机制

  2. 哨兵模式

    主从模式中,一旦主节点由于故障不能提供服务,需要人工将从节点晋升为主节点,同时还要通知应用方更新主节点地址。

    哨兵模式,由一个或多个Sentinel实例组成的Sentinel系统,它可以监视所有的Redis主节点和从节点,并在被监视的主节点进入下线状态时,自动将下线主服务器属下的某个从节点升级为新的主节点。但是呢,一个哨兵进程对Redis节点进行监控,就可能会出现问题(单点问题),因此,可以使用多个哨兵来进行监控Redis节点,并且各个哨兵之间还会进行监控。

    简单来说,哨兵模式就三个作用:

    • 发送命令,等待Redis服务器(包括主服务器和从服务器)返回监控其运行状态;
    • 哨兵监测到主节点宕机,会自动将从节点切换成主节点,然后通过发布订阅模式通知其他的从节点,修改配置文件,让它们切换主机;
    • 哨兵之间还会相互监控,从而达到高可用。
  3. ** Cluster集群模式**

    哨兵模式基于主从模式,实现读写分离,它还可以自动切换,系统可用性更高。但是它每个节点存储的数据是一样的,浪费内存,并且不好在线扩容。 因此,Cluster集群应运而生,它在Redis3.0加入的,实现了Redis的分布式存储。对数据进行分片,也就是说每台Redis节点上存储不同的内容,来解决在线扩容的问题。并且,它也提供复制和故障转移的功能。

8.Redis 事务机制

Redis通过MULTI、EXEC、WATCH等一组命令集合,来实现事务机制。事务支持一次执行多个命令,一个事务中所有命令都会被序列化。在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不会插入到事务执行命令序列中。

简言之,Redis事务就是顺序性、一次性、排他性的执行一个队列中的一系列命令。

Redis执行事务的流程如下:

  • 开始事务(MULTI)
  • 命令入队
  • 执行事务(EXEC)、撤销事务(DISCARD )

化。在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不会插入到事务执行命令序列中。

简言之,Redis事务就是顺序性、一次性、排他性的执行一个队列中的一系列命令。

Redis执行事务的流程如下:

  • 开始事务(MULTI)
  • 命令入队
  • 执行事务(EXEC)、撤销事务(DISCARD )
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

常见 Redis 知识点 的相关文章

  • 配置阿里云yum源

    1 进入到yum源配置文件 cd etc yum repos d rm f 清空所有镜像文件 2 下载aliyun centos8镜像文件 curl o etc yum repos d CentOS Base repo http mirro
  • 配置NTP服务

    设置时区为 Asia Shanghai 设置时区 xff1a timedatectl set timezone Asia Shanghai 查看时区 xff1a timedatectl 有两种情况 一 外网环境 xff0c 向互联网的NTP
  • Could not resolve host: mirrors.aliyun.com; Unknown error

    1 在下载阿里云的centos7镜像时 xff0c 报错如图 2 先ping一下www baidu com 找不到主机 xff0c 这里就说明dns有问题 3 查看一下配置 etc resolv conf 可以看出这个没有dns服务器在 x
  • OpenSSH升级

    OpenSSH是SSH协议的免费开源实现 经常会曝出安全漏洞 xff0c 由于CentOS7自带的OpenSSH版本 xff08 OpenSSH 7 4p1 OpenSSL 1 0 2k fips 26 Jan 2017 xff09 太低
  • linux查看并安装字体

    1 查看系统字体 查看所有已安装的字体 xff1a fc list 查看已安装的中文字体 xff1a fc list lang 61 zh 2 寻找字体方法 1 把windows里面的字体上传到服务器里面 windows字体存放的路径是 x
  • 简单搭建Apache服务器

    1 安装Apache服务 yum y install httpd 2 启动自启Apache服务 systemctl enable now httpd 3 访问 xff08 默认是80端口 xff0c 需要开放防火墙 xff09 4 Apac
  • docker容器设置中文编码

    使用的Dockerfile指定变量的方法 ENV LANG en US utf8
  • mysql开通binlog权限

    GRANT SELECT REPLICATION SLAVE REPLICATION CLIENT ON TO 39 v5 binlog 39 64 39 39 IDENTIFIED BY 39 v5 binlog 39
  • MySQL查看所有用户

    MySQL查看所有用户
  • 【nginx】反向代理是,url包含特殊字符导致400错误

    现象 xff1a 在一个url参数中包含了特殊字符 xff0c 通过nginx请求 xff0c 报400错误 问题分析 xff1a 这个url请求 xff0c 绕开nginx xff0c 可以返回数据 xff0c 判定是nginx出现问题
  • KVM

    KVM安装 查看cpu是否支持虚拟化 cat proc cpuinfo grep E vmx svm 关闭防火墙和selinux 注 xff1a 如果虚拟机ping不通就把防火墙开起来 1 需求内核 rhel6以上 root 64 kvm
  • nginx 防盗链详细步骤

    tailf n0 access log 实时查看网页访问详情 curl e www baidu com 127 0 0 1 e 添加访问头 本机的配置文件内容 本机的网站发布目录 别人的链接网站发布目录
  • nginx 404错误页面配置详解

    nginx 错误页面配置 再主配置文件server中加入一个location模块即可 vim etc nginx conf d default conf server listen 80 server name localhost loca
  • nginx 版本升级和添加模块详解

    版本升级 把1 16 0版本升级为1 18 0 查看本机现在版本为1 16 0 root 64 localhost usr local nginx sbin nginx v nginx version nginx 1 16 0 1 xff0
  • lvs架构

    lvs 4种模式 1 nat 网络地址转换模式 2 dr 直接路由模式 3 tun 隧道模式 4 full nat 双向转换模式 1 xff0c nat xff08 网络地址转换模式架构 xff09 1 nat模式优势是 xff0c 后端可
  • nginx 代理 负载均衡 网站转接的用法

    反向代理 1 xff0c 准备两台nginx真实服务器 a nginx 1 启动网站 内容 xff08 作为网站服务器 xff09 b nginx 2 启动代理程序 一 编辑nginx 2的配置文件 root 64 nginx server
  • LVS_Director + KeepAlived 部署

    1 xff0c 准备四台net机器 其中两台做主 备调度 别外两台做web机器 主 备调度器安装软件 root 64 lvs keepalived master yum y install ipvsadm keepalived 主 root
  • tomcat 详情介绍与部署

    1 xff0c 部署tomcat 安装JDK JDK下载面页 xff1a http www oracle com technetwork java javase downloads index html 下载jdk1 8到服务器 安装jdk
  • Redis 部署及介绍

    1 安装单机版redis root 64 redis master mkdir p data application 创建工作目录 root 64 redis master wget http download redis io relea
  • shenyu中logback替换成log4j2

    一 背景 shenyu框架默认使用的是logback处理日志 xff0c 压测发现写入日志存在瓶颈 基于log4j2优秀的性能 xff0c 使用log4j2替换logback 二 如何替换logback 1 删除logback的依赖项 sp

随机推荐

  • 图片项目部署

    1 xff0c 准备 mysql 主从 43 读写分离 3台 nginx 43 uwsgi 43 python3 6 1台 redis 哨兵 3台 A nginx uwsgi python3 上传代码包 xff0c 调试 B mysql r
  • Git 构建分布式版本控制系统详解

    安装git要4G以上内存 安装和配置必要的依赖关系 root 64 localhost yum install curl policycoreutils openssh server openssh clients 安装邮件程序 root
  • jenkins 详细部署

    部署jenkins需要以下的步骤 环境需要4G内存 1 xff0c 部署git 安装依赖环境 root 64 localhos yum install curl devel expat devel gettext devel openssl
  • RabbitMQ消息队列的部署

    RabbitMQ消息队列的用处 对于一个大型的软件系统来说 xff0c 它会有很多的组件或者说模块或者说子系统 xff08 subsystem or Component or submodule xff09 那么这些模块的如何通信 xff1
  • Docker 基础使用命令

    Docker下载 配置阿里云Docker Yum源 root 64 xingdian yum install y yum utils device mapper persistent data lvm2 git root 64 xingdi
  • docker部署mysql AB复制-详细步骤

    docker部署mysql AB复制 详细步骤 1 安装docker 参考链接 xff1a https blog csdn net qq 50263172 article details 109640641 spm 61 1001 2014
  • mysql 查询特定时间内的操作数量

    查询某几个月中每天的操作量 命令格式 Select DATE FORMAT 字段 39 Y m d 39 AS 34 时间 34 COUNT 1 AS 34 数量 34 FROM 表名 WHERE 字段 gt 39 2021 01 01 0
  • zabbix 邮箱,钉钉报警详解

    1 zabbix部署环境说明 zabbix监控服务器 xff1a mastsc zabbix被监控服务器 xff1a slave 两台机器关闭 34 selinux 34 xff1a setenforce 0 两台机器关闭防火墙 xff1a
  • Centos7离线安装redis

    Centos7离线安装redis 参考文档 xff1a https www cnblogs com yy3b2007com p 10513752 html 1 下载redis安装包 在 opt redis 如没有这个目录需要手动建立 roo
  • zabbix监控使用ping来判断主机是否存活,向邮箱发送邮件报警

    1 安装zabbix监控服务 server 和被监控服务器 slave 安装zabbix参考文档 https blog csdn net qq 50263172 article details 115519613 spm 61 1001 2
  • Feign调用错误no suitable HttpMessageConverter found for response type

    Feign接口 span class token annotation punctuation 64 PostMapping span span class token punctuation span value span class t
  • ubuntu WPS字体缺失 解决方法

    前言 请保证您还有一台windows 文章目录 前言一 在windows复制字体二 复制到ubuntu三 重启WPS总结 一 在windows复制字体 首先在windows下载好WPS xff0c 然后找到字体 xff0c 复制 二 复制到
  • 将IMG等镜像文件转换VMware虚拟机

    先下载好qemu这个转换软件 然后这个软件是用鼠标点不开的 xff0c 先到软件的文件路径然后在路径栏打cmd 或者另一种打开方法 xff0c 在文件所在位置 xff0c 按shift 43 鼠标右键 我这里用第一种 xff0c 接下来两条
  • VNC访问阿里云服务器

    最近阿里云年终特惠 xff0c 新用户服务器只要38一年 xff0c 爱住了呀 xff01 xff01 xff01 果断下单 xff01 买它个一年 xff01 接下来介绍如何通过vnc访问阿里云服务器 一 先要对端口进行开放 在服务器的防
  • ISCSI的部署与安装

    iSCSI xff08 Internet Small Computer System Interface xff0c Internet小型计算机系统接口 xff09 是一种由IBM公司研究开发的IP SAN技术 该技术是将现有SCSI接口与
  • JavaScript 中的相等操作符 ( 详解 [] == []、[] == ![]、{} == !{} )

    一 前言 xff08 比较规则 xff09 JS中的相等操作符由 61 61 表示 xff0c 如果两个操作数相等 xff0c 则返回true 原理 xff1a 相等操作符会先转换操作数 xff08 通常称为强制转型 xff09 xff0c
  • 计算机网络——IP地址与划分子网

    IP地址 1 IP地址表示 对主机和路由器来说 xff0c IP地址用32位二进制代码表示 xff0c 每八位分为一段 xff0c 每段间用空格隔开 xff0c 例如 xff1a 10000000 00001011 00000011 000
  • Snipaste下载安装(使用教程)

    Snipaste下载安装 使用教程 一 简单介绍 Snipaste 是一个免费简单但强大的截图工具 xff0c 也可以让你将截图贴回到屏幕上 xff01 下载并打开 Snipaste xff0c 按下 F1 来开始截图 xff0c 再按 F
  • thread-loader多进程打包+enternals忽略打包+dll动态链接

    当js代码用babel处理兼容性且本身代码就比较多的情况下可以使用thread loader开启多线程打包 thread loader本身启动进程就需要耗费时间 所以当js代码不多时就不要开启 否则还可能会延长打包时间 当js代码用babe
  • 常见 Redis 知识点

    常见 Redis 知识点 1 Redis有哪些基本数据结构 xff1f String Hash List Set SortedSet 它还有三种特殊的数据结构类型 Geospatial xff08 地理空间 xff0c 经纬度 xff09