memcacheredis构建缓存服务器

news2024/11/18 18:44:50

一、缓存服务器:

1、简介:

① 许多Web应用都将数据保存到RDBMS中,应用服务器从中读取数据并在浏览器中显示。 但随着数据量的增大、访问的集中,就会出现RDBMS的负担加重、数据库响应恶化、 网站显示延迟等重大影响。

● RDBMS:关系数据库管理系统(Relational Database Management System),如Oracle Database、MySQL等。

② Memcached/redis 是高性能的分布式内存缓存服务器,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web等应用的速度、 提高可扩展性。

2、缓存服务器作用:

加快访问速度 缓解数据库压力

● NOSQL:Not Only SQL ,非关系型数据库的一种概念,以键值对的方式存储数据,产品有memcache、redis、mongoDB

二、memcache

1、特点:

① 内存存储:memcache 的存储方式是将数据存储在内存中。它不会将数据持久化到磁盘,因此在服务重启或重启之后,数据将丢失。因此,memcache 主要用于临时性数据缓存,而非持久化数据存储。

② 键值对存储:memcache 将数据存储为键值对。每个键都是唯一的,并且与一个值相关联。键是用于检索和存储数据的标识符,值则是实际的数据内容。

2、服务框架:

① 检查用户请求的数据是缓存中是否有存在,如果存在,只需要直接把请求的数据返回,无需查询数据库。

② 如果请求的数据在缓存中找不到,再去查询数据库。返回请求数据的同时,把数据存储到缓存中一份。

③ 当数据发生变化的时候,同步的更新缓存信息,确保用户不会在缓存取到旧的数据。

3、配置:

(1) 安装并修改配置文件:

yum install -y memcached

vim /etc/sysconfig/memcached

PORT="11211"

USER="memcached"

MAXCONN="1024"

CACHESIZE="1500"

OPTIONS=""

PORT:这个参数指定了 Memcached 服务监听的端口号;

USER:这个参数指定了运行 Memcached 服务的用户;

MAXCONN:这个参数定义了 Memcached 服务能够支持的最大并发连接数;

CACHESIZE:这个值决定了 Memcached 可以使用的内存量(单位:MB)

(2) 启动并测试

① systemctl start memcached.service

② yum install -y telnet

③ set name 0 900 5

设置名称为 name 的 key,0 是key的 id ;900 是缓存过期时间(s),若设为0则表示永不过期 ;5 表示字符串的最大长度。

aaaaa 是 name 的值 ;STORED 表示存储成功

get name 可以查询 key 为 name 的值。

三、redis

1、简介:

redis 是一个开源的、使用C语言编写的、基于键值对的内存数据库。

(1) 特点:

① 丰富的数据结构:Redis 支持多种数据结构,如字符串、哈希表、列表、集合等;

② 支持持久化:Redis 提供了多种持久化方式,可以将内存中的数据定期写入磁盘,确保数据在重启或断电情况下不丢失;

③ 支持事务:Redis 支持事务,可以批量执行多个命令,并确保这些命令要么全部执行成功,要么全部失败。

④ 支持主从。

(2) redis相比memcached有哪些优势:

① memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型;

② redis可以持久化其数据。

2、redis 配置:

(1) 安装:

redis 官网:Download | Redis

tar zxvf redis-7.0.14.tar.gz

● Redis是基于c语言编写的需要安装依赖,需要安装gcc:yum install -y gcc-c++

● 编译:

cd redis-7.0.14/

make

(2) 配置开机启动:

mkdir /etc/redis

cp redis-7.0.14/redis.conf /etc/redis/6379.conf

cp redis-7.0.14/utils/redis_init_script /etc/init.d/redis

● 修改redis启动脚本:

vim /etc/init.d/redis

修改EXEC与CLIEXEC的路径:

授权:chmod +x /etc/init.d/redis

重载配置:systemctl daemon-reload

启动 redis:

3、redis 持久化:

(1) 概念:

redis 持久化是指将 redis 中的数据保存到磁盘上以防止数据丢失的过程,开启持久化功能后,重启redis,数据会自动通过持久化文件恢复。

持久化方式有:RDB、AOF

(2) RDB (Redis DataBase):

① 概念:

在指定的时间间隔内生成数据的快照,并将快照保存到一个以.rdb为后缀的文件中,存储到磁盘上。

② 特点:

● 周期性

● 不影响数据写入:RDB会启动子进程,备份所有数据。 当前进程,继续提供数据的读写。 当备份完成,才替换老的备份文件

● 高效:一次性还原所有数据

● 完整性较差:故障点到上一次备份之间的数据无法恢复

③ 配置:

RDB 默认开启

vim redis-7.0.14/redis.conf

● dbfilename dump.rdb:持久化数据存储在本地的文件

