当前位置: 首页 > 编程日记 > 正文

微服务网关从零搭建——(七)更改存储方式为oracle

资源准备:

下载开源项目

新建oracle表:

-- ----------------------------
-- Table structure for OcelotGlobalConfiguration
-- ----------------------------CREATE TABLE OcelotGlobalConfiguration (Id NUMBER(11) NOT NULL ,GatewayName NVARCHAR2(200) NOT NULL ,RequestIdKey NVARCHAR2(100) ,BaseUrl NVARCHAR2(100) ,DownstreamScheme NVARCHAR2(50) ,ServiceDiscoveryProvider NVARCHAR2(300) ,QoSOptions NVARCHAR2(300) ,LoadBalancerOptions NVARCHAR2(300) ,HttpHandlerOptions NVARCHAR2(300) ,LastUpdateTime DATE ,AddTime DATE NOT NULL ,IsDefault NUMBER(4) NOT NULL 
)
;
COMMENT ON COLUMN OcelotGlobalConfiguration.Id IS '主键';
COMMENT ON COLUMN OcelotGlobalConfiguration.GatewayName IS '网关名称';
COMMENT ON COLUMN OcelotGlobalConfiguration.AddTime IS '添加时间';
COMMENT ON COLUMN OcelotGlobalConfiguration.IsDefault IS '是否默认';-- ----------------------------
-- Records of OcelotGlobalConfiguration
-- ----------------------------
INSERT INTO OcelotGlobalConfiguration VALUES ('1', '第一个网关', 'FirstGateway', '', '', '', '', '', '', TO_DATE('1900-01-01 00:00:00.000', 'SYYYY-MM-DD HH24:MI:SS'), TO_DATE('2018-10-22 18:06:22.337', 'SYYYY-MM-DD HH24:MI:SS'), '1');
COMMIT;-- ----------------------------
-- Table structure for OcelotReRoutes
-- ----------------------------CREATE TABLE OcelotReRoutes (Id NUMBER(11) NOT NULL ,OcelotGlobalConfigurationId NUMBER(11) NOT NULL ,UpstreamPathTemplate NVARCHAR2(150) NOT NULL ,UpstreamHttpMethod NVARCHAR2(50) NOT NULL ,UpstreamHost NVARCHAR2(100) NOT NULL ,DownstreamScheme NVARCHAR2(50) ,DownstreamPathTemplate NVARCHAR2(200) ,DownstreamHostAndPorts NVARCHAR2(500) ,AuthenticationOptions NVARCHAR2(300) ,RequestIdKey NVARCHAR2(100) ,CacheOptions NVARCHAR2(200) ,ServiceName NVARCHAR2(100) ,QoSOptions NVARCHAR2(200) ,LoadBalancerOptions NVARCHAR2(200) ,Key NVARCHAR2(100) ,DelegatingHandlers NVARCHAR2(200) ,Priority NUMBER(11) ,Timeout NUMBER(11) ,IsStatus NUMBER(11) NOT NULL ,AddTime DATE NOT NULL 
)
;
COMMENT ON COLUMN OcelotReRoutes.Id IS '主键';
COMMENT ON COLUMN OcelotReRoutes.OcelotGlobalConfigurationId IS '全局配置ID';
COMMENT ON COLUMN OcelotReRoutes.AddTime IS '添加时间';-- ----------------------------
-- Records of OcelotReRoutes
-- ----------------------------
INSERT INTO OcelotReRoutes VALUES ('1', '1', '/connect/token', '[ "POST","GET" ]', ' ', 'http', '/connect/token', '[{"Host": "localhost","Port": "5003" }]', '', '', '', '', '', '', '', '', '0', NULL, '1', TO_DATE('2018-10-22', 'SYYYY-MM-DD HH24:MI:SS'));
INSERT INTO OcelotReRoutes VALUES ('2', '1', '/connect/authorize', '[ "POST","GET" ]', ' ', 'http', '/connect/authorize', '[{"Host": "localhost","Port": "5003" }]', '', '', '', '', '', '', '', '', '0', NULL, '1', TO_DATE('2018-10-22', 'SYYYY-MM-DD HH24:MI:SS'));
INSERT INTO OcelotReRoutes VALUES ('3', '1', '/.well-known/openid-configuration', '[ "POST","GET" ]',  ' ', 'http', '/.well-known/openid-configuration', '[{"Host": "localhost","Port": "5003" }]', '', '', '', '', '', '', '', '', '0', NULL, '1', TO_DATE('2018-10-22', 'SYYYY-MM-DD HH24:MI:SS'));
INSERT INTO OcelotReRoutes VALUES ('4', '1', '/.well-known/openid-configuration/jwks', '[ "POST","GET" ]', ' ', 'http', '/.well-known/openid-configuration', '[{"Host": "localhost","Port": "5003" }]', '', '', '', '', '', '', '', '', '0', NULL, '1', TO_DATE('2018-10-22', 'SYYYY-MM-DD HH24:MI:SS'));
INSERT INTO OcelotReRoutes VALUES ('5', '1', '/connect/userinfo', '[ "POST","GET" ]', ' ', 'http', '/connect/userinfo', '[{"Host": "localhost","Port": "5003" }]', '', '', '', '', '', '', '', '', '0', NULL, '1', TO_DATE('2018-10-22', 'SYYYY-MM-DD HH24:MI:SS'));
INSERT INTO OcelotReRoutes VALUES ('6', '1', '/connect/endsession', '[ "POST","GET" ]', ' ', 'http', '/connect/endsession', '[{"Host": "localhost","Port": "5003" }]', '', '', '', '', '', '', '', '', '0', NULL, '1', TO_DATE('2018-10-22', 'SYYYY-MM-DD HH24:MI:SS'));
INSERT INTO OcelotReRoutes VALUES ('7', '1', '/connect/checksession', '[ "POST","GET" ]', ' ', 'http', '/connect/checksession', '[{"Host": "localhost","Port": "5003" }]', '', '', '', '', '', '', '', '', '0', NULL, '1', TO_DATE('2018-10-22', 'SYYYY-MM-DD HH24:MI:SS'));
INSERT INTO OcelotReRoutes VALUES ('8', '1', '/connect/revocation', '[ "POST","GET" ]', ' ', 'http', '/connect/revocation', '[{"Host": "localhost","Port": "5003" }]', '', '', '', '', '', '', '', '', '0', NULL, '1', TO_DATE('2018-10-22', 'SYYYY-MM-DD HH24:MI:SS'));
INSERT INTO OcelotReRoutes VALUES ('9', '1', '/connect/introspect', '[ "POST","GET" ]', ' ', 'http', '/connect/introspect', '[{"Host": "localhost","Port": "5003" }]', '', '', '', '', '', '', '', '', '0', NULL, '1', TO_DATE('2018-10-22', 'SYYYY-MM-DD HH24:MI:SS'));
INSERT INTO OcelotReRoutes VALUES ('10', '1', '/connect/authorize/callback', '[ "POST","GET" ]', ' ', 'http', '/connect/authorize/callback', '[{"Host": "localhost","Port": "5003" }]', '', '', '', '', '', '', '', '', '0', NULL, '1', TO_DATE('2018-10-22', 'SYYYY-MM-DD HH24:MI:SS'));
INSERT INTO OcelotReRoutes VALUES ('11', '1', '/connect/endsession/callback', '[ "POST","GET" ]', ' ', 'http', '/connect/endsession/callback', '[{"Host": "localhost","Port": "5003" }]', '', '', '', '', '', '', '', '', '0', NULL, '1', TO_DATE('2018-10-22', 'SYYYY-MM-DD HH24:MI:SS'));
INSERT INTO OcelotReRoutes VALUES ('12', '1', '/ss1/{everything}', '[ "POST","GET" ]', ' ', 'http', '/api/{everything}', ' [{"Host": "localhost","Port": "5003" },{"Host": "localhost","Port": "1002" }]', '', '', '', '', '', '', '', '', '0', NULL, '1', TO_DATE('2018-10-22', 'SYYYY-MM-DD HH24:MI:SS'));
COMMIT;-- ----------------------------
-- Primary Key structure for table OcelotGlobalConfiguration
-- ----------------------------
ALTER TABLE OcelotGlobalConfiguration ADD CONSTRAINT PK_OcelotGlobalConfiguration PRIMARY KEY (Id);-- ----------------------------
-- Primary Key structure for table OcelotReRoutes
-- ----------------------------
ALTER TABLE OcelotReRoutes ADD CONSTRAINT PK_OcelotReRoutes PRIMARY KEY (Id);
建表语句

 注: 修改UPSTREAMHOST 字段为可为空

