netty高性能网络框架涉及的核心组件
https://www.processon.com/view/60ddbec51efad40c1bf0210d?fromnew=1
pipeline解决Redis频繁命令往返导致的性能瓶颈
客户端和服务端交互模型 Redis 的 pipeline 交互模型 Redis pipeline 与原生批量mset等等命令对比 原生批量命令是原子性,pipeline 是非原子性的 原生批量命令一次只能执行一种命令,pipeline 支持批量执行不同命令 原生批命令是服务端实现,而 pipeline 需要服务端与客户端共同完成 需要注意: Redlis 事务是具有隔离性的,在执行过程中不会穿插执行其他客户瑞发送的命令 使用 pipeline 组装的命令个数不能太多,不然数据量过大 pipeline 会按照指令缓冲的顺序执行,但是可能会穿插其他客户端发送来的命令,即时序性不一定能够保证 pipeline 执行中间某一个指令出现异常,将会继续执行后续的指令,即不能保证原子性
shell排错
shell排错常见语法错误=当做==1234567#!/bin/bashnumber=1if [ $number = 1 ]; then echo "Number is equal to 1."else echo "Number is not equal to 1."fi echo字符表达式丢失引号1234567#!/bin/bashnumber=1if [ $number == 1 ]; then echo "Number is equal to 1.else echo "Number is not equal to 1."fi 丢失或意外的标记删除 if 命令中测试之后的分号 12345678#!/bin/bash# trouble: script to demonstrate common errorsnumber=1if [ $number = 1 ] then echo "Number is equal to 1.&qu...
一致性哈希原理
数据服务器如何组织:设计时候保证高频中低频都有数量。否则就是忙的忙死闲的闲死 逻辑层服务器:增加和减少机器的时候代价很小 数据层服务器:增加和减少机器的时候代价是全量的 取模服务器个数的问题–缓存雪崩取模 也可以 实现数据底层均匀分布,hash(图片名称)% N 当服务器数量发生改变时,所有缓存在一定时间内是失效的,当应用无法从缓存中获取数据时,则会向后端服务器请求数据,同理,假设3台缓存中突然有一台缓存服务器出现了故障,无法进行缓存,那么我们则需要将故障机器移除,但是如果移除了一台缓存服务器,那么缓存服务器数量从3台变为2台,如果想要访问一张图片,这张图片的缓存位置必定会发生改变,以前缓存的图片也会失去缓存的作用与意义,由于大量缓存在同一时间失效,造成了缓存的雪崩,此时前端缓存已经无法起到承担部分压力的作用,后端服务器将会承受巨大的压力,整个系统很有可能被压垮,所以,我们应该想办法不让这种情况发生,但是由于上述HASH算法本身的缘故,使用取模法进行缓存时,这种情况是无法避免的,为了解决这些问题,一致性哈希算法诞生了。 简单的对服务器数量进行取模,当缓存服务器数量发生变化时,...
SpringMVC自定义返回状态码
使用 ResponseEntity 类标识整个 HTTP 响应(状态码、头部信息、响应体) 异常类或 Controller 方法上标识 @ResponseStatus 注解 或者 使用 @ControllerAdvice ( @RestControllerAdvice)和 @ ExceptionHandler 注解
vim配置使用
vim配置使用大多数 Linux 发行版不包含真正的 vi;而是自带一款高级替代版本,叫做 vim。通常,vim 在 Linux 系统中是“vi”的符号链接(或别名)。是一个模式编辑器。(插入模式,命令模式) 配置全局配置一般在/etc/vim/vimrc或者/etc/vimrc,对所有用户生效。用户个人的配置在~/.vimrc。 设置适合编写脚本的vim:syntax on 打开语法高亮。 :set hlsearch 高亮查找结果。 :set tabstop=4 设置一个 tab 字符所占据的列数。默认是8列。把这个值设置为4 :set autoindent 回车后,下一行的缩进会自动跟上一行的缩进保持一致。停止缩进,输入 Ctrl-d。 :set number :set nonumber 行号 上面是在命令模式下输入的只对当前文件有效,想要设置全局的按照下面。 通过把这些命令(没有开头的冒号字符)添加到你的 ~/.vimrc 文件中,这些改动会永久生效。 123456789101112131415161718192021"双引号表示行注释syntax on...
云原生理念
书籍:https://jimmysong.io/kubernetes-handbook/ 云原生理念 云原生在设计的时候就是为了在云上更高效而设计的,一切以云为初心。 云原生是一种行为方式和设计理念,究其本质,凡是能够提高云上资源利用率和应用交付效率的行为或方式都是云原生的。云计算的发展史就是一部云原生化的历史。Kubernetes 开启了云原生 1.0 的序幕,服务网格 Istio 的出现,引领了后 Kubernetes 时代的微服务,serverless 的再次兴起,使得云原生从基础设施层不断向应用架构层挺进,我们正处于一个云原生 2.0 的新时代。—— Jimmy Song 云原生指的是一个灵活的工程团队,遵循敏捷的研发原则,使用高度自动化的研发工具,开发专门基于并部署在云基础设施上的应用,以满足快速变化的客户需求。这些应用采用自动化的,可扩展的,和高可用的架构。这个工程团队通过高效的云计算现网的运维来提供这一应用服务,并且根据线上反馈对服务进行不断地改进。 什么是云原生应用?有哪些特点? 作者:justabug 链接:https://www.zhihu.co...
云原生技术概览
书籍:https://jimmysong.io/kubernetes-handbook/ 从云计算到微服务再到云原生计算下面将从云计算的发展历程引入云原生计算 云计算介绍云计算演进历程 云计算就是一种配置资源的方式,根据资源配置方式的不同我们可以把云计算从宏观上分为以下三种类型: IaaS:这是为了想要建立自己的商业模式并进行自定义的客户,例如亚马逊的EC2、S3存储、Rackspace虚拟机等都是IaaS。 PaaS:工具和服务的集合,对于想用它来构建自己的应用程序或者想快速得将应用程序部署到生产环境而不必关心底层硬件的用户和开发者来说是特别有用的,比如Cloud Foundry、Google App Engine、Heroku等。 SaaS:终端用户可以直接使用的应用程序。这个就太多,我们生活中用到的很多软件都是SaaS服务,只要基于互联网来提供的服务基本都是SaaS服务,有的服务是免费的,比如Google Docs,还有更多的是根据我们购买的Plan和使用量付费,比如GitHub、各种云存储。 微服务介绍Microservices微服务是一种分布式架构设计理念,为...
shell流程控制
shell流程控制if1234567if commands; then commands[elif commands; then commands...][else commands]fi commands可以是test表达式[ expression ] [expression]表达式(不推荐)测试文件表达式 表达式 如果下列条件为真则返回True file1 -ef file2 file1 和 file2 拥有相同的索引号(通过硬链接两个文件名指向相同的文件)。 file1 -nt file2 file1新于 file2。 file1 -ot file2 file1早于 file2。 -b file file 存在并且是一个块(设备)文件。 -c file file 存在并且是一个字符(设备)文件。 -d file file 存在并且是一个目录。 -e file file 存在。 -f file file 存在并且是一个普通文件。 -g file file 存在并且设置了组 ID。 -G file fi...
什么是IO多路复用?
什么是IO多路复用?多路复用也是面试比较常见的,尤其对于后端,因为很多中间件例如Redis、Nginx、Netty 以及jdk的 NIO 实现都用到了多路复用技术,作为实现高性能的重要底层手段是需要掌握的,下面总–分–总梳理一下: BIO和NIO的弊端前面的文章详细讲过这两个IO的原理: 当客户端数量越来越多时,上面两种方式的弊端逐渐明显: BIO主要问题有: 阻塞效率太低 多线程或者多进程的方式太耗费系统资源 NIO主要问题有: 遍历大量客户端连接,每一次系统调用只能检测一个文件描述符是否就绪。每一个都要发起系统调用是非常消耗系统资源的 默认文件描述符数量1024,需要ulimit修改才能创建更多客户端连接,但是设置很大又会遇到内存瓶颈 上结论原始 socket 编程方式中的 BIO(同步阻塞Blocking)是进程发起系统调用 read 的时候会阻塞挂起直到数据就绪。所以 BIO 中一般使用多线程处理多个文件描述符,但是多线程开销较大。 因此引入 NIO(同步非阻塞Non-Blocking),进程不会挂起而是直接返回成功或者失败,用户不断轮询直到拿到数据。但是系...