Redis 多级缓存

亿级流量的缓存方案

传统缓存的问题

传统的缓存策略一般是请求到达 Tomcat 后,先查询 Redis ,如果未命中则查询数据库,存在以下问题:

在整个这个流程当中,请求始终是由 tomcat 发起的,但是我们知道,tomcat 的并发能力是远远不如 redis 的,所以 Tomcat 就成为了整个流程的一个性能瓶颈,第二就是 redis 的缓存是有过期的可能性的,所以当 Redis 的缓存失效时,tomcat 的请求就会直接抵达数据库这样会对数据库产生巨大的冲击。

多级缓存方案

多级缓存就是充分利用请求处理的每一个环节,分别添加缓存,减轻 Tomcat 的压力,提升服务的性能

例如这幅图:第一级缓存就会由浏览器去实现将一些静态资源缓存在本地,nginx 就是我们的二级缓存,我们的 nginx 就可以将一些动态的数据的请求缓存在本地,当下次请求到来时我们的 nginx 就可以现在本地找一找有没有资源,redis 这个时候就是我们的三级缓存,就是当我们的 nginx 本地也没有资源的情况下,nginx 就会去查询 redis 如果 redis 有也会直接返回,请求就不会抵达 tomcat,如果未命中我们才会抵达 tomcat ,这个时候 tomcat 就是我们的第四级缓存,逻辑与上述一致

综上所述,这个时候压力最大的其实就是我们的 nginx 服务器,那么此时此刻我们的 nginx 就不再是一个简单的反向代理了,而是一个正儿八经的 web 服务器,那么这个时候我们最好是给 nginx 做一个集群,然后准备一个单独的 nginx 来做反向代理

JVM 进程缓存

主要是在 Tomcat 中添加进程缓存

初识 Caffeine

Caffeine 是一个基于 java8 开发的,提供了近乎最佳命中率的高性能的本地缓存库。目前 Spring 内部的缓存的使用的就是 Caffeine。Github 地址:GitHub - ben-manes/caffeine: A high performance caching library for Java

Caffeine 提供了三种缓存驱逐策略

  • 基于容量:设置缓存的数据上限

  • 基于时间:设置缓存的有效时间

  • 基于引用:设置缓存为软引用或者弱鸡引用,利用 GC 来回收缓存数据。性能较差,不建议使用

在默认情况下,当一个缓存元素过期的时候,Caffeine 不会自动立即将其清理个驱逐。而是在一次读或者写操作之后,或者在空闲时间完成对失效数据的驱逐

本地进程缓存

缓存在日常开发中起到至关重要的作用,由于是存储在内存中,数据的读取速度非常快,能大量减少对数据库的访问量,减少数据库的压力,我们把缓存分为两类

  • 分布式缓存,例如 Redis

    • 优点:存储容量更大,可靠性更好,可以在集群中共享

    • 缺点:访问缓存有网络开销

    • 场景:缓存数据量大,可靠性要求较高,需要在集群之间共享

  • 进程本地缓存,例如 HashMap, GuavaCache

    • 优点:读取本地内存,没有网络开销,速度更快

    • 缺点:存储容量有限,可靠性低,无法共享

    • 场景:性能要求较高,缓存数据量小

lua 语法入门

Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放,其开发的目的就是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制的功能,因此 Lua 经常被使用在游戏开发当中,我们的 nginx 也是基于 C语言开发的,它里面也有一些可以自定义的组件,因此我们可以在 nginx 中嵌入 lua 这门语言实现定制功能,第一次学习 Lua 还是需要安装的,不过在我们的 Centos 系统里面是自带 Lua 这门语言的,此脚本语言以 .lua 后缀结尾。官网:The Programming Language Lua

-- 创建一个 lua 简单的实例
vim test.lua
print("Hello World!!!")
-- 运行 lua test.lua

变量和循环

数据类型描述
nil这个最简单,只有值 nil 属于该类,表示一个无效值
booleantrue false
number表示双精度浮点型
string字符串,双引号和单引号都行
function函数类型
tableLua 中的表,其实就是一个关联数组,数组的索引可以是数字,字符串或者其他类型,在 lua 中 table 的创建是通过“构造表达式”来完成的,最简单的表达方式就是 {},用来创建一个空的表