开始集成:

1.在网关项目中添加对Ocelot.ConfigAuthLimitCache的引用

2.在网关项目的Startup.cs 中修改ConfigureServices节点  标红部分

  services.AddOcelot(Configuration).AddAuthLimitCache(opt=> {opt.DbConnectionStrings = Configuration.GetSection("Setting")["ConfigDBConnction"];}).AddConsul();

3.在配置文件中添加数据库连接 蓝色部分

 "Setting": {"Port": "5001","ConfigDBConnction": "Data Source=192.168.xxx.xxx/orcl;User ID=xxx;Password=xxx;"},

4.在Program.cs中移除对原配置文件的依赖  注释部分

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>WebHost.CreateDefaultBuilder(args).UseStartup<Startup>().UseUrls($"http://*:{StartPort}");//.ConfigureAppConfiguration((hostingContext, builder) =>//{//    builder.AddJsonFile("configuration.json", false, true);//});

5.修改Ocelot.ConfigAuthLimitCache项目的数据仓储实现

增加文件

代码:

using Dapper;
using Ocelot.Cache;
using Ocelot.ConfigAuthLimitCache.Configuration;
using Ocelot.ConfigAuthLimitCache.Extensions;
using Ocelot.ConfigAuthLimitCache.Models;
using Ocelot.Configuration.File;
using Ocelot.Configuration.Repository;
using Ocelot.Logging;
using Ocelot.Responses;
using Oracle.ManagedDataAccess.Client;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;namespace Ocelot.ConfigAuthLimitCache.Repository
{/// <summary>/// nontracey/// 2019.04-08/// 实现从oracle数据库中提取配置信息/// </summary>public class OracleFileConfigurationRepository : IFileConfigurationRepository{private readonly IOcelotCache<FileConfiguration> _cache;private readonly IOcelotLogger _logger;private readonly ConfigAuthLimitCacheOptions _option;public OracleFileConfigurationRepository(ConfigAuthLimitCacheOptions option, IOcelotCache<FileConfiguration> cache, IOcelotLoggerFactory loggerFactory){_option = option;_cache = cache;_logger = loggerFactory.CreateLogger<OracleFileConfigurationRepository>();}public Task<Response> Set(FileConfiguration fileConfiguration){_cache.AddAndDelete(_option.CachePrefix + "FileConfiguration", fileConfiguration, TimeSpan.FromSeconds(1800), "");return Task.FromResult((Response)new OkResponse());}/// <summary>/// 提取配置信息/// </summary>/// <returns></returns>public async Task<Response<FileConfiguration>> Get(){var config = _cache.Get(_option.CachePrefix + "FileConfiguration", "");if (config != null){return new OkResponse<FileConfiguration>(config);}#region 提取配置信息var file = new FileConfiguration();string glbsql = "select  * from OcelotGlobalConfiguration where IsDefault=1 and rownum=1";//提取全局配置信息using (var connection = new OracleConnection(_option.DbConnectionStrings)){var result = await connection.QueryFirstOrDefaultAsync<OcelotGlobalConfiguration>(glbsql);if (result != null){var glb = new FileGlobalConfiguration();glb.BaseUrl = result.BaseUrl;glb.DownstreamScheme = result.DownstreamScheme;glb.RequestIdKey = result.RequestIdKey;if (!String.IsNullOrEmpty(result.HttpHandlerOptions)){glb.HttpHandlerOptions = result.HttpHandlerOptions.ToObject<FileHttpHandlerOptions>();}if (!String.IsNullOrEmpty(result.LoadBalancerOptions)){glb.LoadBalancerOptions = result.LoadBalancerOptions.ToObject<FileLoadBalancerOptions>();}if (!String.IsNullOrEmpty(result.QoSOptions)){glb.QoSOptions = result.QoSOptions.ToObject<FileQoSOptions>();}if (!String.IsNullOrEmpty(result.ServiceDiscoveryProvider)){glb.ServiceDiscoveryProvider = result.ServiceDiscoveryProvider.ToObject<FileServiceDiscoveryProvider>();}file.GlobalConfiguration = glb;//提取路由信息string routesql = "select * from OcelotReRoutes where OcelotGlobalConfigurationId=:OcelotGlobalConfigurationId and IsStatus=1";var routeresult = (await connection.QueryAsync<OcelotReRoutes>(routesql, new { OcelotGlobalConfigurationId=result.Id })).AsList();if (routeresult != null && routeresult.Count > 0){var reroutelist = new List<FileReRoute>();foreach (var model in routeresult){var m = new FileReRoute();if (!String.IsNullOrEmpty(model.AuthenticationOptions)){m.AuthenticationOptions = model.AuthenticationOptions.ToObject<FileAuthenticationOptions>();}if (!String.IsNullOrEmpty(model.CacheOptions)){m.FileCacheOptions = model.CacheOptions.ToObject<FileCacheOptions>();}if (!String.IsNullOrEmpty(model.DelegatingHandlers)){m.DelegatingHandlers = model.DelegatingHandlers.ToObject<List<string>>();}if (!String.IsNullOrEmpty(model.LoadBalancerOptions)){m.LoadBalancerOptions = model.LoadBalancerOptions.ToObject<FileLoadBalancerOptions>();}if (!String.IsNullOrEmpty(model.QoSOptions)){m.QoSOptions = model.QoSOptions.ToObject<FileQoSOptions>();}if (!String.IsNullOrEmpty(model.DownstreamHostAndPorts)){m.DownstreamHostAndPorts = model.DownstreamHostAndPorts.ToObject<List<FileHostAndPort>>();}//开始赋值m.DownstreamPathTemplate = model.DownstreamPathTemplate;m.DownstreamScheme = model.DownstreamScheme;m.Key = model.Key;m.Priority = model.Priority ?? 0;m.RequestIdKey = model.RequestIdKey;m.ServiceName = model.ServiceName;m.Timeout = model.Timeout ?? 0;m.UpstreamHost = model.UpstreamHost;if (!String.IsNullOrEmpty(model.UpstreamHttpMethod)){m.UpstreamHttpMethod = model.UpstreamHttpMethod.ToObject<List<string>>();}m.UpstreamPathTemplate = model.UpstreamPathTemplate;reroutelist.Add(m);}file.ReRoutes = reroutelist;}}else{throw new Exception("未监测到配置信息");}}#endregionif (file.ReRoutes == null || file.ReRoutes.Count == 0){return new OkResponse<FileConfiguration>(null);}return new OkResponse<FileConfiguration>(file);}}
}
增加oracle仓储

