Redis原理及应用

news2024/11/25 2:51:45

Redis简介

        Redis是开源的(BSD许可),数据结构存储于内存中,被用来作为数据库,缓存和消息代理。它支持多种数据结构,例如:字符串(string),哈希(hash),列表(list),集合(set),带范围查询的排序集合(zset),位图(bitmap),hyperloglog,带有半径查询和流的地理空间索引(geospatial)。 Redis具有内置的主从复制机制,Lua脚本,事务和不同级别的磁盘持久性,并通过Redis Sentinel和Redis Cluster自动分区提供高可用性。

Redis各数据结构常用命令

String 类型常用命令

命令行 含义
set key value 赋值key的值为value
get key / del key 获取key的value值 / 删除key
expire key seconds 设置key在seconds秒后过期
setex key seconds value SET + EXPIRE的组合指令
ttl key 查看key还有多久过期
setnx key value 如果key不存在,才新增key和value
strlen key 计算指定key的值的长度
incr key value值加1
incrby key numbers 指定增加值,numbers可以是负值
mset key1 value1 key2 value2 ... 批量添加
mget key1 key2 key3 … 批量获取

List类型常用命令

命令行 含义
lpush key value1 value2 左侧插入value
rpush key value1 value2 右侧插入value
lrange key startIndex endIndex 查看指定元素,下标从0开始,-1为倒数第一个
lpop key 左侧弹出value
rpop key 右侧弹出value
llen key 查看key的长度
lindex key index 查看列表中某个index对应的value值
ltrim key startIndex endIndex仅保留某区间的列表,其余元素全被删除

Set类型常用命令

命令行 含义
sadd key value1 value2 添加元素到集合中
smembers key 查看集合中的所有元素
sismember key value 查看value是否在集合中
scard key 查询集合的长度
spop key 取出集合中的一个元素
del key 删除集合

Zset类型常用命令

命令行 含义
zadd key score1 value1 score2 value2 添加元素到有序集合中
zscore key value查看value的score值,输出score>=负无穷,score<=正无穷的所有元素
zrange key 0 -1 [withscores] 正序输出
zrangebyscore key -inf +inf [withscores] 正序输出
zrevrange key 0 -1 [withscores] 倒序输出
zcard key 查看key中的元素个数
zrangebyscore key minScore maxScore获得key中score>=minScore 且score<=maxScore 的元素,正序排列
zrevrangebyscore key maxScore minScore 同上,倒序排列
zrem key value 删除key中的元素value

Hash类型常用命令

命令行 含义
hset key name value 添加属性元素name和value到key中
hget key name 查看key的name值
hmset key name1 value1 name2 value2 批量添加key的属性元素
hmget key name1 name2 批量获取key的属性元素
hlen key 获得key的属性元素个数
hgetall key 查询key中的所有元素

Redis的持久化

RDB

        RDB持久化支持 手工执行和服务器定期执行,RDB持久化产生的文件是一个 经过压缩的二进
制文件,对应文件为dump.rdb
,因为它保存在磁盘上,所以可以用它来还原数据库中的数据。
        手动执行RDB保存有两个命令:
         SAVE命令:  阻塞Redis服务器进程,直到RDB文件生成完毕,都会一直处于阻塞状态,不能处理任何的Redis命令请求;
         BGSAVE命令:  fork一个子进程来生成RDB文件,Redis服务器进程不受影响,可以继续处理命令请求。
        当服务器启动的时候,RDB自动执行加载,没有专门的命令来加载RDB文件。只要Redis启
动时检测到RDB文件的存在,那么就会自动载入RDB文件。加载过程中,会一直处于阻塞状
态,直到加载完毕为止。由于 AOF文件的更新频率一般比RDB文件的更新频率高,所以,如
果服务期开启了AOF持久化功能,那么就优先加载AOF文件,否则,加载RDB文件。

AOF

        AOF 是通过 保存Redis执行命令 来记录数据库数据变更。
        分为三步: 命令追加—— > 文件写入—— > 文件同步 ,如果打开AOF后,每 次执行完一个写命令之后,都会把写命令以请求协议格式保存到 aof_buf缓冲区 的末尾。
开启AOF:   appendonly yes   (默认为no 打开为yes)
配置 AOF路径 appendfilename:"appendonly.aof" (默认配置,路径为...-/redis-3.0.0/src/appendonly.aof)
AOF持久化机制:
AOF加载还原流程:
AOF文件重写机制: AOF文件不可能一直无限制的累加增大, 当Redis到达配置的某些阈值条件时, 就会触发重写机制, 也可以通过手动执行  bgrewriteaof 命令来触发, 它是把redis进程内的数据转换为写命令同步到新AOF文件的过程.
重写机制降低了AOF文件占用空间,更小的AOF文件可以更快被redis加载.

