Storage、正则表达式

1 LocalStorage

2 SessionStorage

3 正则表达式的使用

4 正则表达式常见规则

5 正则练习-歌词解析

6 正则练习-日期格式化

Storage-Storage的基本操作

 // storage基本使用// 1.token的操作let token = localStorage.getItem("token")if (!token) {console.log("从服务器获取token")token = "coderwhytokeninfo"localStorage.setItem("token", token)}// 2.username/password的操作let username = localStorage.getItem("username")let password = localStorage.getItem("password")if (!username || !password) {console.log("让用户输入账号和密码")username = "coderwhy"password = "123456"// 将token/username/password保存到storagelocalStorage.setItem("username", username)localStorage.setItem("password", password)}// 3.后续的操作console.log(token)console.log(token.length)console.log(token + " 哈哈哈")

Storage-local和session区别

localstorage是永久保存的,seessionstorage是暂时存储的,也就是说只要这次浏览器页面没关闭,就一直存在,sessionstorage的作用是用在一次会话,有a链接跳转其他页面时进行数据传递用的,比起localstorage使用起来会更舒服。

但是如果a链接使用的target是self,那sessionstorage是查找不到的

<body><a href="./static/about.html" target="_blank">关于</a><script>// 1.验证一: 关闭网页// 1.1.localStorage的存储保持// localStorage.setItem("name", "localStorage")// 1.2.sessionStorage的存储会消失// sessionStorage.setItem("name", "sessionStorage")// 2.验证二: 打开新的网页// localStorage.setItem("info", "local")// sessionStorage.setItem("info", "session")// 3.验证三: 打开新的页面, 并且是在新的标签中打开localStorage.setItem("infoTab", "local")sessionStorage.setItem("infoTab", "session")</script></body>

Storage-Storage其他方法

开发技巧,有相同的变量名称的时候,我们可以设置一个大写字母组成的字符串常量。

 const ACCESS_TOKEN = "token"console.log(localStorage.length)// 常见的方法:localStorage.setItem(ACCESS_TOKEN, "whytoken")console.log(localStorage.getItem(ACCESS_TOKEN))// 其他方法console.log(localStorage.key(0))console.log(localStorage.key(1))console.log(localStorage.removeItem("infoTab"))localStorage.clear()

Storage-Storage工具封装

封装了storage的方法,使得使用的时候能有自己想要的处理事件。

封装文件cache.js

class Cache {constructor(isLocal = true) {this.storage = isLocal ? localStorage: sessionStorage}setCache(key, value) {if (!value) {throw new Error("value error: value必须有值!")}if (value) {this.storage.setItem(key, JSON.stringify(value))}}getCache(key) {const result = this.storage.getItem(key)if (result) {return JSON.parse(result)}}removeCache(key) {this.storage.removeItem(key)}clear() {this.storage.clear()}
}const localCache = new Cache()
const sessionCache = new Cache(false)

使用封装的代码

   localCache.setCache("sno", 111)// storage本身是不能直接存储对象类型的const userInfo = {name: "why",nickname: "coderwhy",level: 100,imgURL: "http://github.com/coderwhy.png"}// localStorage.setItem("userInfo", JSON.stringify(userInfo))// console.log(JSON.parse(localStorage.getItem("userInfo")))sessionCache.setCache("userInfo", userInfo)console.log(sessionCache.getCache("userInfo"))

RegExp-正则表达式的创建

i表示无论大小写,g表示全局的、全部的、m表示多行匹配

  // 创建正则// 1> 匹配的规则pattern// 2> 匹配的修饰符flagsconst re1 = new RegExp("abc", "ig")const re2 = /abc/ig // 我是注释

RegExp-正则表达式的演练

 // 创建正则const re1 = /abc/igconst message = "fdabc123 faBC323 dfABC222 A2324aaBc"// 1.使用正则对象上的实例方法// 2.使用字符串的方法, 传入一个正则表达式// 需求: 将所有的abc(忽略大小写)换成cba// const newMessage = message.replaceAll("abc", "cba")// console.log(newMessage)const newMessage = message.replaceAll(/abc/ig, "cba")console.log(newMessage)// 需求: 将字符串中数字全部删除const newMessage2 = message.replaceAll(/\d+/ig, "")console.log(newMessage2)