● dir ./ :持久化数据文件储存在本地的路径

● 触发持久化操作的条件:

save 900 1 :900秒(15分钟)内至少发生1次写操作,就触发一次 RDB 持久化

save 300 10 :300秒(5分钟)内至少发生10次写操作,就触发一次 RDB 持久化

save 60 10000 :60秒内至少发生10000次写操作,就触发一次 RDB 持久化

● stop-writes-on-bgsave-error yes:在执行后台保存(bgsave)操作(即RDB持久化)出现错误,redis 会停止写入数据

● rdbcompression yes:在执行 RDB 持久化时对快照文件进行压缩处理,以减小磁盘上的存储空间。

④ 客户端使用命令进行持久化save存储:

前台进行存储:./redis-cli -h ip -p port save

后台进行存储:./redis-cli -h ip -p port bgsave

(3) AOF (Append Only File):

① 概念:

以追加日志的方式记录 redis 服务器接收到的每个写操作,在下次 redis 重新启动时,只要把这些写指令从前到后再重复执行一遍,就可以实现数据恢复。

② 特点:

实时性:写操作会立即追加到AOF文件中

完整性较好

体积大:记录数据的指令,删除数据的指令都会被记录下来

③ 配置:

AOF 默认关闭

vim redis-7.0.14/redis.conf

● appendonly yes:启动 AOF 功能;

● appendfsync everysec:指定 AOF 文件同步策略

everysec:表示每秒同步一次 ;always:每次写入时都同步 ;no:从不同步

● no-appendfsync-on-rewrite no:在执行 AOF 重写期间,会继续执行 AOF 日志文件的同步操作,即在重写期间仍然同步写入新的操作到 AOF 文件中。

AOF 重写是为了解决 AOF 文件可能变得过大的问题,通过重写 AOF 文件,可以消除文件中的冗余命令,从而缩小文件的体积。

● 重写触发条件:

auto-aof-rewrite-percentage:这个参数定义了执行 AOF 重写的触发条件,以百分比表示。设置为100表示只有当前 AOF 文件的大小达到了上一次重写后文件大小的 100% 时,才会触发 AOF 重写。

auto-aof-rewrite-min-size:这个参数定义了 AOF 重写的最小文件大小。设置为 64MB 表示 即使达到了上一次重写后文件大小的指定百分比,但当前 AOF 文件大小未超过 64MB ,Redis 不会执行 AOF 重写。

4、redis 主从:

(1) 简介:

redis 配置主从结构,一是为了冗余备份,二是为了提升读性能。主从架构中,可以关闭主服务器的数据持久化功能,只让从服务器进行持久化,这样可以提高主服务器的处理性能。 同时从服务器通常被设置为只读模式,这样可以避免从服务器的数据被误修改。

(2) redis 主从同步原理:

① 全量同步(Initial Sync):

● 当从节点连接到主节点时,它会发送同步命令(SYNC)来请求与主节点进行同步。

● 主节点接收到同步命令后,开始创建一个快照(snapshot),在创建快照期间,主节点继续处理写命令,但会将这些写命令缓存起来。

● 主节点生成快照的同时,将快照文件发送给从节点。

● 从节点接收到快照文件后,会加载这个快照文件并应用其中的数据,将自身数据初始化为主节点当前的状态。一旦快照加载完成,主从节点之间的初始全量同步就完成了。

② 增量同步(Incremental Sync):

● 在初始同步后,主节点会继续处理客户端的写命令,主节点将这些写命令发送给所有连接的从节点。

● 从节点接收到主节点发送的写命令,然后在本地执行这些命令,使得从节点的数据与主节点保持同步。

● 从节点会记录每个命令的复制偏移量(replication offset),用于在中断后进行重新同步时确定接收的命令位置。

(3) 配置:

① 环境:

master:192.168.198.132

slave:192.168.198.133

② 主服务器配置:

vim /etc/redis/6379.conf

bind 0.0.0.0 :redis 服务器监听本机所有地址

protected-mode no :关闭保护模式

systemctl restart redis.service

③ 从服务器配置:

vim /etc/redis/6379.conf

replicaof <masterip> <masterport>

bind 0.0.0.0

protected-mode no

systemctl restart redis.service

④ 测试:

132:

133:

(4) redis常见性能问题和解决方案:

① Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件;

② 如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次;

③ 为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内;

④ 主从复制用单向链表结构更为稳定,即:Master(写) ← Slave1(读) ← Slave2(读) ← Slave3(读) ... 这样的结构方便解决单点故障问题,如果Master挂了,可以立刻启用Slave1做Master,其他不变。

5、redis-sentinel(哨兵模式):

(1) 概念:

redis sentinel是 redis 分布式系统中用于实现高可用性的组件。它能够监控和管理Redis实例,确保Redis系统在出现故障或不可用情况时能够自动进行故障转移,保持系统的连续性和可用性。