auto-aof-rewrite-min-size:表示运行AOF重写时文件最小体积,默认为64M 
auto-aof-rewrite-percentage:代表当前AOF文件空间(aof_current_size)和上一次重写后AOF文件空间(aof_base_size)的比值。


重写后的AOF文件为什么可以变小?

  • 进程内已经超时的数据不再写入文件。
  • 旧的AOF文件含有无效命令,如del key1,hdel key2,srem keys,set a 111,set a222
  • 重写使用进程内数据直接生成,这样新的AOF文件只保留最终的数据的写入名。
  • 多条写命令可以合并为1个。如 lpush list a,lpush list b,lpush list c,可以转换为lpush list a b c .为了防止单条命令过大造成客户端缓冲区溢出,
  • 对于list,set,hash,zset类数据类型,以64个元素为界限拆分为多条。

Redis主从复制

        主从复制是指 将一台Redis服务器的数据复制到其他的Redis服务器。前者称为 主节点(Master/Leader),后者称为 从节点(Slave/Follower);数据是从主节点复制到从节点的。其中, 主节点负责写数据(当然有读的权限), 从节点负责读数据(它没有写数据的权限)。默认配置下,每个Redis都是主节点。主从节点是1对N的关系。

主从复制的好处:

  • 数据冗余: 主从复制实现了数据的备份,实际上提供了数据冗余的实现方式。
  • 故障恢复: 当主节点出现异常时,可以由从节点提供服务,实现快速的故障恢复,实际上提供了服务冗余的实现方式。
  • 负载均衡: 在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务,分担服务器的负载;在写少读多的业务场景下,通过多个从节点分担读负载,可以大大提高Redis服务器是并发量。
  • 高可用:  哨兵配合主从复制,可以是实现Redis集群的高可用.

Redis的主从复制可以分为两个阶段:sync阶段(首次启动的全量同步)commandpropagate阶段(后续的增删改命令同步).

        但是每次主从节点重新链接都要全量同步也是很耗费资源的, 后续Redis2.8做出优化引入了 psync指令来代替sync指令。psync指令会根据不同的情况,来确定执行全量重同步还是分重同步

主从同步防止数据丢失---复制偏移量

        Master节点和Slave节点都保存着一份 复制偏移量 。当Master节点每次向Slave节点发送n字 节数据的时候,就会在Master节点偏移量加上n;而Slave节点每次接收到n个字节的时候,也会在Slave节点偏移量上加n。 在命令传播阶段,Slave节点会定期的发送心跳REPLCONFACK{offset}指令,这里的offset就是Slave节点的offset。当Master节点接收到这个心跳指令后,会对比自己的offset和命令里的offset,如果发现有数据丢失,那么Master节点就会推送丢失的那段数据给Slave节点

Redis哨兵模式

        哨兵本质就是一个Redis实例节点。哨兵模式是一种特殊的模式,它能够后台监控主机是否故障,如果主机故障了,则根据投票数自动将Slave节点转换为新的Master节点。 首先Redis提供了哨兵的命令,哨兵是一个独立的进程,会独立的运行。它的原理是:哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。

选举流程
        
当一个Sentinel判断主节点不可用的时候,会首先进行“主观下线”。此时,这个Sentinel
通过sentinel is-masterdown-by-addr指令获取其他哨兵节点对主节点的判断,如果当
前哨兵节点对主节点主观下线的票数超过了我们定义的quorum值,则主节点被判定为
“客观下线”。
        Sentinel节点会从原主节点的从节点中选出一个新的主节点,选举流程如下:
① 首先,过滤掉所有主观下线的节点。
② 然后,选择slave-priority最高的节点,如果有则返回,没有就继续下面的流程。
③ 选择出复制偏移量offset最大的节点,如果有则返回,没有就继续下面的流程。
④ 选择run_id最小的节点,其中,run_id表示服务器运行 ID。
⑤ 在选择完毕后,Sentinel节点会通过SLAVEOF NO ONE命令让选择出来的从节点成为主
节点,然后通过SLAVEOF命令让其他的节点成为该节点的从节点。