RegExp-正则表达式的使用

1

 // 创建正则const re1 = /abc/igconst message = "fdabc123 faBC323 dfABC222 A2324aaBc"// 1.使用正则对象上的实例方法// webpack -> loader -> test: 匹配文件名// 正则 -> 拿到文件 -> loader操作// 1.1.test方法: 检测某一个字符串是否符合正则的规则// if (re1.test(message)) {//   console.log("message符合规则")// } else {//   console.log("message不符合规则")// }// 1.2.exec方法: 使用正则执行一个字符串// const res1 = re1.exec(message)// console.log(res1)// 2.使用字符串的方法, 传入一个正则表达式// 2.1. match方法:// const result2 = message.match(re1)// console.log(result2)// 2.2. matchAll方法// 注意: matchAll传入的正则修饰符必须加g// const result3 = message.matchAll(re1)// // console.log(result3.next())// // console.log(result3.next())// // console.log(result3.next())// // console.log(result3.next())// for (const item of result3) {//   console.log(item)// }// 2.3. replace/replaceAll方法// 2.4. split方法// const result4 = message.split(re1)// console.log(result4)// 2.5. search方法const result5 = message.search(re1)console.log(result5)// 案例: 让用户输入的账号必须是aaaaa以上// const inputEl = document.querySelector("input")// const tipEl = document.querySelector(".tip")// inputEl.oninput = function() {//   const value = this.value//   if (/^a{5,8}$/.test(value)) {//     tipEl.textContent = "输入的内容符合规则要求"//   } else {//     tipEl.textContent =  "输入的内容不符合规则要求, 请重新输入"//   }// }

RegExp-正则规则-字符类

  // 创建正则const re1 = /abc/igconst message = "fdabc123 faBC323 dfABC222 A2324aaBc"// 1.使用正则对象上的实例方法// webpack -> loader -> test: 匹配文件名// 正则 -> 拿到文件 -> loader操作// 1.1.test方法: 检测某一个字符串是否符合正则的规则// if (re1.test(message)) {//   console.log("message符合规则")// } else {//   console.log("message不符合规则")// }// 1.2.exec方法: 使用正则执行一个字符串// const res1 = re1.exec(message)// console.log(res1)// 2.使用字符串的方法, 传入一个正则表达式// 2.1. match方法:// const result2 = message.match(re1)// console.log(result2)// 2.2. matchAll方法// 注意: matchAll传入的正则修饰符必须加g// const result3 = message.matchAll(re1)// // console.log(result3.next())// // console.log(result3.next())// // console.log(result3.next())// // console.log(result3.next())// for (const item of result3) {//   console.log(item)// }// 2.3. replace/replaceAll方法// 2.4. split方法// const result4 = message.split(re1)// console.log(result4)// 2.5. search方法const result5 = message.search(re1)console.log(result5)// 案例: 让用户输入的账号必须是aaaaa以上// const inputEl = document.querySelector("input")// const tipEl = document.querySelector(".tip")// inputEl.oninput = function() {//   const value = this.value//   if (/^a{5,8}$/.test(value)) {//     tipEl.textContent = "输入的内容符合规则要求"//   } else {//     tipEl.textContent =  "输入的内容不符合规则要求, 请重新输入"//   }// }

RegExp-正则规则-锚点

 const message = "My name is WHY."// 字符串方法if (message.startsWith("my")) {console.log("以my开头")}if (message.endsWith("why")) {console.log("以why结尾")}// 正则: 锚点if (/^my/i.test(message)) {console.log("以my开头")}if (/why\.$/i.test(message)) {console.log("以why结尾")}const re = /^coder$/const info = "codaaaer"console.log(re.test(info)) // false

RegExp-正则规则-词边界

 // \wconst message = "My name! is WHY."// 需求: name, name必须是一个单独的词// 词边界if (/\bname\b/i.test(message)) {console.log("有name, name有边界")}// 词边界的应用const infos = "now time is 11:56, 12:00 eat food, number is 123:456"const timeRe = /\b\d\d:\d\d\b/igconsole.log(infos.match(timeRe))