注:需要添加之前的CommonHelper引用或者 单独添加Oracle.ManagedDataAccess.Core nuget包引用

至此搭建完毕 将配置文件部分的内容移动到数据库即可。

参考链接:

更改到sqlserver

https://www.cnblogs.com/yilezhu/p/9839863.html

转载于:https://www.cnblogs.com/nontracey/p/10670162.html

相关文章:

Rocksdb 的优秀代码(一) -- 工业级分桶算法实现分位数p50,p99,p9999

文章目录基本概念普通的分位数计算Rocksdb中的应用rocksdb中的分桶算法结果展示rocksdb 分桶算法实现一些总结 和 相关论文我们知道一个完整的监控系统必须存在p99/p999等分位数指标&#xff0c;作为系统可用性的评判标准之一。而像开源监控系统中做的很不错的grafana和prometh…

Java项目:前后端分离疫情防疫平台设计和实现(java+springmvc+VUE+node.js+mybatis+mysql+springboot+redis+jsp)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 主要技术&#xff1a;Java、springmvc、VUE、node.js、mybatis、mysql、tomcat、jquery、layui、bootstarp、JavaScript、html、css、jsp、log4j等一些常见的基本技术。 主要模块功能有&#xff1a; 管理员…

js里的匿名函数 数组排序