(2) 作用:

① Master状态检测;

② 如果Master异常,则会进行Master-Slave切换,将其中一个Slave作为Master,将之前的Master作为Slave。

(3) 工作原理:

① 每秒发送PING命令:每个redis sentinel进程都会以每秒一次的频率向它所知道的主节点、从节点以及其他sentinel实例发送PING命令,验证节点的可达性和健康状态;

② 主观下线:当一个实例(如主节点或从节点)距离最后一次有效回复PING命令的时间超过了在配置中设置的 down-after-milliseconds 的值时,这个实例会被Sentinel标记为“主观下线”,即Sentinel认为这个实例可能出现了故障;

③ 确认主观下线状态:当一个Master节点被标记为主观下线时,所有监视这个Master的Sentinel都会以每秒一次的频率确认这个Master节点是否确实处于主观下线状态;

④ 客观下线:当有足够数量的Sentinel确认Master节点已经进入了主观下线状态时,Master会被标记为“客观下线”。这表示多数Sentinel节点都认为Master节点已经出现了故障,需要进行故障转移操作。

(4) 配置:

① 在主、从上修改 sentinel 配置文件:

vim redis-7.0.14/sentinel.conf

● sentinel monitor mymaster 192.168.198.132 6379 2

指定sentinel实例监控的节点名、ip和端口,2 表示至少需要2个Sentinel节点达成一致认为主节点失效,才会触发故障转移。

● sentinel down-after-milliseconds mymaster 3000

如果sentinel在3000ms后没有收到与主节点的PING响应,就会将该节点标记为主观下线。

● sentinel failover-timeout mymaster 10000

sentinel在10秒的时间内尝试完成整个故障转移操作

● protected-mode no

② 主、从服务器启动 sentinel 服务:

③ 停止主服务器,观察从服务器:

132:systemctl stop redis

133:

主从状态发生变化:

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

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

相关文章

Windows 下提取EXE文件中的图标

可以使用两种工具&#xff1a; 1 使用 IconViewer 下载地址: https://www.botproductions.com/iconview/download.html 2 使用 QuickAny2Ico 下载地址&#xff1a; Quick Any2Ico - Create icons from any source 2.1 操作步骤 样例(采用 python-3.7.9.exe 作为例子提取为…

MyBatis 操作数据库(构造动态 SQL)

前言 动态 SQL 是 Mybatis 的强⼤特性之⼀&#xff0c;能够完成不同条件下不同的 sql 拼接。 <if> 标签 我们在填写用户信息的时候经常会看到如下的界面&#xff0c;用户信息中包含必填信息和非必填信息&#xff0c;非必填信息是填和不填都可以的&#xff0c;那这样的话…

UDS 14229-1定义的请求的响应行为

UDS服务响应规则 重要提示服务器一般响应行为包含子功能的请求响应行为物理寻址请求功能寻址请求 没有子功能参数的服务响应行为物理寻址客户端请求功能寻址客户端请求 伪代码示例 重要提示 服务应当支持物理寻址方式请求&#xff0c;部分服务也支持功能寻址方式请求。在功能寻…

Linux tc 使用

tc模拟延时丢包等网络故障依赖的内核驱动 /lib/modules/5.15.0-52-generic/kernel/net/sched/sch_netem.ko有些系统并不是默认就安装上该驱动的&#xff0c;如果没有安装该驱动&#xff0c;构造网络故障时会报错。 root:curtis# tc qdisc change dev enp4s0 root netem delay…

LoRA低秩微调技术详解

在当今快节奏的技术环境中&#xff0c;大型AI模型正在推动不同领域的突破。 然而&#xff0c;根据特定任务或数据集定制这些模型可能是一项计算和资源密集型工作。 LoRA是一种突破性且高效的微调技术&#xff0c;它利用这些高级模型的强大功能来执行自定义任务和数据集&#xf…

Word 2016 删除标注

步骤&#xff1a; 菜单栏--审阅--删除--删除文档中的所有标注

07.webpack的性能优化 -- 产出代码

目标&#xff1a; 体积更小合理分包&#xff0c;不重复加载速度更快&#xff0c;使用内存更小 实现功能 小图片的base64编码提取公共代码bundle加hashIngorePlugin懒加载使用CDN使用productionScope Hosting 1. 使用production module.exports smart(webpackCommonConf, …

Python武器库开发-flask篇之session与cookie(二十六)

flask篇之session与cookie(二十六) 在 Flask 中&#xff0c;可以使用 session 来在不同请求之间存储和传递数据。Session 在客户端和服务器端之间交换&#xff0c;但是数据存储在服务器端。 Session 与 Cookie 的区别 session 和 cookie 都可以用来在不同请求之间存储和传递…

