标签: 后端相关

青木 | 1天前 | 后端相关

从0到1实现短链系统

短链很常见,在互联网营销场景以及移动端信息传播等场景下起着重要的作用。同时,也是经常被来拿考察选手系统设计水平的一个场景。 对于服务端研发,关于前端访问时的长短转换,其实只要知道有 30X 重定向基本也就可以了。 相较于重定向,我更关注的,是 短链生成方式选型 、 存储选型 、 系统性能应对 等方面的方案和设计。 Part one 短链系统分析 短链系统的最根本能力: 是可以根据长链计算得到短链,以方便外部访问 : 判断对应短链已存在,则直接返回 判断对应短链不存在,则生成短链,并存储 <span 长链 短链</span 的映射关系 也可以根据短链映射到长链,寻找真实服务地址提供服务 : 根据 <span 短链 长链</span 查询存储,获取对应的长链 条条大路通罗马,系统方案有很多,但采取哪种最合适,还需要和存储策略以及访问性能联合起来一起

 40 |  0 |  0 后端相关

女王范 | 1天前 | Java后端相关

从Java BIO到NIO再到多路复用,看这篇就够了

本文从基础概率到引出业界通用c10k问题,然后通过代码演示从BIO,到NIO再到多路复用的演进历程。 从一次优化说起 近期优化了一个老的网关系统,在dubbo调用接口rt1000ms时吞吐量提升了25倍,而线程数却由64改到8。其他的优化手段不做展开,比较有意思的是为什么线程数减少,吞吐量却可以大幅提升?这就得从IO模型说起,貌似工作中很少使用IO,更别提NIO,但实际上我们工作中每天都在和IO打交道。我们所用到的中间件redis,rocketMq,nacos,mse,dubbo等等存在文件操作,存在网络通信的地方就存在IO。所以深入了解IO模型重要性可想而知,IO操作作为计算机系统中一个基本操作,几乎所有应用程序都需要,了解不同IO模型可助我们理解应用程序中IO操作底层原理,从而更好地优化应用程序的性能和可靠性。 接下来我会结合一些例子和代码,以最简单易懂的方式把IO的演进历程和大家探讨。 IO模型分类 分类 首先来谈下IO模型的分类: 1.BIO(Blocking I/O):同步阻塞I/O,传统的I/O模型。在进行I/O操作时,必须等待数...

 14 |  0 |  0 Java后端相关

奈我何 | 2天前 | 后端相关

缓存数据一致性探究

就像每一次发布上线修复问题的同时,也极易引入新的问题,自缓存诞生的第一天起,缓存与数据库的数据一致性问题就深深困扰着开发者们。 缓存是一种较低成本提升系统性能的方式,自它面世第一天起就备受广大开发者的喜爱。然而正如《人月神话》中的那句经典的“没有银弹”中所说,软件工程的设计没有银弹。 就像每一次发布上线修复问题的同时,也极易引入新的问题,自缓存诞生的第一天起, 缓存与数据库的数据一致性问题 就深深困扰着开发者们。 关键词: 原子性、事务性、数据一致性、双写一致性 缓存的查询 先查询缓存,如果查询失败,那么去查询DB,之后重建缓存,基本上不存在异议。 缓存的更新 先更新DB还是先更新缓存?是更新缓存还是删除缓存?在常规情况下,怎么操作都可以,但一旦面对高并发场景,就值得细细思量了。 1、先更新数据库再更新缓存 线程A:更新数据库(第1s)—— 更新缓存(第10s) 线程B:更新数据库 (第3s)—— 更新缓存(第5s) 并发场景下,这样的情况是很容易出现的,每个线程的操作先后顺序不同,这样就导致请求B的缓存值被请求A给...

 48 |  0 |  0 后端相关

iron Man | 3天前 | 后端相关

WebAssembly 模块化与动态链接

1. 前言 模块化编程(modular programming)是一种软件设计模式,它将软件分解为若干独立的、可替换的、具有预定功能的模块,每个模块实现一个功能,各模块通过接口(输入输出部分)组合在一起形成最终程序。当下流行的JavaScript、Python、Rust、Java 等语言都有具有模块(包)管理,甚至 C 20 开始都引入了模块化系统。 模块化编程从 1980 年代开始广泛传播,是 SoC (Separation of concerns)[1] 原则的理想目标,主要有如下特点: 易设计:较大的复杂问题分解为若干较小的简单问题,使我们可以从抽象的模块功能角度而非具体的实现角度去理解软件系统,从而整个系统的结构非常清晰、容易理解,设计人员在设计之初可以更加关注系统的顶层逻辑而非底层细节。 易实现:模块化设计适合团队开发,因为每个团队成员不需要了解系统全貌,只需关注所分配的小任务。另外团队可以灵活地增加人手,新人只需直接接手某个模块,不会影响系统其他模块的开发。 易测试:每个模块不但可以独立开发,也可以独立测试,最后组装时再进行联合测试。 易维护:

 16 |  0 |  0 后端相关

孤音 | 4天前 | 后端相关

骚操作,在JVM上运行其他语言

一 在Java的平台里,其实是可以执行其他的语言的。包括且不仅限于jvm发展出来的语言。 有的同学可能会说,在java项目里执行其他语言,这不吃饱了撑着么,java体系那么庞大,各种工具一应俱全,放着好好的java不写,还要去执行其他语言干嘛。 写java的都知道,java是需要事先编译的,这意味着你很难去在运行中改变编译好的class信息,除非你用字节码等技术栈,但是这也是需要很大的成本的。要想在运行中很方便的改变业务逻辑,其实用java去执行其他的脚本语言是一个好办法。况且有的脚本语言有着比java更简洁的语法特性。 二 在java中执行其他语言,可能你会觉得这应该很复杂,需要去学习每种语言包相关的api。可以负责任的说,在Java平台中调用其他脚本语言,其实一点都不复杂,你无需关心每种语言的实际api。 这一切都归功于一个规范: <span JSR223</span 。 相信有大部分人没听过这个Java平台的规范。 JSR223规范最初在Java6平台被提出,提供了一套标准的API为脚本语言的执行提供了内置支持。 也就是说,你只要熟悉这一套API...

 31 |  0 |  0 后端相关

观云 | 4天前 | 后端相关

Mybatis-Plus 自定义SQL注入器,非常实用!

一、什么是SQL注入器 我们在使用Mybatis-Plus时,dao层都会去继承BaseMapper接口,这样就可以用BaseMapper接口所有的方法,BaseMapper中每一个方法其实就是一个SQL注入器 在Mybatis-Plus的核心(core)包下,提供的默认可注入方法有这些: 那如果我们想自定义SQL注入器呢,我们该如何去做? 比如在Mybatis-Plus中调用updateById方法进行数据更新默认情况下是不能更新空值字段的。 而在实际开发过程中,往往会遇到需要将字段值更新为空值的情况。 那如何让Mybatis-Plus支持空值更新呢? 如果仅是想实现支持更新空值字段并不需要我们自定义SQL注入器,因为Mybatis-Plus提供了几个扩展SQL注入器。 二、内置扩展SQL注入器有哪些? 1、自带扩展SQL注入器 Mybatis-Plus 扩展SQL注入器在扩展包下,为我们提供了可扩展的...

 28 |  0 |  0 后端相关