// 匿名函数&#xff1a;其实就是函数的简写形式 var method function(){ alert("123"); } method(); // 匿名函数可以用于事件的处理 function func(){ alert("456"); } window.οnlοadfunc; window.οnlοadfunction(){ alert("加载完成&#xff0…

oracle监听器动态注册于静态注册的区别

2019独角兽企业重金招聘Python工程师标准>>> 1, oracle 10g 用netca方式建立的都默认为动态注册方式 2&#xff0c;如果想改为静态注册的方式则在listener.ora 中加入如下内容即可 SID_LIST_LISTENER (SID_LIST (SID_DESC (SID_NAME PLSExtProc) (ORACLE_HOME …

什么是Singleton?

Singleton&#xff1a;在Java中即指单例设计模式&#xff0c;它是软件开发中最常用的设计模式之一。 单&#xff1a;指唯一 例&#xff1a;指实例 单例设计模式&#xff0c;即某个类在整个系统中只能有一个实例对象可被获取和使用的代码模式。 要点&#xff1a; 一、单例类只能…

磁盘I:O 性能指标 以及 如何通过 fio 对nvme ssd,optane ssd, pmem 性能摸底

文章目录1. 磁盘I/O性能指标1.1 性能指标1.2 I/O 观测1.2.1 磁盘I/O 观测1.2.2 进程I/O观测2. Fio 性能测试2.1 环境准备2.2 测试维度选择2.3 测试2.3.1 optane ssd和nvme ssd性能测试2.3.2 aep性能测试(intel persistent memory)真正测试之前 我们需要清楚 评判磁盘I/O性能 是…