Redis Cluster集群

        Redis3.0开始引入了去中心化分片集群Redis Cluster
        传统的Redis集群是基于主从复制+哨兵的方式来实现的。但是集群中都只有一个主节点提供写服务
        Redis Cluster则采用多主多从的方式,支持开启多个主节点,每个主节点上可以挂载多个从节点。
        Cluster会将数据进行分片(虚拟节点 + 一致性哈希)将数据分散到多个主节点上,而每个主节点都可以对外提供读写服务。这种做法使得Redis突破了单机内存大小限制,扩展了集群的存储容量。并且Redis Cluster也具备高可用性,因为每个主节点上都至少有一个从节点,当主节点挂掉时,Redis Cluster 的故障转移机制会将某个从节点切换为主节点。
        Redis Cluster是一个去中心化的集群每个节点都会与其他节点保持互连,使用gossip协议来交换彼此的信息,以及探测新加入的节点信息。并且Redis Cluster无需任何代理,客户端会直接与集群中的节点直连。

 数据分片:一个集群包含16384个哈希槽(hashslot)也就是16384个虚拟节点。将虚拟节点分配给实际节点,然后由虚拟节点来抢占由整个哈希值空间组织成的一个虚拟的圆环.

 Redis面试题

分布式锁 (getset命令/lua脚本)

缓存穿透(Redis和数据库都没有的数据) 解决方案:

1.将数据库返回的空数据也缓存到Redis, 并设置合理过期时间

2. 布隆过滤器(它可以判断某个数据一定不存在,但是无法判断一定存在)

缓存击穿(某热点数据在过期的情况下有大量高并发请求) 解决方案:

1. 设置热点数据永不过期

2. 加锁,过期时只允许一个线程去数据库查询并缓存

缓存雪崩(大量数据同一时间过期或者Redis宕机) 解决方案:

1.搭建集群

2.服务限流降级

3.将数据的过期时间尽量打散, 别集中在同一时间

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

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

相关文章

Unity类银河战士恶魔城学习总结(P141 Finalising ToolTip优化UI显示)

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili 教程源地址&#xff1a;https://www.udemy.com/course/2d-rpg-alexdev/ UI部分暂时完结&#xff01;&#xff01;&#xff01; 本章节优化了UI中物品描述的显示效果&#xff0c;技能描述的显示效果 并且可以批…

oracle的静态注册和动态注册

oracle的静态注册和动态注册 静态注册&#xff1a; 静态注册 : 指将实例的相关信息手动告知 listener 侦 听 器 &#xff0c; 可以使用netmgr,netca,oem 以及直接 vi listener.ora 文件来实现静态注册&#xff0c;在动态注册不稳定时使用&#xff0c;特点是&#xff1a;稳定&…

社交电商专业赋能高校教育与产业协同发展:定制开发AI智能名片及2+1链动商城小程序的创新驱动

摘要&#xff1a;本文围绕社交电商有望成为高校常态专业这一趋势展开深入探讨&#xff0c;剖析国家政策认可下其学科发展前景&#xff0c;着重阐述在专业建设进程中面临的师资短缺及实践教学难题。通过引入定制开发AI智能名片与21链动商城小程序&#xff0c;探究如何借助这些新…

数据指标与标签在数据分析中的关系与应用

导读&#xff1a;分享数据指标体系的文章很多&#xff0c;但讲数据标签的文章很少。实际上&#xff0c;标签和指标一样&#xff0c;是数据分析的左膀右臂&#xff0c;两者同样重要。实际上&#xff0c;很多人分析不深入&#xff0c;就是因为缺少对标签的应用。今天系统的讲解下…

使用Electron将vue2项目打包为桌面exe安装包

目录 一、下载electron模板项目 【electron-quick-start】​ 二、打开项目&#xff0c;安装所有依赖 三、在打exe包的时候报错是因为没有&#xff0c;需要检查并安装之后重新打包&#xff1b; 四、经过这么疯狂的一波操作之后&#xff0c;就可以打包出你想要的exe安装包&am…

MySQL基础大全(看这一篇足够!!!)

文章目录 前言一、初识MySQL1.1 数据库基础1.2 数据库技术构成1.2.1 数据库系统1.2.2 SQL语言1.2.3 数据库访问接口 1.3 什么是MySQL 二、数据库的基本操作2.1 数据库创建和删除2.2 数据库存储引擎2.2.1 MySQL存储引擎简介2.2.2 InnoDB存储引擎2.2.3 MyISAM存储引擎2.2.4 存储引…

Linux之NFS共享文件操作

一、注意点 以下操作使用root用户 代理端需要访问服务端的2049、111端口二、nfs下载 # 服务端和代理端都要安装 yum –y install rpcbind yum –y install nfs-utils三、配置共享目录-【服务端】 *修改/etc/exports文件&#xff0c;追加以下内容 /home/app_adm/test ip1(in…

C#学习笔记——窗口停靠控件WeifenLuo.WinFormsUI.Docking使用-腾讯云开发者社区-腾讯云