我们可以通过内置的 type 函数来判断数据的类型

print(type("Hello World!!!"))

直接在命令行使用 lua 命令还可以在线编辑,声明变量可以使用 local 不需要指定数据类型

-- 声明字符串
local str = 'hello'
-- 声明数字
local num = 21
-- 声明布尔值
local flag = true
-- 声明数组
local arr = {'a','b','c'}
-- 声明 table
local map = {name='a',age=21}-- 访问数组,lua 数组的角标从 1 开始
print(arr[1])
-- 访问 table
print(map.name) / print(map['name'])-- 遍历
for index,value in ipairs(arr) doprint(index,value)
end

条件控制,函数

-- 函数的定义
function xxxx ()return
end-- 条件判断
if ( not xxx [and/or] xxx )
then
else
end
初识 OpenRestry

OpenRestry 是一个基于 Ngix 的高性能 web 平台,用于方便地搭建能够处理超高并发,扩展性极高的动态 web 应用,web 服务和动态网关,其具备以下几个特点

具备 nginx 的完整功能

基于 Lua 语言进行扩展,集成了大量精良的 Lua 库,第三方模块

允许使用 Lua 自定义业务逻辑,自定义库

官方网站:https://openrestry.org/cn/

数据缓存同步策略

缓存同步策略有以下三种常见的方式

  • 设置有效期

    • 优势:简单,方便

    • 缺点:时效性差,缓存过期之前可能不一致

    • 场景:更新频率低,时效要求低的情况

  • 同步双写

    • 优势:时效性强,缓存与数据库强一致

    • 缺点:有代码入侵,耦合性高;

    • 场景:对一致性,时效性要求较高的缓存数据

  • 异步通知

    • 优势:低耦合,可以同时通知多个缓存服务

    • 缺点:时效性一般,可能存在中间不一致状态

    • 场景:时效性要求一般,有多个服务需要同步

初识 Canal

译为水道,管道等,是阿里巴巴旗下的一款开源项目,基于 JAVA 发开的。基于数据库增量日志解析,提供增量数据的订阅以及消费,GitHub地址 GitHub - alibaba/canal: 阿里巴巴 MySQL binlog 增量订阅&消费组件

它基于 mysql 的主从同步来实现的:

  • mysql master 将数据变更写入到二进制文件(binary log), 其中记录的数据叫 binary log events

  • mysql slave 将 master 的 binary log events 拷贝到它的中继日志 (relay log)

  • mysql slave 重放 relay log 中事件,将数据变更反映它自己的数据

Canal 就是把自己伪装成 mysql 的一个 slave 节点,从而监听 master 的 binary log 变化。再把得到的变化信息通知给 Canal 的客户端,进而完成对其他数据库的同步

搭建 Canal

# 开启 mysql 的 binlog 日志
vim /mysql/conf/my.cnf
# 添加内容
log-bin=/var/lib/mysql/mysql-bin  # 设置 binary log 文件的存放地址和文件名,叫做 mysql-bin
binlog-do-db=heima #  指定对那个库进行监控
# 然后重启 mysql
# 此时此刻我们还需要为从库设置权限
create user canal@'%' identified by '123456';
grant select , replication slave ,replication client ,super on *.* to 'canal'@'%' identified by 'canal';
flush privileges;
# 再次重启 mysql
# 查看主从状态
show master status;
# 我们需要创建一个网络,使得 mysql canal mq 都在同一个网络当中
docker network create heima
# 让 mysql 也加入这个网络
docker network connect heima mysql
# 接下来就是安装 canal 我们可以自行去网上下载 tar 包或者直接通过 wget 下载
# 这里假设我们已经下载到了 canal 的包
docker run -p 11111:11111 --name canal \
-e canal.destinations=heima \
-e canal.instance.master.address=mysql:3306 \
-e canal.instance.dbUsername=canal \
-e canal.instance.dbPassword=123456 \
-e canal.instance.connectionCharset=UTF-8 \
-e canal.instance.tsdb.enable=true \
-e canal.instance.gtidon=false \
-e canal.instance.filter.regex=heima\\..*\
--network heima \
-d canal/canal-server:v1.1.5
# 或者编写一个 docker-compose。yml 文件
version: '3.8'
services:canal:image: canal/canal-server:v1.1.5container_name: canalports:- "11111:11111"environment:canal.destinations: heimacanal.instance.master.address: mysql:3306canal.instance.dbUsername: canalcanal.instance.dbPassword: 123456canal.instance.connectionCharset: UTF-8canal.instance.tsdb.enable: "true"canal.instance.gtidon: "false"canal.instance.filter.regex: heima\\..*networks:- heimanetworks:heima:external: true

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

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