Vue3-readonly(深只读) 与 shallowReadonly(浅只读)

Vue3-readonly(深只读) 与 shallowReadonly&#xff08;浅只读&#xff09; readonly(深只读)&#xff1a;具有响应式对象中所有的属性&#xff0c;其所有值都是只读且不可修改的。shallowReadonly(浅只读)&#xff1a;具有响应式对象的第一层属性值是只读且不可修改的&#x…

解决Kibana初始化失败报错: Unable to connect to Elasticsearch

现象&#xff1a; 原因&#xff1a; docker run生成容器的时候&#xff0c;指定elastic server时指向了localhost 为什么不能是localhost, 因为这个localhost指向的是容器本身的网络&#xff0c;而elastic用的是物理网络&#xff0c;两个网络是隔离的&#xff0c;所以如果kiba…

Rocket如何实现顺序消费

RocketMQ 支持两种消息模式 集群消费&#xff08; Clustering &#xff09;和广播消费&#xff08; Broadcasting &#xff09;。 集群消费&#xff1a;同一 Topic 下的一条消息只会被同一消费组中的一个消费者消费。也就是说&#xff0c;消息被负载均衡到了同一个消费组的多…

Java集合大总结——Collection接口

集合概述 Java 集合可分为 Collection 和 Map 两大体系&#xff1a; Collection接口&#xff1a;用于存储一个一个的数据。 List子接口&#xff1a;用来存储有序的、可以重复的数据&#xff08;主要用来替换数组&#xff0c;也被称作"动态"数组&#xff09; 实现类…

LangChain 代理 Agent(学习笔记)

原文&#xff1a;LangChain 代理 Agent(学习笔记) - 尘叶心繁的专栏 - TNBLOG LangChain 代理 Agent(学习笔记) LangChain 代理 Agent(学习笔记) 简介Agent Zero-shot ReActStructured Input ReActOpenAI FunctionsConversationalSelf ask with searchReAct document storePlan…

斯坦福机器学习 Lecture1 (机器学习,监督学习、回归问题、分类问题定义)

https://www.bilibili.com/video/BV1JE411w7Ub?p1&vd_source7a1a0bc74158c6993c7355c5490fc600 笔记如下 机器学习的定义&#xff1a;不需要明确编程就能让计算机去学习做某件事情 另一个定义 什么是监督学习&#xff1f; 给定一组 (x,y) 样本&#xff0c;学习一个 x-&g…

十三、Linux文件目录指令

pwd 指令 基本语法&#xff1a;pwd &#xff08;功能描述&#xff1a;显示当前工作目录的绝对路径&#xff09; 应用实例&#xff1a;案例&#xff1a;显示当前工作目录的绝对路径 ls 指令 基本语法&#xff1a;ls 【选项】【目录或是文件】 常用选项 -a &#xff1a;显示当…

【STL】string类 (上) <vector>和<list>的简单使用

目录 一&#xff0c;什么是 STL 二&#xff0c;STL 的六大组件 三&#xff0c;标准库中的 string 类 1&#xff0c;string 类 2&#xff0c;string 类的常用接口 1&#xff0c;string类对象的常见构造 2&#xff0c;string&#xff08;const string& str&#xff…

PHP常用的数组函数

PHP是一种流行的服务器端脚本语言&#xff0c;广泛用于Web开发。数组是PHP中最重要且最常用的数据类型之一&#xff0c;它提供了许多强大的数组函数&#xff0c;用于在数组上执行各种操作。在本文中&#xff0c;我们将深入解析PHP中一些常用的数组函数&#xff0c;以便更好地理…

【考研数学神作】你不能错过的学习教材

【文末送书】今天推荐一些考研数学优质书籍&#xff0c;带你筑牢知识体系 目录 导语优美的数学思维&#xff1a;问题求解与证明数学分析线性代数线性代数及其应用代数初等数论及其应用数论概论概率论基础教程概率论与统计推断统计学基础&#xff1a;透过数据看世界数理统计及其…

前端为什么要工程化

前端为什么要工程化 文章目录 前端为什么要工程化传统开发的弊端一个常见的案例更多问题 工程化带来的优势开发层面的优势团队协作的优势统一的项目结构统一的代码风格可复用的模块和组件代码健壮性有保障团队开发效率高 求职竞争上的优势 现在前端的工作与以前的前端开发已经完…

【Seata源码学习 】篇三 seata客户端全局事务开启、提交与回滚

1.GlobalTransactionalInterceptor 对事务方法对增强 我们已经知道 GlobalTransactionScanner 会给bean的类或方法上面标注有GlobalTransactional 注解 和 GlobalLock的 添加一个 advisor &#xff08;DefaultPointcutAdvisor ,advisor 绑定了PointCut 的 advise) 而此处的 …