RegExp-正则规则-转义

 // 定义正则: 对.转义const re = /\./igconst message = "abc.why"const results = message.match(re)console.log(results)// 特殊: /// const re2 = /\//// 获取到很多的文件名// jsx -> js文件const fileNames = ["abc.html", "Home.jsx", "index.html", "index.js", "util.js", "format.js"]// 获取所有的js的文件名(webpack)// x?: x是0个或者1个const jsfileRe = /\.jsx?$/// 1.for循环做法// const newFileNames = []// for (const filename of fileNames) {//   if (jsfileRe.test(filename)) {//     newFileNames.push(filename)//   }// }// console.log(newFileNames)// 2.filter高阶函数// const newFileNames = fileNames.filter(filename => jsfileRe.test(filename))// console.log(newFileNames)

RegExp-正则规则-集合

  // 手机号的规则: 1[3456789]033334444const phoneStarts = ["132", "130", "110", "120", "133", "155"]const phoneStartRe = /^1[3456789]\d/const filterPhone = phoneStarts.filter(phone => phoneStartRe.test(phone))console.log(filterPhone)const phoneNum = "133888855555"const phoneRe = /^1[3-9]\d{9}$/console.log(phoneRe.test(phoneNum))// 了解: 排除范围// \d -> [0-9]// \D -> [^0-9]

RegExp-正则规则-量词

 // 1.量词的使用const re = /a{3,5}/igconst message = "fdaaa2fdaaaaaasf42532fdaagjkljlaaaaf"const results = message.match(re)console.log(results)// 2.常见的符号: +/?/*// +: {1,}// ?: {0,1}// *: {0,}// 3.案例: 字符串的html元素, 匹配出来里面所有的标签const htmlElement = "<div><span>哈哈哈</span><h2>我是标题</h2></div>"const tagRe = /<\/?[a-z][a-z0-9]*>/igconst results2 = htmlElement.match(tagRe)console.log(results2)

RegExp-正则规则-贪婪惰性

  // 1.贪婪模式/惰性模式const message = "我最喜欢的两本书: 《黄金时代》和《沉默的大多数》、《一只特立独行的猪》"// 默认.+采用贪婪模式// const nameRe = /《.+》/ig// const result1 = message.match(nameRe)// console.log(result1)// 使用惰性模式const nameRe = /《.+?》/igconst result1 = message.match(nameRe)console.log(result1)

RegExp-正则规则-捕获组

 // 1.捕获组const message = "我最喜欢的两本书: 《黄金时代》和《沉默的大多数》、《一只特立独行的猪》"// 使用惰性模式const nameRe = /(?:《)(?<why>.+?)(?:》)/igconst iterator = message.matchAll(nameRe)for (const item of iterator) {console.log(item)}// 2.将捕获组作为整体const info = "dfabcabcfabcdfdabcabcabcljll;jk;j"const abcRe = /(abc){2,}/igconsole.log(info.match(abcRe))

RegExp-正则规则-或or

  // 1.将捕获组作为整体const info = "dfabcabcfabcdfdabcabcabcljcbacballnbanba;jk;j"const abcRe = /(abc|cba|nba){2,}/igconsole.log(info.match(abcRe))

RegExp-正则练习-歌词解析

