TCP三次握手与四次挥手
TCP三次握手TCP 使用三次握手的设计是为了确保可靠的连接建立。下面是三次握手的过程及其原因:
第一次握手(SYN):客户端发送一个带有 SYN(同步)标志的数据包给服务器,请求建立连接。此时客户端进入 SYN_SENT 状态。
第二次握手(SYN + ACK):服务器收到客户端的 SYN 数据包后,会发送一个带有 SYN 和 ACK(确认)标志的数据包给客户端,表示接受连接请求,并确认客户端的请求有效。此时服务器进入 SYN_RCVD 状态。
第三次握手(ACK):客户端收到服务器的 SYN + ACK 数据包后,会发送一个带有 ACK 标志的数据包给服务器,表示连接建立成功。此时客户端和服务器都进入 ESTABLISHED(已建立)状态,可以开始进行数据传输。
为什么不设计两次握手
双方都能确认对方的能力:通过三次握手,客户端和服务器都能确认对方的存在和正常工作。客户端发送 SYN 数据包,服务器回复 SYN + ACK 数据包,客户端再回复 ACK 数据包,双方都能确保对方的通信能力。
防止已失效的连接请求被误认为有效:如果只有两次握手,那么在某些情况下,已失效的 ...
短轮询和长轮询
短轮询(Short Polling)和长轮询(Long Polling)是两种常见的客户端与服务器之间进行实时通信的技术。
短轮询短轮询是一种简单的轮询机制,客户端定期向服务器发送请求,询问是否有新的数据可用。服务器在接收到请求后,立即返回响应,无论是否有新的数据。如果服务器没有新的数据可用,客户端会立即再次发送请求,以继续轮询。这种方式的特点是实现简单,但会导致频繁的请求和响应,增加了网络流量和服务器负载。
长轮询长轮询是一种改进的轮询机制,客户端发送请求后,服务器不会立即返回响应。相反,服务器会保持连接打开,直到有新的数据可用或超时发生。只有当有新的数据可用或超时发生时,服务器才会返回响应给客户端。客户端在收到响应后,可以立即发送下一个请求,以继续轮询。这种方式减少了无效的请求和响应,减少了网络流量和服务器负载,同时也能够实现较低的延迟和实时性。
长轮询相对于短轮询的优势在于减少了不必要的网络通信,提高了效率和性能。然而,长轮询的实现相对复杂一些,需要服务器能够处理并发连接和超时管理。另外,长轮询也可能导致连接保持时间较长,增加了服务器资源的占用。
选择使用长轮询还是短轮询取决于 ...
为hexo博客butterfly主题添加一个自定义live2d
为hexo博客butterfly主题添加一个自定义live2d仓库地址:GitHub - EYHN/hexo-helper-live2d: Add the Sseexxyyy live2d to your hexo!
注意:此插件目前无法加载moc3的模型 :)
首先npm安装包:
1npm install --save hexo-helper-live2d
安装好包后就可以在你的博客文件夹下的_config.yml文件或主题文件夹下的的_config.butterfly.yml文件中引用啦~
我这里在_config.yml文件中添加了如下配置:
123456789101112131415161718192021222324252627## live2d#https://github.com/EYHN/hexo-helper-live2dlive2d: enable: true # 是否开启live2d scriptFrom: local # 脚本从本地引入 pluginRootPath: live2dw/ # 插件在站点上的根目录(相对路径) pluginJsPath: ...
AI工具究竟是帮手还是对手
今天心血来潮突然想水一篇文章,毕竟openai的chatgpt问世掀起不小波澜,咱也得表示表示证明自己来过。正好逛c站看到一个话题:AI工具究竟是帮手还是对手,闲着也是闲着,发个文章。
当谈论AI工具究竟是帮手还是对手时,需要从多个角度考虑。从IT从业者的角度来看,AI工具无疑是一个帮手,可以算是数码时代的利器。但并不意味着AI工具就一定是对手。正确地使用AI工具,可以提高生产力和效率,让我们更好地应对日常工作的挑战。
首先,AI工具在IT领域中的应用范围非常广泛,可以应用于数据挖掘和分析、语音和图像识别、自然语言处理、机器学习等众多领域。利用这些工具,IT从业者们可以在很短的时间内处理大量的数据、分析复杂的业务场景,从而提供更优秀的解决方案。
其次,AI工具可以减少人类工作过程中发生的失误,降低人工劳动强度,增强生产力和效率。通过使用AI工具,从业者们可以在更短的时间内完成更多的任务,同时还能增强业务的可靠性和稳定性。
然而,在使用AI工具的同时,也需要注意其对人类的置换(replacing)效果。人工智能工具可以替代某些重复性较高的工作,从而让一些人失去他们原有的职业。由于AI工具 ...
MySQL索引
索引是帮助 MySQL 高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查询算法,这种数据结构就是索引。
优点:
提高数据检索效率,降低数据库的IO成本
通过索引列对数据进行排序,降低数据排序的成本,降低CPU的消耗
缺点:
索引列也是要占用空间的
索引大大提高了查询效率,但降低了更新的速度,比如 INSERT、UPDATE、DELETE
索引结构
索引结构
描述
B+Tree
最常见的索引类型,大部分引擎都支持B+树索引
Hash
底层数据结构是用哈希表实现,只有精确匹配索引列的查询才有效,不支持范围查询
R-Tree(空间索引)
空间索引是 MyISAM 引擎的一个特殊索引类型,主要用于地理空间数据类型,通常使用较少
Full-Text(全文索引)
是一种通过建立倒排索引,快速匹配文档的方式,类似于 Lucene, Solr, ES
索引
InnoDB
MyISAM
Memory
B+Tree索引
支持
支持 ...
MySQL基础
概念数据库:顾名思义,存储数据的仓库,英文:DataBase(DB)。
SQL:操作关系型数据库的编程语言,定义了一套操作 关系型数据库统一标准,英文:Structured Query Language (SQL)。
当然还有方便操作和管理数据的软件叫数据库管理软件:DataBase Management System (DBMS)。
目前市场主流的关系型数据库如下:
Oracle:Oracle公司产品大型数据库,收费。
MySQL:中小型数据库,目前是Oracle公司的,有收费和社区版。
SQL Server:Microsoft公司推出的收费的中型数据库,C#、.net等语言常用。
PostgreSql:免费中小型数据库。
SQLite:移动平台微型数据库。
关系型数据库:建立在关系模型基础上,由多张相互连接的二维表组成的数据库。
所谓二维表,指的是由行和列组成的表,如下图(就类似于Excel表格数据,有表头、有列、有行, 还可以通过一列关联另外一个表格中的某一列数据)。我们之前提到的MySQL、Oracle、 SQLServer这些都属于关系型数据库,里面都是基于二维表存储数 ...
RabbitMQ
初识MQ同步和异步通讯微服务间通讯有同步和异步两种方式:
同步通讯:就像打电话,需要实时响应。
异步通讯:就像发邮件,不需要马上回复。
两种方式各有优劣,打电话可以立即得到响应,但是你却不能跟多个人同时通话。发送邮件可以同时与多个人收发邮件,但是往往响应会有延迟。
同步通讯我们之前学习的Feign调用就属于同步方式,虽然调用可以实时得到结果,但存在下面的问题:
总结:
同步调用的优点:
时效性较强,可以立即得到结果
同步调用的问题:
耦合度高
性能和吞吐能力下降
有额外的资源消耗
有级联失败问题
异步通讯异步调用则可以避免上述问题:
我们以购买商品为例,用户支付后需要调用订单服务完成订单状态修改,调用物流服务,从仓库分配响应的库存并准备发货。
在事件模式中,支付服务是事件发布者(publisher),在支付完成后只需要发布一个支付成功的事件(event),事件中带上订单id。
订单服务和物流服务是事件订阅者(Consumer),订阅支付成功的事件,监听到事件后完成自己业务即可。
为了解除事件发布者与订阅者之间的耦合,两者并不是直接通信,而是有一个中间人(Broker)。发布 ...
SpringCloud之gateway
Gateway服务网关Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等响应式编程和事件流技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。
为什么需要网关Gateway网关是我们服务的守门神,所有微服务的统一入口。
网关的核心功能特性:
请求路由
权限控制
限流
架构图:
权限控制:网关作为微服务入口,需要校验用户是否有请求资格,如果没有则进行拦截。
路由和负载均衡:一切请求都必须先经过gateway,但网关不处理业务,而是根据某种规则,把请求转发到某个微服务,这个过程叫做路由。当然路由的目标服务有多个时,还需要做负载均衡。
限流:当请求流量过高时,在网关中按照下流的微服务能够接受的速度来放行请求,避免服务压力过大。
在SpringCloud中网关的实现包括两种:
gateway
zuul
Zuul是基于Servlet的实现,属于阻塞式编程。而SpringCloudGateway则是基于Spring5 ...
SpringCloud之nacos
Nacos注册中心国内公司一般都推崇阿里巴巴的技术,比如注册中心,SpringCloudAlibaba也推出了一个名为Nacos的注册中心。
认识NacosNacos是阿里巴巴的产品,现在是SpringCloud中的一个组件。相比Eureka功能更加丰富,在国内受欢迎程度较高。
官方指导文档:https://nacos.io/zh-cn/docs/quick-start.html。
版本选择:https://github.com/alibaba/spring-cloud-alibaba/wiki/版本说明。
安装NacosWindows安装开发阶段采用单机安装即可。
在Nacos的GitHub页面,提供有下载链接,可以下载编译好的Nacos服务端或者源代码:
GitHub主页:https://github.com/alibaba/nacos
GitHub的Release下载页:https://github.com/alibaba/nacos/releases
本demo采用1.4.1.版本的Nacos:
将这个包解压到任意非中文目录下:
Nacos的默认端口是8848,如果你电脑 ...
SpringCloud之eureka
认识微服务随着互联网行业的发展,对服务的要求也越来越高,服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢?
单体架构单体架构:将业务的所有功能集中在一个项目中开发,打成一个包部署。
单体架构的优缺点如下:
优点:
架构简单
部署成本低
缺点:
耦合度高(维护困难、升级困难)
分布式架构分布式架构:根据业务功能对系统做拆分,每个业务功能模块作为独立项目开发,称为一个服务。
分布式架构的优缺点:
优点:
降低服务耦合
有利于服务升级和拓展
缺点:
服务调用关系错综复杂
分布式架构虽然降低了服务耦合,但是服务拆分时也有很多问题需要思考:
服务拆分的粒度如何界定?
服务之间如何调用?
服务的调用关系如何管理?
人们需要制定一套行之有效的标准来约束分布式架构。
微服务微服务的架构特征:
单一职责:微服务拆分粒度更小,每一个服务都对应唯一的业务能力,做到单一职责
自治:团队独立、技术独立、数据独立,独立部署和交付
面向服务:服务提供统一标准的接口,与语言和技术无关
隔离性强:服务调用做好隔离、容错、降级,避免出现级联问题
微服务的上述特性 ...
智子商城项目开发文档
ZutShopJunior practical training project
本人大三做的实训项目,前后端分离,包含后台管理。
后端地址:https://github.com/roydonGuo/ZutShop
前端使用Vue,前端项目地址:https://github.com/roydonGuo/ZutShop-Vue
0. 项目介绍项目名称:智子商城。类似于购物车系统、订单系统。前后端分离。
分析项目:
当开发某一个项目时,分许该项目中需要处理哪些数据?
例如:用户,收货地址,商品类别,商品,收藏,购物车,订单。。。。
处理数据的先后顺序:先处理基础数据,在处理相关数据,
例如需要先处理商品数据,才可以处理订单数据
处理以上数据的先后顺序:用户>收获地址>商品类别>商品>收藏>购物车>订单
当确定了数据处理顺序之后应该分析每个数据对应的功能有哪些
例如用户数据:注册,登录,修改密码,修改资料,上传头像。。。。
确定开发功能的开发顺序,遵循增>查>删>改
用户数据功能的开发顺序:注册>登录>修改密码> ...
SpringSecurity
0.简介 Spring Security 是 Spring 家族中的一个安全管理框架。相比与另外一个安全框架Shiro,它提供了更丰富的功能,社区资源也比Shiro丰富。
一般来说中大型的项目都是使用SpringSecurity 来做安全框架。小项目有Shiro的比较多,因为相比与SpringSecurity,Shiro的上手更加的简单。
一般Web应用的需要进行认证和授权。
认证:验证当前访问系统的是不是本系统的用户,并且要确认具体是哪个用户。
授权:经过认证后判断当前用户是否有权限进行某个操作。
而认证和授权也是SpringSecurity作为安全框架的核心功能。
1.入门Demo1.1新建项目 创建项目不用多说,创建maven或者spring项目都行。端口默认8080就行,配置文件先不用问,先来个小Demo,没什么好说的。
我这里项目名称叫SecurityDemo1
① 设置父工程 添加依赖
123456789101112131415161718<parent> <groupId>org.springframe ...
2023黑马Java程序员学习路线
学习路线图_入门Java SE基础 → Java Web(含数据库+H5+js+vue)
中级Maven → Git → SSM框架 → MybatisPlus → Spring Boot→ 《传智健康》项目实战 → 《瑞吉外卖》项目实战
进阶Spring Cloud(微服务开发,学这一套就够了) 也可以按照以下技术点学:Dubbo → Zookeeper → RabbitMQ → RocketMQ → Docker → Redis → MongoDB → Elasticsearch → MySQL进阶
项目《SaaSiHRM》企业服务 → 《好客租房》生活服务 → 权限管理一体化解决方案 → 短信网关平台
面试Java大厂面试专题课 → Java百度地图
以上技术,足以支撑找一份好的java开发工作。工作后再提升,学习的技术:JDK8-15新特性 → 编程强化 → 数据库强化 → 安全框架SpringSecurity → 报表技术 → 模板引擎VelocityTools → 工作流Activiti7……
Vue2小视频demo
关于我在酒店隔离闲来无事网上冲浪发现一个免费api后的一系列故事…由于无聊,再加上发现了一个好东西,不能我自己一个人享受,得拿出来大家鉴赏鉴赏(doge)就诞生了这个vue视频播放demo,没有使用组件,原生video元素。不多说了,各位注意身体|
运行效果截图我就不放了,,
奉上源码:
https://github.com/roydonGuo/WebDemo/tree/dev/girl-video1
harmony2.0-基础
事件常见的事件有:单击、双击、长按、还有触摸事件 。我们可以给文本、按钮等等组件添加不同的事件。
单击事件
接口名:ClickedListener
四种实现方法(下面的其他事件类推):
自己编写实现类
123456789101112131415161718192021222324252627282930313233public class MainAbilitySlice extends AbilitySlice { Button btn1; @Override public void onStart(Intent intent) { super.onStart(intent); super.setUIContent(ResourceTable.Layout_ability_main); btn1 = (Button) findComponentById(ResourceTable.Id_btn1); // 1.自定义实现类 btn1.setClickedList ...
Mybatis-Plus之mapper Crud
简介
官网:https://baomidou.com
研发团队:苞米豆
github地址:https://github.com/baomidou/mybatis-plus
MyBatis-Plus(简称 MP)是一个 MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
小蓝鸟代表Mybatis,小红鸟代表MP,就像魂斗罗两兄弟,基友搭配,效率翻倍。
特性(来自官网)
无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
支持 ActiveRecord 模式 ...
Java面试-基础篇
基础篇要点分为三部分:1.算法、2.数据结构、3.基础设计模式(单例模式)
算法算法要求:
不但要掌握各个算法的含义,代码逻辑,更要能通过自己理解的角度对代码有一个清楚的认识,能使用自己的语言口述算法。
二分查找算法描述:
前提:有已排序数组 A
定义左边界 L、右边界 R,确定搜索范围,循环执行二分查找(3、4两步)
获取中间索引 M = Floor((L+R) /2)
中间索引的值 A[M] 与待搜索的值 T 进行比较
① A[M] == T 表示找到,返回中间索引
② A[M] > T,中间值右侧的其它元素都大于 T,无需比较,中间索引左边去找,M - 1 设置为右边界,重新查找
③ A[M] < T,中间值左侧的其它元素都小于 T,无需比较,中间索引右边去找,M + 1 设置为左边界,重新查找
当 L > R 时,表示没有找到,应结束循环
算法实现:
1234567891011121314public static int binarySearch(int[] a, int t) { int l = 0, r = a.l ...
LeetCode
常见数据结构可参考下方视频(视频来自B站黑马程序员之Java SE)
14.最长公共前缀编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 “”。
示例 1:
12输入:strs = ["flower","flow","flight"]输出:"fl"
示例 2:
123输入:strs = ["dog","racecar","car"]输出:""解释:输入不存在公共前缀。
java思路1234567891011121314public static String longestCommonPrefixSolution(String[] strs) { if (strs == null || strs.length == 0) { return ""; } String str = ...
Python入门
单行注释与多行注释单行注释用#—>一个井号,vacode快捷键ctrl+/
多行注释用"""—>三个双引号,vacode快捷键ctrl+shift+/
12345print('hello python') #现在这个是单行注释"""这个是多行注释print('hello python')print('hello python')"""
输入输出输入使用input函数可以获得用户输入在控制台窗口上输入的一行的字符串,使用变量 = input()的形式将其赋值给一个变量:
12str1 = input()print("输入的是%s" % str1)
还可以在input()的括号内,加入一些提示信息:
12str1=input("请输入:")print("输入的是%s" % str1)
输出print的函数将要输出的内容放在print()的括号内,就可以输出:
12 ...
python环境配置——Miniconda
Miniconda下载地址:https://docs.conda.io/en/latest/miniconda.html查看当前python版本:下载python3.7版本(不用直接找官网下载配环境变量了):激活新安装的3.7环境:此时在vs code中可查看多版本环境
关于mybatis一对一查询,一对多查询遇到的错误
springboot整合mybatis项目博客系统文章,相册,评论,标签,等表IDEA为最新版2021.3.3,mysql数据库为最新版Navicat
(或许有些字段不支持特定的命名)也是醉了,以前idea还是19版的,navicat也是老版本的时候mybatis关联查询mapper操作能正常运行,拿到相应字段,并封装,但最近写项目过程中遇到一个离谱的是,过了好久才发现,
当关联查询时,无论一对一还是一对多除了需要注意javaType和ofType之外,还应该注意各表主键不能同一名称
实体类文章
1234567891011121314151617@Data@AllArgsConstructor@NoArgsConstructorpublic class Article implements Serializable { private Integer id; private Integer authorId; private String title; private String content; private Timestamp d ...
node.js
notice: 基础篇,具体讲解模块化部分内容,路由模块,写接口,数据库,JWT
前提·需要掌握
Node.js is a JavaScript runtime built on Chrome’s V8 JavaScript engine.Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。
Node.js 的官网地址: https://nodejs.org/zh-cn/
浏览器是 JavaScript 的前端运行环境。
Node.js 是 JavaScript 的后端运行环境。Node.js 中无法调用 DOM 和 BOM 等浏览器内置 API。
使用 tab 键,能够快速补全路径使用 esc 键,能够快速清空当前已输入的命令输入 cls 命令,可以清空终端
fs 文件系统模块fs 模块是 Node.js 官方提供的、用来操作文件的模块。它提供了一系列的方法和属性,用来满足用户对文件的操作需求。例如:
fs.readFile() 方法,用来读取指定文件中的内容
fs.writeFile() 方法,用来向指定的文件中写入内容 ...
Minecraft——Forge1.16.5模组开发(36.2.20)——(3)第一个实体方块
类似于方草块,我们可以自定义我们的实体方块,然后注册到Block组中,听起来很简单,需要继承minecraft提供的Block父类下面演示一个黑曜石实体方块的例子,新建一个包代表新增的方块的例子注册和实例化都在此包下首先要注册我们的黑曜石方块,那么就需要先增加一个黑曜石实体类,然后再在此包下新建一个注册石块的类,因为黑曜石方块在mc中属于十块block然后时注册类,去注册此方块实体类
然后注册到mod总线中
启动就能在方块栏最下面找到接着就是为方块添加材质贴图都是在resources包下添加
1234567891011121314resources├── META-INF│ └── mods.toml├── assets│ └── boson│ ├── blockstates│ ├── lang│ ├── models│ │ ├── block│ │ └── item│ └── textures│ ├── block│ └── item└── pack.mcm ...
Minecraft——Forge1.16.5模组开发(36.2.20)——(2)Mod全局配置
当我们配置好mod开发环境后,注意到官方演示mod类上有一段注解
@Mod(“examplemod”)
这个的意思就是你这个mod的id,完全可以自定义,当你自定义后,修改resouses包下面的mods.toml文件,需要把mod_id修改为自己的mod_id这里可以别急着修改,因为我们要把官方的演示包给删掉,就是java包下的一些包都可以删掉,然后新建包,名称可以自己指定,此处是三级,主类在guo这个包下,即主类Guo就在此包下新建如下图为方便后续使用modid可以封装一个工具类,就是类Guo下面的Utils类,里面声明了modid。主类调用时直接引用即可
Minecraft——Forge1.16.5模组开发(36.2.20)——(1)开发环境搭建
==声明==:本文旨在提升作者的代码逻辑记忆能力,加深思考mojang的代码底层逻辑,更新mojang由于版本迭代替换掉的方法名称和实体名称,部分转载自Forge官方开发文档,指路->1.16.5开发,源代码GitHub->BosonSourceCode==同时==:各位也可前往GitHub查看minecraft中文开发文档,指路->minecraft中文开发指南
1.java的安装本文由于按照官方操作文档进行开发1.16.5版本,故java版本为1.8,此处我的java的jdk版本为1.8_311,开发1.16.5的forge推荐使用java8;
//作者java版本:
1.1java下载java8u311阿里云盘分享——提取码: py20java下载好后创建文件夹,把安装路径在随便一个盘中,如下图作者的java放在了D盘,新建的文件夹目录如下,注意:jdk1.8.0_311也是自己新建的文件夹,到时候安装时选择安装路径就是把java的jdk安装在此文件夹下;jdk的目录结构
D:├── JAVA│ └── java├── └── jdk1.8 ...
Redis-安装与配置
1. Redis1.1. Redis的安装 大多数企业都是基于Linux服务器来部署项目,而且Redis官方也没有提供Windows版本的安装包。本教程会在Linux下部署redis。
Linux版本为CentOS 7。
Redis的官方网站地址:https://redis.io/
1.1.1. Windows安装 首先下载Redis压缩包,直接解压到指定目录即可,redis.conf配置文件
1.1.2. Linux安装 首先去Redis官网 download下载linux版本压缩包,官网只提供.tar.gz格式在linux环境下部署的压缩包。
Redis是基于C语言编写的,因此首先需要安装Redis所需要的gcc依赖:打开linux命令行界面输入下列命令
1yum install -y gcc tcl
下载好的Redis安装包需要上传到虚拟机的指定目录,如此处我们上传的目录为根目录下的/JavaTools/Redis-5.0.14,可以使用==Xftp==上传。
在根目录’/‘下创建JavTool ...
redis通用命令和类型
reids通用命令和类型redis的数据类型key-valueredis不想数据库有table其中id不会混乱,但redis的key都存在一起,所以命名可以加上’ : ‘作为区分例如,本人roydon有article和problem
12roydon:article:idroydon:problem:id
value若是Java对象,可序列化为json字符串后存储例如,key为roydon:user:1对应value:1'{"id":1,"name":"roydon","age":20}'
命令添加set (key) (value)获取get (key) (value)
通用命令结合help (commend)查看具体用法
KEYS:查看符合模板的所有key,结合通配符,不建议生产使用DEL:删除指定的key,也可以同时删除多个EXISTS:判断key是否存在EXPIRE:给key设置有效期,到期该key自动删除(integer) -2TTL:查看一个key的剩 ...
redis缓存击穿
场景也是热点key问题,就是一个高并发访问并且缓存重建较为复杂的key突然失效了,这里的key失效可以理解为某电商平台在节日大促,同时段大量请求访问一个商品,这个商品key会存在一个固定TTL,若TTL到时了,key消失,仍有大量请求访问该商品,这个key的重建业务复杂,耗时又高。于是,请求都来到数据库拿数据,瞬间给数据库造成了巨大的压力。
解决方案互斥锁在发起请求未命中redis缓存时,表示此信息不存在,或过期,尝试获取锁。若没拿到锁,表示此数据正在被更新,线程进行休眠再递归重新从缓存获取数据。若拿到了锁,根据id查数据库,将数据信息写入redis并释放互斥锁,返回数据。ps:图片来自B站黑马程序员
redis中有命令setnx key value表示key不存在就set,存在就无法赋值,这就可以应用到锁中
对应方法setIfAbsent(),再设置过期时间,避免死锁
1234567private boolean tryLock(String key) {//获取锁 Boolean flag = stringRedisTemplate ...
redis缓存穿透
ps:想只读有效信息,见红字
正常情况当在高并发,高性能,降低数据库压力的情况下,首先会选择redis作为缓存机制,当有大量请求需要查询数据库时,为了降低数据库的压力,并提高请求查询性能(redis基于内存,读取速度快),会将数据库的信息缓存到redis中,这样就形成了很好的分层结构,请求可以直接查询redis中缓存的信息,然后返回,就不需要经过数据库,减小了数据库的压力,同时,可以迅速查询到信息,岂不美哉。先从缓存取数据,娶不到从数据库取,取到了就返回并添加缓存或更新缓存,取不到就返回空。
==正常请求操作==
第4步,当从数据库拿到数据时,一并添加到redis缓存,下次若是相同请求,直接访问redis并返回,大大提升了性能和可用性,持久性。
非正常情况但有利就有弊,如果请求的数据是数据库中没有的,同样redis中也不会出现此数据缓存,这样当某短时间大量无效请求(数据库无对应数据)访问时,由于redis中没有此数据缓存,请求就给到了数据库,那么压力就来到了数据库这边,可想而知,其中会浪费掉多少性能,若是有心怀**之人故意为之,后果可想而知。所以,这就需要一个很好的解决方案,当 ...
计算机网络(谢希仁第八版)第一章:概述
1.计算机网络在信息时代的作用三网:电信网络,有线电视网络,计算机网络。
三网融合:由于涉及多方面的利益和行政管辖权的问题,目前没有实现。
Internet(译名:因特网,目前使用最广泛的译名为:==互联网==(不是互连网internet))采用TCP/IP协议族作为通信规则,其前身为美国的ARPANET。
*互联网的两个特点:
121. ***连通性***2. ***共享***
2.互联网概述
互联网概述:将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。
计算机网络(网络):由若干节点(node可以是计算机,集线器,交换机或路由器等)和连接这些节点的链路(link)组成。互连网(internet):网络的网络,由许多计算机网络通过路由器相互连接起来,构成的覆盖范围更大的计算机网络。互联网基础结构发展的三个阶段:
第一阶段(1969—1990):单个的分组交换网络ARPANET(不是互连网)向互连网发展,1983年TCP/IP协议成为ARPANET上的标准协议, ...