相关文章

哈希表与离散化

一、字符串哈希 1. 什么是哈希 哈希算法是:通过哈希函数将字符串、较大的数等转换为能够用变量表示的或者是直接作为数组下标的数,通过哈希算法转换到的值,称之为哈希值。哈希值可以实现快速查找和匹配。 比如:用数组下标计数法&…

一步到位:如何在卡内基梅隆大学计算机科学学院官网下载并安装ACME软件

想要在卡内基梅隆大学计算机科学学院官网下载ACME软件?下面是详细的操作步骤! 1. 访问官网 首先,打开卡内基梅隆大学计算机科学学院的官方网站。 2. 搜索ACME软件 在官网首页的搜索框中输入“acme”,然后按下回车键。 3. 找到下载…

GPIO之EMIO按键控制LED——ZYNQ学习笔记3

一、EMIO简介 ZYNQ GPIO 接口信号被分成四组,分别是从 BANK0 到 BANK3。其中 BANK0 和 BANK1 中共计 54个信号通过 MIO 连接到 ZYNQ 器件的引脚上,这些引脚属于 PS 端; 而 BANK2 和 BANK3 中共计 64 个信号则通过 EMIO 连接到了 ZYNQ 器件的 …

云栖实录 | 阿里云 OpenLake 解决方案重磅发布:多模态数据统一纳管、引擎平权联合计算、数据共享统一读写

新一轮人工智能浪潮正在重塑世界,以生成式 AI 为代表的技术快速应用,推动了数据与智能的深化融合,同时也给数据基础设施带来了全新的变革与挑战。面向 AI 时代的数据基础设施如何构建?底层数据平台架构在 AI 时代如何演进&#xf…

[linux 驱动]regmap子系统详解与实战

目录 1 描述 2 结构体 2.1 regmap 2.2 regmap_bus 2.3 regmap_config 3 regmap 操作函数 3.1 regmap 申请与初始化 3.1.1 regmap_init_i2c 3.1.2 regmap_init_spi 3.1.3 regmap_exit 3.2 regmap 设备访问 API 函数 3.2.1 regmap_read 3.2.2 regmap_write 4 示例 1…

react组件入门

react应用程序就是由一个个组件搭建而成。组件有类组件和函数组件两种。 我们之前使用create-react-app创建了app,src下放的就是我们应用的源代码,我们基于这些已生成的文件,来学习和验证组件。 类组件 这里我们创建PostList.js更改这个ap…

Java基础——字节流和字符流

字节流和字符流的用法几乎完全一样,区别在于字节流和字符流所操作的数据单元不同,字节流操作的单元是数据单元是8位的字节,字符流操作的是数据单元为16位的字符。 为什么要有字符流? Java中字符是采用Unicode标准,Un…

论文笔记(四十六)RobotGPT: Robot Manipulation Learning From ChatGPT