C#学习笔记——窗口停靠控件WeifenLuo.WinFormsUI.Docking使用-腾讯云开发者社区-腾讯云 C#学习笔记——窗口停靠控件WeifenLuo.WinFormsUI.Docking使用 发布于 2021-06-10 00:10:59 7.1K0 举报 文章被收录于专栏&#xff1a;c#学习笔记 一、介绍 DockPanelSuite是托管在…

杰发科技AC7840——EEP中RAM的配置

sample和手册中示例代码的sram区地址定义不一样 这个在RAM中使用没有限制&#xff0c;根据这个表格留下足够空间即可 比如需要4096字节的eep空间&#xff0c;可以把RAM的地址改成E000&#xff0c;即E000-EFFF&#xff0c;共4096bytes即可。

web-03

CSS回顾 选择器 标签选择器 标签{}ID选择器 标签中定义ID属性。 #ID值{}类选择器 标签中使用class属性 .类名{}关于DIV/span div任意的大小的长方形&#xff0c;大小css&#xff1a; width, height控制。—换行 span-- 一行内 CSS常用属性 width/height 宽度/高度 定义&…

CI配置项,IT服务的关键要素

随着现今数字经济的不断发展&#xff0c;逐渐成熟的IT 基础设施已不再是简单的竞争优势&#xff0c;而已成为企业生存和发展的基石。然而&#xff0c;仅仅拥有强大的基础设施是不够的。为了保障 IT 服务的平稳运行和持续交付&#xff0c;企业还需要重点关注 IT 服务的核心构建模…

ApiChain-编写迭代单测用例

项目地址&#xff1a;ApiChain 项目主页 写单测用例&#xff0c;就像画一幅有向不循环的图&#xff0c;图中的每个节点是这个单测用例的每一个步骤&#xff0c;连线代表着数据的流向&#xff0c;这幅图通常有一个或者多个起点&#xff0c;但通常只有一个终点。起点的数据来源于…

九、FOC原理详解

1、FOC简介 FOC&#xff08;field-oriented control&#xff09;为磁场定向控制&#xff0c;又称为矢量控制&#xff08;vectorcontrol&#xff09;&#xff0c;是目前无刷直流电机&#xff08;BLDC&#xff09;和永磁同步电机&#xff08;PMSM&#xff09;高效控制的最佳选择…

企业OA管理系统:Spring Boot技术实现与案例研究

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了企业OA管理系统的开发全过程。通过分析企业OA管理系统管理的不足&#xff0c;创建了一个计算机管理企业OA管理系统的方案。文章介绍了企业OA管理系统的系统分析部…

【tensorflow的安装步骤】

创建一个虚拟环境 conda create -n tensorflow python3.6激活虚拟环境 conda activate tensorflow使用镜像源下载 pip install tensorflow1.15.0 -i https://pypi.tuna.tsinghua.edu.cn/simple/特别特别重要的点&#xff01;&#xff01;&#xff01; 别用WiFi或者校园网下…

网络安全-web架构-nginx配置

1. nginx访问&#xff1a; 访问的是index.html&#xff0c; 访问ip访问的资源就是在/usr/share/nginx/html中&#xff1b; 当nginx不认识&#xff0c;浏览器认识的话&#xff0c;浏览器会自动渲染。 当nginx认识&#xff0c;浏览器不认识的话&#xff0c;浏览器会把它加载成…

ES6 模块化语法

目录 ES6 模块化语法 分别暴露 统一暴露 ​编辑 默认暴露 ES6 模块化引入方式 ES6 模块化语法 模块功能主要由两个命令构成&#xff1a;export 和 import。 ⚫ export 命令用于规定模块的对外接口&#xff08;哪些数据需要暴露&#xff0c;就在数据前面加上关键字即可…

基于Java Springboot高校洗浴管理系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据…

stm32如何接收舵机的控制信号(而不是控制舵机)

看到很多如何stm32用pwm信号控制舵机的文章,老生常谈了 我来写一个stm32接收pwm信号的例子 ,这个pwm信号是用来控制舵机的 背景: 我需要接收航模接收机的,用来控制舵机的pwm信号, 得到这个信号后,做其他事情. 初版代码 pwm.h#ifndef _pwm_H #define _pwm_H#include "s…

Postman之pm.test断言操作

系列文章目录 1.Postman之安装及汉化基本使用介绍 2.Postman之变量操作 3.Postman之数据提取 4.Postman之pm.test断言操作 5.Postman之newman Postman之pm.test断言操作 1.断言方法2.连接符3.条件判断符 用于验证请求的响应数据是否符合预期 1.断言方法 pm.test()&#xff1a;…