Java项目:旅游网站管理系统设计和实现(java+springboot+jsp+mysql+spring)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 运行环境: java jdk 1.8 IDE环境&#xff1a; IDEA tomcat环境&#xff1a; Tomcat 7.x,8.x,9.x版本均可 主要功能说明&#xff1a; 管理员角色包含以下功能&#xff1a;管理员登录,用户管理,旅游路线管理,…

稀疏矩阵十字链表表示

类型定义 #include<stdio.h> #include<malloc.h> #include<stdlib.h> #define MAX 100 /*稀疏矩阵的十字链表表示&#xff1a;非零元素节点与表头节点公用一种类型 */ typedef struct matrixnode {int row,col;struct matrixnode *right,*down;union{int val…

thrift框架使用C++

2019独角兽企业重金招聘Python工程师标准>>> 1. 编写thrift接口文件student.thrift struct Student{1: i32 sno,2: string sname,3: bool ssex,4: i16 sage, } service Serv{i32 put(1: Student s), } 2. 用“thrift -r --gen cpp student.thrift”在gen-cpp文件夹中…

shell编程:实现shell字符串连接功能

功能&#xff1a;实现shell字符串连接功能 a0 s1test. s2.wav s3.mp3 s40 s500str"sox ./${s1}${a}${s2} ./${a}${s3}"./tts -c bcgirl.0.0.4.bin -b 1 -i input.txt -s 1.0 -speed 1.0 $str rm ./*.wav转载于:https://www.cnblogs.com/kay2018/p/10673110.html