<body><script src="./js/parse_lyric.js"></script><script>/*currentTime: 2000[00:00.000] 作词 : 许嵩 -> { time: 0, content: "作词 : 许嵩" }[00:01.000] 作曲 : 许嵩 -> { time: 1000, content: "作曲 : 许嵩" }[00:02.000] 编曲 : 许嵩[00:22.240]天空好想下雨*/const lyricString = "[00:00.000] 作词 : 许嵩\n[00:01.000] 作曲 : 许嵩\n[00:02.000] 编曲 : 许嵩\n[00:22.240]天空好想下雨\n[00:24.380]我好想住你隔壁\n[00:26.810]傻站在你家楼下\n[00:29.500]抬起头数乌云\n[00:31.160]如果场景里出现一架钢琴\n[00:33.640]我会唱歌给你听\n[00:35.900]哪怕好多盆水往下淋\n[00:41.060]夏天快要过去\n[00:43.340]请你少买冰淇淋\n[00:45.680]天凉就别穿短裙\n[00:47.830]别再那么淘气\n[00:50.060]如果有时不那么开心\n[00:52.470]我愿意将格洛米借给你\n[00:55.020]你其实明白我心意\n[00:58.290]为你唱这首歌没有什么风格\n[01:02.976]它仅仅代表着我想给你快乐\n[01:07.840]为你解冻冰河为你做一只扑火的飞蛾\n[01:12.998]没有什么事情是不值得\n[01:17.489]为你唱这首歌没有什么风格\n[01:21.998]它仅仅代表着我希望你快乐\n[01:26.688]为你辗转反侧为你放弃世界有何不可\n[01:32.328]夏末秋凉里带一点温热有换季的颜色\n[01:41.040]\n[01:57.908]天空好想下雨\n[01:59.378]我好想住你隔壁\n[02:02.296]傻站在你家楼下\n[02:03.846]抬起头数乌云\n[02:06.183]如果场景里出现一架钢琴\n[02:08.875]我会唱歌给你听\n[02:10.974]哪怕好多盆水往下淋\n[02:15.325]夏天快要过去\n[02:18.345]请你少买冰淇淋\n[02:21.484]天凉就别穿短裙\n[02:22.914]别再那么淘气\n[02:25.185]如果有时不那么开心\n[02:27.625]我愿意将格洛米借给你\n[02:30.015]你其实明白我心意\n[02:33.327]为你唱这首歌没有什么风格\n[02:37.976]它仅仅代表着我想给你快乐\n[02:42.835]为你解冻冰河为你做一只扑火的飞蛾\n[02:48.406]没有什么事情是不值得\n[02:52.416]为你唱这首歌没有什么风格\n[02:57.077]它仅仅代表着我希望你快乐\n[03:01.993]为你辗转反侧为你放弃世界有何不可\n[03:07.494]夏末秋凉里带一点温热\n[03:11.536]\n[03:20.924]为你解冻冰河为你做一只扑火的飞蛾\n[03:26.615]没有什么事情是不值得\n[03:30.525]为你唱这首歌没有什么风格\n[03:35.196]它仅仅代表着我希望你快乐\n[03:39.946]为你辗转反侧为你放弃世界有何不可\n[03:45.644]夏末秋凉里带一点温热有换季的颜色\n"// 一. 没有封装// 1.根据\n切割字符串const lyricLineStrings = lyricString.split("\n")// console.log(lyricLineStrings)// 2.针对每一行歌词进行解析// [01:22.550]夏末秋凉里带一点温热有换季的颜色const timeRe = /\[(\d{2}):(\d{2})\.(\d{2,3})\]/iconst lyricInfos = []for (const lineString of lyricLineStrings) {// 1.获取时间const result = lineString.match(timeRe)if (!result) continueconst minuteTime = result[1] * 60 * 1000const secondTime = result[2] * 1000const mSecondTime = result[3].length === 3? result[3]*1: result[3]*10const time = minuteTime + secondTime + mSecondTime// 2.获取内容const content = lineString.replace(timeRe, "").trim()// 3.将对象放到数组中lyricInfos.push({ time, content })}console.log(lyricInfos)// 二.封装工具: 解析歌词// const lyricInfos = parseLyric(lyricString)// console.log(lyricInfos)</script>

RegExp-正则练习-时间格式化

<body><h2 class="time"></h2><script>// timestamp: 1659252290626// yyyy/MM/dd hh:mm:ss// yyyy*MM*dd hh-mm-ss// dayjs/momentfunction formatTime(timestamp, fmtString) {// 1.将时间戳转成Dateconst date = new Date(timestamp)// // 2.获取到值// const year = date.getFullYear()// const month = date.getMonth() + 1// const day = date.getDate()// const hour = date.getHours()// const minute = date.getMinutes()// const second = date.getSeconds()// // 3.创建正则// const yearRe = /y+/// const monthRe = /M+/// 2.正则和值匹配起来const dateO = {"y+": date.getFullYear(),"M+": date.getMonth() + 1,"d+": date.getDate(),"h+": date.getHours(),"m+": date.getMinutes(),"s+": date.getSeconds()}// 3.for循环进行替换for (const key in dateO) {const keyRe = new RegExp(key)if (keyRe.test(fmtString)) {const value = (dateO[key] + "").padStart(2, "0")fmtString = fmtString.replace(keyRe, value)}}return fmtString}// 某一个商品上架时间, 活动的结束时间const timeEl = document.querySelector(".time")const productJSON = {name: "iPhone",newPrice: 4999,oldPrice: 5999,endTime: 1659252301637}timeEl.textContent = formatTime(productJSON.endTime, "hh:mm:ss yyyy*MM*dd")</script></body>