xx RobotGPT: Robot Manipulation Learning From ChatGPT 文章概括摘要I. 介绍II. 相关工作III. 方法论A. ChatGPT 提示机器人操作B. 机器人学习 IV. 实验A. 衡量标准B. 实验设置C. 模拟实验D. 真实机器人实验E. AB测试 V. 结论 文章概括 引用: article{jin2024r…

关于养育孩子的一点想法

我们许多人总是很看重结果,不重视过程,在工作中有时候确实会这样,但这种想法会经常蔓延到生活中,比如养育孩子,我们总有一个目标,希望他成才,实现某种理想,弥补你人生中的某种缺憾&a…

第18届全国热管会议举办,积鼎科技分享「环路热管相变传热仿真」前沿实践

第18届全国热管会议于9月20日至22日在海滨城市日照举行,该会议由中国工程热物理学会热管专业组主办,山东大学和日照市科学技术协会联合承办,汇聚了全国热管技术领域的专家学者及企业代表。在该会议上,积鼎科技在热管仿真方面的成果…

使用Nginx反向代理为OneAPI配置https访问

OneAPI在实现大模型访问的过程中提供了接近商业化的API生成服务,在商业化运用过程中,使用https加密访问可以提高访问的安全性。那么如何为OneAPI设置https访问呢?接下来,我们就使用Nginx的反向代理实现这一目标。 Nginx是一款高性…

C++ | Leetcode C++题解之第435题无重叠区间

题目&#xff1a; 题解&#xff1a; class Solution { public:int eraseOverlapIntervals(vector<vector<int>>& intervals) {if (intervals.empty()) {return 0;}sort(intervals.begin(), intervals.end(), [](const auto& u, const auto& v) {retur…

应用层 II(文件传输协议FTP)【★★】

&#xff08;★★&#xff09;代表非常重要的知识点&#xff0c;&#xff08;★&#xff09;代表重要的知识点。 一、文件传输协议&#xff08;FTP&#xff09; 文件传送协议 FTP&#xff08;File Transfer Protocol&#xff09;是互联网上使用得最广泛的文件传送协议。FTP 提…

如何使用ssm实现基于VUE.js的在线教育系统+vue

TOC ssm683基于VUE.js的在线教育系统vue 研究背景和来源 目前的网站平台类系统已各种各样&#xff0c;涉及到生活中的每一个部分。购物类、管理类、信息统计类、办公类、官网类等非常丰富。我国各类网站的发展已非常成熟&#xff0c;这些系统依靠网络和计算机技术不断完善发…

Servlet入门:服务端小程序的初试(自己学习整理的资料)

目录 一.前言 二.建立基础结构​编辑 三.具体步骤 找到Tomcat文件并打开Tomcat。 在webapps中创建一个自己的文件夹。 在classes中新建一个Java文件。 在lib中导入需要的jar文件包。 配置环境变量 在Java文件的目录下打开cmd并输入 javac -d . HelloServlet.java进行…

鸿蒙OpenHarmony【小型系统内核(用户态启动)】子系统开发

用户态启动 用户态根进程启动 根进程是系统第一个用户态进程&#xff0c;进程ID为1&#xff0c;它是所有用户态进程的祖先。 图1 进程树示意图 根进程的启动过程 使用链接脚本将如下init启动代码放置到系统镜像指定位置。 #define LITE_USER_SEC_ENTRY __attribute__((s…

关于Hadoop的详细步骤及方案案例

Hadoop 是一个开源的分布式计算平台&#xff0c;主要用于处理大规模数据集。以下是 Hadoop 的详细步骤及一个方案案例。 一、Hadoop 安装步骤 安装 Java Hadoop 需要 Java 运行环境&#xff0c;确保安装了 Java JDK&#xff0c;并设置好环境变量。 下载 Hadoop 从 Hadoop 官方网…

4.1章节python中顺序结构

顺序结构&#xff08;Sequential Structure&#xff09;是最基本、最简单的程序结构。 顺序结构意味着程序中的语句将按照它们在代码中出现的顺序依次执行。这是大多数编程语言中最直观和自然的执行方式。 在Python中编写顺序结构的程序时&#xff0c;你只需将语句按照你希望它…

TypeScript入门 (四)面向对象

引言 大家好&#xff0c;我是GISer Liu&#x1f601;&#xff0c;一名热爱AI技术的GIS开发者。本系列文章是我跟随DataWhale 2024年9月学习赛的TypeScript学习总结文档。本文旨在全面介绍 TypeScript 中的面向对象编程&#xff08;OOP&#xff09;思想及其高级特性&#xff0c;…

8.13霍夫变换-直线检测

基本概念 霍夫变换&#xff08;Hough Transform&#xff09;是一种用于检测图像中特定形状&#xff08;如直线、圆、椭圆等&#xff09;的技术。在OpenCV中&#xff0c;霍夫变换主要用于检测直线和圆形。这里我们将详细介绍如何使用OpenCV中的霍夫变换来检测直线。 霍夫变换&…