一文运维zookeeper

文章目录1. zookeeper生产环境的安装配置1.1 软件配置1.2 硬件配置1.3 日志配置文件1.4 配置三节点的zookeeper集群2. zookeeper的监控方法2.1 four letters命令2.2 JMX 监控方式3. 通过zookeeper observer实现跨地域部署3.1 什么是observer3.2 observer 提升 写性能3.3 observ…

Java项目:电商书城平台系统设计和实现(java+springboot+mysql+spring+jsp)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; JAVA springboot 电商书城平台系统(已调试) 主要实现了书城网站的浏览、加入购物车操作、订单操作、支付操作、分类查看、搜索、以及后台上传图书信息以及订单管理和一些基本操作功能 主要功能截图如下&…

(周三赛)FATE

//题意 打怪的经验值 &#xff0c;消耗忍耐度 看升级后还能保留的最大忍耐度 用 背包去做&#xff0c;不是很会啊 T T Description 最近xhd正在玩一款叫做FATE的游戏&#xff0c;为了得到极品装备&#xff0c;xhd在不停的杀怪做任务。久而久之xhd开始对杀怪产生的厌恶感&#…

ASP.NET MVC 3中ViewBag, ViewData和 TempData

ViewBag, ViewData十分类似&#xff0c;都可用于把数据从controller传递到view。 ViewBag是WebViewPage中的一个属性&#xff0c;它的类型是dynamic。dynamic类型可以理解为&#xff0c;编译器在编译到这种类型时&#xff0c;会跳过类型检查&#xff0c;而在运行时做这些事情。…

如何在指定文件夹下进入jupyter notebook

第一步&#xff1a; 打开 Anaconda Prompt 第二步&#xff1a; 查看文件夹所在路径 例如&#xff1a;你有个jupyterwork文件夹在 D:\ 路径下 第三步&#xff1a; 在Anaconda Prompt依次输入一下命令&#xff1a; d:cd jupyterworkjupyter notebook完成。转载于:https://www.cnb…

Go 分布式学习利器(16) -- go中可复用的package构建

通过本文&#xff0c;你将了解go 语言中如何将自己的package构建到项目中 以及如何将远程&#xff08;github&#xff09;的package构建到项目中。 1. 构建本地的package package 是可复用模块的基本单元&#xff0c;以首字母大写的函数实现来表明可被包外代码访问代码的pack…

JQuery UI

//拖拽插件 draggable <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.org/1999/xhtml"><head><title>拖曳…

Java项目:房屋租赁系统设计和实现(java+ssm+mysql+spring+jsp)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 主要功能描述&#xff1a; 1.登录管理&#xff1a;主要有管理员登录和租客登录 2.房源列表以及添加房源功能&#xff1a; 3.租赁合同管理以及在租房源和已退租房源信息管理: 4.看房申请和退租申请管理&a…

学习网页制作中如何在正确选取和使用 CSS 单位

在 CSS 测量系统中&#xff0c;有好几种单位&#xff0c;如像素、百分比、英寸、厘米等等&#xff0c;Web 开发人员很难了解哪些单位在何处使用&#xff0c;如何使用。很多人习惯了总是使用同一种单位&#xff0c;但这一决定可能会严重限制你的设计的执行。 这里推荐的《Which …

SPOJ GSS3-Can you answer these queries III-分治+线段树区间合并

Can you answer these queries III SPOJ - GSS3 这道题和洛谷的小白逛公园一样的题目。 传送门&#xff1a; 洛谷 P4513 小白逛公园-区间最大子段和-分治线段树区间合并(单点更新、区间查询) 代码: 1 #include<bits/stdc.h>2 using namespace std;3 typedef long long l…

Zookeeper ZAB协议原理浅析

文章目录前言1. 基本角色和概念2. Leader Election3. Discovery4. Synchronization5. BroadCast后记前言 DTCC 要在下周一到周三要在北京举办&#xff0c;身边有不少人都去参加了&#xff0c;领略中国最为领先的一些公司的自研存储技术。 阿里自研polardb&#xff0c;polardb-…