parse_lyric.js

function parseLyric(lyricString) {// 1.根据\n切割字符串const lyricLineStrings = lyricString.split("\n")// console.log(lyricLineStrings)// 2.针对每一行歌词进行解析// [01:22.550]夏末秋凉里带一点温热有换季的颜色const timeRe = /\[(\d{2}):(\d{2})\.(\d{2,3})\]/iconst lyricInfos = []for (const lineString of lyricLineStrings) {// 1.获取时间const result = lineString.match(timeRe)if (!result) continueconst minuteTime = result[1] * 60 * 1000const secondTime = result[2] * 1000const mSecondTime = result[3].length === 3? result[3]*1: result[3]*10const time = minuteTime + secondTime + mSecondTime// 2.获取内容const content = lineString.replace(timeRe, "").trim()// 3.将对象放到数组中lyricInfos.push({ time, content })}return lyricInfos
}

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

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

相关文章

python开发项目基于语音识别的智能垃圾分类系统的设计与实现

博主介绍&#xff1a;擅长Java、微信小程序、Python、Android等&#xff0c;专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb; 不然下次找不到哟 Java项目精品实战案例…

详解c++---特殊类设计

目录标题 设计一个不能被拷贝的类设计一个只能从堆上创建对象的类设计一个只能在栈上创建对象的类设计一个无法被继承的类什么是单例模式饿汉模式饿汉模式的缺点懒汉模式懒汉模式的优点懒汉模式的缺点特殊的懒汉 设计一个不能被拷贝的类 拷贝只会放生在两个场景中&#xff1a;…

(Linux)基础命令

帮助文档 公式功能man 命令名访问Linux手册页命令名 – helpinfo 命令名查看命令的功能&#xff0c;来源&#xff0c;选项等whatis 命令名 ls 公式功能ls [选项][目录或文件]对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。对于文件&#xff0c;将列出文件名以及…

自学网络安全究竟该从何学起?

一、为什么选择网络安全&#xff1f; 这几年随着我国《国家网络空间安全战略》《网络安全法》《网络安全等级保护2.0》等一系列政策/法规/标准的持续落地&#xff0c;网络安全行业地位、薪资随之水涨船高。 未来3-5年&#xff0c;是安全行业的黄金发展期&#xff0c;提前踏入行…

webrtc源码阅读之视频RTP接收JitterBuffer

在音视频通信中&#xff0c;网络抖动和延迟是常见的问题&#xff0c;会导致音视频质量下降和用户体验不佳。为了解决这些问题&#xff0c;WebRTC引入了Jitter Buffer&#xff08;抖动缓冲区&#xff09;这一重要组件。Jitter Buffer是一个缓冲区&#xff0c;用于接收和处理网络…

未来驾驶新标配;CarLuncher车载开发塑造智能娱乐导航系统

车载开发在新能源汽车的快速市场占有率增长背景下具有广阔的前景。随着环境保护意识的增强和政府对清洁能源的支持&#xff0c;新能源汽车&#xff08;如电动汽车&#xff09;在全球范围内呈现出快速增长的趋势。这种趋势为车载开发提供了许多机会和潜在市场。 新能源汽车的普…

基于SpringBoot+微信小程序的医院预约叫号小程序

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 该项目是基于uniappWe…

【C++初阶】构造函数和析构函数

文章目录 一、类的六个默认成员函数二、构造函数三、析构函数 一、类的六个默认成员函数 &#x1f4d6;默认成员函数 用户没有显式实现&#xff0c;编译器会自动生成的成员函数&#xff0c;称为默认成员函数。 构造函数&#xff1a;完成对象的初始化工作。析构函数&#xff…

【http-server】http-server的安装、前端使用http-server启动本地dist文件服务:

文章目录 一、http-server 简介:二、安装node.js:[https://nodejs.org/en](https://nodejs.org/en)三、安装http-server:[https://www.npmjs.com/package/http-server](https://www.npmjs.com/package/http-server)四、开启服务&#xff1a;五、http-server参数&#xff1a;【1…

Vscode配置grpc+c#+proto

首先是环境配置&#xff0c;用的dotnet5.0的sdk&#xff0c;所以Vscode的C#插件版本要选择1.24&#xff0c;然后需要配置C# Snippets、NuGget Package Manager、vscode-proto3、vscode-solution-extension&#xff08;可选&#xff09;。 以vscode-solution-extension为例新建A…

在 Linux 系统上下载 Android SDK

使用ubuntu系统进行车机开发&#xff0c;今天开始配置环境&#xff0c;首先是下载android studio&#xff0c;然后下载android sdk&#xff0c;这里需要注意的是linux系统不能使用windows系统下的Android sdk&#xff0c;亲测会出现各种问题。 常规思路&#xff0c;下载sdk&am…

Jenkins的几种安装方式以及邮件配置

目录 Jenkins介绍 Jenkins下载、安装 一、通过war包安装 二、通过docker安装 jenkins 容器中添加 git, maven 等组件 jenkins 容器中的公钥私钥 在 jenkins 容器中调用 docker 简单的方式启动 Docker server REST API 一个 jenkins 示例 三、通过Homebrew安装 访问Je…

oceanbase基础

与mysql对比 分布式一致性算法 paxos 存储结构&#xff08;引擎&#xff09;用的是两级的 数据库自动分片功能&#xff0c;提供独立的obproxy路由写入查询等操作到对应的分片 多租户 方便扩展 存储层 http://www.hzhcontrols.com/new-1391864.html LSM tree&#xff0c;is very…

【cfengDB】自己实现数据库第0节 ---整体介绍及事务管理层实现

LearnProj 内容管理 MySQL系统结构一条SQL执行流程 cfengDB整体结构事务管理TM模块TID文件规则定义文件读写 -- NIORandomAccessFile、FileChannel、ByteBuffer接口实现文件合法检测begin()commit(tid)rollback(tid)tid文件创建 本文作为数工底层的项目CfengDB开始篇章&#xf…

UART串口通信协议

一、串行通信 串行通信分为两种方式&#xff1a;同步串行通信和异步串行通信。 同步串行通信需要通信双方在同一时钟的控制下&#xff0c;同步传输数据。 异步串行通信是指通信双方使用各自的时钟控制数据的发送和接收过程。 二、UART 通用异步收发传输器&#xff08;Unive…

【Vue/element】 el-table实现表格动态新增/插入/删除 表格行,可编辑单元格

el-table实现表格动态新增/插入/删除 表格行&#xff0c;可编辑单元格 效果如下&#xff1a; 点击“新增一行”可以在表格最后新增一行&#xff0c;单元格内容可编辑 点击绿色按钮&#xff0c;可在指定行的后面插入一行 点击红色-按钮&#xff0c;可以删除指定行 原理&#…

让小程序动起来-轮播图的两种方式--【浅入深出系列003】

浅入深出系列总目录在000集 如何0元学微信小程序–【浅入深出系列000】 文章目录 本系列校训学习资源的选择啥是轮播图轮播图的关键代码最常见的轮播图代码便于理解的轮播代码两种轮播代码的比较 实际操练第一步&#xff0c;就是找到文件。第二步&#xff0c;先改动一下最显眼…

Docker使用总结

Docker 1.什么是 Docker 官网的介绍是“Docker is the world’s leading software container platform.” 官方给Docker的定位是一个应用容器平台。 Docker 是一个容器平台的领导者 Docker 容器平台 Docker 应用容器平台 application项目 Mysql Redis MongoDB ElasticSeacrh …

分布式运用——存储系统Ceph

分布式运用——存储系统Ceph 一、Ceph 介绍1.Ceph 简介2、存储基础2.1 单机存储设备2.2 单机存储的问题2.3 商业存储解决方案2.4 分布式存储&#xff08;软件定义的存储 SDS&#xff09;2.5 分布式存储的类型 3.Ceph 优势3.1 高扩展性3.2 高可靠性3.3 高性能3.4 功能强大 4.Cep…

hybridCLR热更遇到问题

报错1&#xff1a; No ‘git‘ executable was found. Please install Git on your system then restart 下载Git安装&#xff1a; Git - Downloading Package 配置&#xff1a;https://blog.csdn.net/baidu_38246836/article/details/106812067 重启电脑 unity&#xff1a;…