Java项目:仓库管理系统设计和实现(java+ssm+springboot+layui)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 主要功能模块 1.用户模块管理&#xff1a;用户登录、用户注册、用户的查询、添加、删除操作、 2.客户信息管理&#xff1a;.客户列表的展示、添加、修改、删除操作、 3.供应商管理&#xff1a;供应商详情…

Java Web 中的一些问题

http://localhost:8080/struts2demo/online/userLogin.jsp 请求模式 :// 主机名名称&#xff08;或者服务器名称&#xff09; : 端口 / Servlet容器的名称&#xff08;通常为项目名称&#xff09; / 自定义的网页文件夹名或者映射中的文件包名 / 网页名称及其后缀或者响应动作…

《零成本实现Web自动化测试--基于Selenium》第一章 自动化测试基础

第一篇 Selenium 和WebDriver工具篇 第一章 自动化测试基础 1.1 初识自动化测试 自动化测试有两种常见方式 1.1.1 代码驱动测试&#xff0c;又叫测试驱动开发&#xff08;TDD&#xff09; 1.1.2 图形用户接口测试: 测试框架产生用户接口事件&#xff08;例如键盘敲击&#x…

第11章 AOF持久化

AOF持久化在硬盘上保存的是对Redis进行的逻辑操作&#xff0c;类似InnoDB中的bin log。说白了就是你对一个Redis输入了哪些语句&#xff0c;AOF文件都会原封不动的保存起来&#xff0c;等到需要回复Redis的时候再把这些语句执行一遍。 11.1 AOF持久化的实现 AOF简单的理解是把执…

Go 语言实现字符串匹配算法 -- BF(Brute Force) 和 RK(Rabin Karp)

今天介绍两种基础的字符串匹配算法&#xff0c;当然核心还是熟悉一下Go的语法&#xff0c;巩固一下基础知识 BF(Brute Force)RK(Rabin Karp) 源字符串&#xff1a;src, 目标字符串:dest&#xff1b; 确认dest是否是src 的一部分。 BF算法很简单暴力&#xff0c;维护两个下标…

Java项目:前后端分离网上手机商城平台系统设计和实现(java+vue+redis+springboot+mysql+ssm)

源码获取&#xff1a;博客首页 "资源" 里下载&#xff01; 主要模块设计如下&#xff1a; 前后端主要技术&#xff1a;Java springboot springMVC mybatis mysql vue jquery node.js redis 1) 用户注册和登录功能&#xff1a;。 2) 用户信息的管理以及角色的…

利用AutoSPSourceBuilder和Autospinstaller自动安装SharePoint Server 2013图解教程——Part 1...

这是一篇对之前 《利用AutoSPSourceBuilder和Autospinstaller自动安装SharePoint Server 2013图解教程——Part 2》的补充。本篇博客将对AutoSPSourceBuilder的使用进行说明。 AutoSPSourceBuilder介绍 下载AutoSPSourceBuilder点击进入AutoSPSourceBuilder的官网&#xff0c;找…

Git 版本还原命令

转载&#xff1a;https://blog.csdn.net/yxlshk/article/details/79944535 1.需求场景&#xff1a; 在利用github实现多人协作开发项目的过程中&#xff0c;有时会出现错误提交的情况&#xff0c;此时我们希望能撤销提交操作&#xff0c;让当前版本回到提交前的样子或者某一个版…

NVME CLI -- nvme 命令查看NVME设备内部状态

文章目录NVME 和 AHCI 性能比较NVME-CLI nvme工具使用1. 安装2. 命令综述3. 基本命令演示4. NVME 固件设备升级近期在做一些rocksdb on 新硬件的性能测试&#xff08;flash ssd, nvme ssd , nvme optane ssd, optane persistent memory&#xff09;&#xff0c;由于底层一些设备…