自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(69)
  • 收藏
  • 关注

原创 SPIRNG 事务管理

说明本文介绍一下,事务的传播性,事务只读,隔离性和@Transactional注解的常用参数说明。@Transactional标签的使用在类上的注解当标于类前时,表示类中所有方法都进行事务处理,例:@Transactionalpublic class TestServiceImpl implements TestService{} 类中某些不需要事务@Transactionalpublic class TestServiceBean implements TestService{

2021-09-07 16:23:13 176

原创 分布式Session管理

分布式Session管理概述maven 引用配置application.yml使用概述由于Http连接是无状态的,所以使用Tomcat或其他应用服务器作为服务器的时候Tomcat内部会维护一个叫做Session的东东用来保存客户端的状态,一般情况下每个客户端都有一个cookie里面保存着叫jsessionid的cookie,每次访问tomcat的时候都会携带上,Tomcat可以根据这个jsessionid找到对应的session。就像你去超市买东西,门口的储物柜可以视作一个session容器,而打出的二

2021-09-04 12:11:30 218

原创 InnoDB怎么解决幻读?

结论首先说结论,在RR的隔离级别下,Innodb使用MVCC和next-key locks解决幻读,MVCC解决的是普通读(快照读)的幻读,next-key locks解决的是当前读情况下的幻读。幻读是什么事务A,先执行:update table set name=“hh” where id>3;结果为:OK row xx 表名成功影响多少行数据事务B,后执行,并且提交:insert into table values(11, uu);commit;事务A,然后再selec

2020-10-20 10:08:44 456

原创 点赞模块设计:Redis缓存 + 定时写入数据库实现高性能点赞功能

本文基于 SpringCloud, 用户发起点赞、取消点赞后先存入 Redis 中,再每隔两小时从 Redis 读取点赞数据写入数据库中做持久化存储。点赞功能在很多系统中都有,但别看功能小,想要做好需要考虑的东西还挺多的。点赞、取消点赞是高频次的操作,若每次都读写数据库,大量的操作会影响数据库性能,所以需要做缓存。至于多久从 Redis 取一次数据存到数据库中,根据项目的实际情况定吧,这里暂时设了一个小时。项目需求需要查看都谁点赞了,所以要存储每个点赞的点赞人、被点赞人,不能简单的做计数。文章分四

2020-09-11 10:35:05 2508 2

原创 为什么 Redis 要比 Memcached 更火?

前言我们都知道,Redis和Memcached都是内存数据库,它们的访问速度非常之快。但我们在开发过程中,这两个内存数据库,我们到底要如何选择呢?它们的优劣都有哪些?为什么现在看Redis要比Memcached更火一些?这里就从各个方面来对比这两个内存数据库的差异,方便你在使用时,做出最符合业务需要的选择。要分析它们的区别,主要从以下几个方面对比:线程模型数据结构淘汰策略管道与事务持久化高可用集群化线程模型要说性能,必须要分析它们的服务模型。Memcached处理请求采用多线

2020-09-11 10:14:12 122

原创 面对亿级数据,MySQL硬的起来么???

1亿数据查询速度创建表test1test1表,结构比较简单,2个字段,都有索引。DROP TABLE IF EXISTS test1;CREATE TABLE test1( id int PRIMARY KEY COMMENT '编号' auto_increment, order_num bigint comment '订单号')COMMENT '用户表';/*order_num分别加索引*/create index idx1 on test1(order_num);插入1亿数据

2020-09-10 20:10:16 362

原创 ES 数据十亿级别如何提高查询效率?

性能优化的杀手锏——filesystem cache你往 es 里写的数据,实际上都写到磁盘文件里去了,查询的时候,操作系统会将磁盘文件里的数据自动缓存到 filesystem cache 里面去。es 的搜索引擎严重依赖于底层的 filesystem cache ,你如果给 filesystem cache 更多的内存,尽量让内存可以容纳所有的 idx segment file 索引数据文件,那么你搜索的时候就基本都是走内存的,性能会非常高。性能差距究竟可以有多大?我们之前很多的测试和压测,如果走

2020-09-10 20:02:32 226

原创 JS 写逻辑判断,不要只知道用 if-else 和 switch

我们在编写 JS 代码时,经常会遇到逻辑判断复杂的情况。一般情况下,可以用 if/else 或 switch 来实现多个条件判断,但会出现一个问题:随着逻辑复杂度的增加,代码中的 if/else 和 switch 会越来越臃肿。本文将带你尝试写出更优雅的判断逻辑。比如说下面这样一段代码:const onButtonClick = (status) => { if (status == 1) { sendLog('processing') jumpTo('IndexPage')

2020-09-10 08:31:45 537

原创 MySQL如何最大程度防止人为误操作

MySQL帮助说明[root@xingzhiyu~]# mysql --help|grep dummy -U, --i-am-a-dummy Synonym for option --safe-updates, -U.i-am-a-dummy FALSE在mysql命令加上选项-U后,当发出没有WHERE或LIMIT关键字的UPDATE或DELETE时,MySQL程序就会拒绝执行。指定-U登录测试[root@xingzhiyu~]# mysql -uroot -proot

2020-09-09 08:34:12 130

原创 C#实现移动零和爬楼梯

移动零给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。示例:输入: [0,1,0,3,12]输出: [1,3,12,0,0]说明:必须在原数组上操作,不能拷贝额外的数组。尽量减少操作次数。题解:public void MoveZeroes(int[] nums) { // 解法1:处理不为0的,再处理为0的 if (nums == null || nums.Length == 0)

2020-09-09 08:10:33 172

原创 java学习系列-Spring篇02:控制反转(IoC)与依赖注入(DI)

Spring中有3个核心的概念:控制反转(Ioc)、依赖注入(DI)、面向切面编程(AOP),spring中其他的技术都是依靠3个核心的技术建立起来的,所以玩spring需要先对这3个概念有个深入的理解。本文我们先介绍其中的两个:控制反转和依赖注入,而aop我们后面有专门的文章详解。引出spring有2个类,A和B,如下:public class A{ public void m1(){}}public class B{ public void m1();}上面2个类都有

2020-09-06 20:45:04 133

原创 mysql为什么不推荐使用uuid或者雪花id作为主键

一:mysql和程序实例1.1:要说明这个问题,我们首先来建立三张表,分别是user_auto_key, user_uuid, user_random_key, 分别表示自动增长的主键,uuid作为主键,随机key作为主键,其它我们完全保持不变.根据控制变量法,我们只把每个表的主键使用不同的策略生成,而其他的字段完全一样,然后测试一下表的插入速度和查询速度:注:这里的随机key其实是指用雪花算法算出来的前后不连续不重复无规律的id:一串18位长度的long值id自动生成表:用户uuid表随机主

2020-09-06 20:26:57 252

原创 await,async详细介绍

一:背景1. 讲故事await,async 这玩意的知识点已经被人说的烂的不能再烂了,看似没什么好说的,但我发现有不少文章还是从理论上讲述了这两个语法糖的用法,懂得还是懂,不懂的看似懂了过几天又不懂了,人生如戏全靠记是不行的哈????????????,其实本质上来说 await, async 只是编译器层面上的语法糖,在 IL 层面都会被打成原型的,所以在这个层面上认识这两个语法糖是非常有必要的。二:从 IL 层面认识1. 使用 WebClient 下载为了方便打回原型,我先上一个例子,使用 we

2020-08-28 09:29:05 266

原创 java学习系列-Spring篇01:为何要学spring?

为什么需要学习spring?最大程度的简化了开发spring是一个非常优秀的java框架,其目标是为了简化java企业级开发,spring出来已经十几年了,这期间也一直围绕着这个目标在进行,像后面需要学习的springmvc、springboot、springcloud,这些技术也都是围绕着简化开发的目标在努力,到目前为止已经做的足够好了,可以说spring除了不能帮助我们实现业务逻辑代码之外,其他的事情spring都尽量去帮我们简化了,使用spring可以帮助我们节约大量开发时间。不使用spri

2020-08-23 12:05:27 257

原创 接口幂等性是什么?怎么实现?

什么是幂等性?对于同一笔业务操作,不管调用多少次,得到的结果都是一样的。幂等性设计我们以对接支付宝充值为例,来分析支付回调接口如何设计?如果我们系统中对接过支付宝充值功能的,我们需要给支付宝提供一个回调接口,支付宝回调信息中会携带(out_trade_no【商户订单号】,trade_no【支付宝交易号】),trade_no在支付宝中是唯一的,out_trade_no在商户系统中是唯一的。回调接口实现有以下实现方式。方式1(普通方式)过程如下:1.接收到支付宝支付成功请求2.根据trade_

2020-08-22 11:27:15 429

原创 数据库和缓存一致性推荐方式

数据存储在数据库中,为了加快业务访问的速度,我们将数据库中的一些数据放在缓存中,那么问题来了,如何确保db和缓存中数据的一致性呢?我们列出了5种方法,大家都了解一下,然后根据业务自己选择。方式1获取缓存逻辑使用过定时器,定时刷新redis中的缓存。db更新数据逻辑更新数据不用考虑缓存中的数据,直接更新数据就可以了存在的问题缓存中数据和db中数据一致性可能没有那么及时,不过最终在某个时间点,数据是一致的。方式2获取缓存逻辑c1:根据key在redis中获取对应的valuec2:如果val

2020-08-22 11:16:14 155

原创 SpringSecurity + JWT,从入门到精通

权限系统躲不开的概念,在Shiro和Spring Security之间,你一般选啥?在前后端分离的项目中,你知道怎么Spring security整合JWT么,来看看这篇文章哈!思维导图如下:RBAC 全称为基于角色的权限控制,本段将会从什么是 RBAC,模型分类,什么是权限,用户组的使用,实例分析等几个方面阐述 RBAC思维导图绘制思维导图如下什么是 RBACRBAC 全称为用户角色权限控制,通过角色关联用户,角色关联权限,这种方式,间阶的赋予用户的权限,如下图所示对于通常的系统而言,

2020-08-18 23:53:32 712

原创 30个Python极简代码,10分钟get常用技巧

1.重复元素判定以下方法可以检查给定列表是不是存在重复元素,它会使用 set() 函数来移除所有重复元素。def all_unique(lst):return len(lst)== len(set(lst))x = [1,1,2,2,3,2,3,4,5,6]y = [1,2,3,4,5]all_unique(x) # Falseall_unique(y) # True2.字符元素组成判定检查两个字符串的组成元素是不是一样的。from collections import Counter

2020-08-18 23:29:32 260

原创 高可用RocketMQ集群搭建

一、集群搭建可选方式RocketMQ的物理部署结构图如下:Producer和Consumer对应的是我们的应用程序,多个NameServer实例组成集群,但相互独立,没有信息交换,所以对于NameServer来说部署两个或两个以上即可保证高可用,对于Broker来说,我们可以选择以下几种集群部署方式:1.单Master模式这种方式风险较大,一旦Broker重启或者宕机时,会导致整个服务不可用。不建议线上环境使用,可以用于本地测试。2.多Master模式一个集群无Slave,全是Master,例

2020-08-18 23:25:08 381

原创 RabbitMQ高可用介绍

1.全局图HAproxy 来做 RabbitMQ 负载均衡和高可用,用 Keepalived 来保证 HAproxy 的高可用。客户端通过VIP建立通信链路;通信链路通过Keeaplived的Master节点路由到对应的HAProxy之上;HAProxy通过负载均衡算法将负载分发到集群中的各个节点之上。正常情况下客户端的连接通过图中左侧部分进行负载分发。当Keepalived的Master节点挂掉或者HAProxy挂掉无法恢复,那么Backup提升为Master,客户端的连接通过图中右侧部分进行负载分发

2020-08-18 23:10:12 169

原创 Nginx流控

流量限制(rate-limiting),是Nginx中一个非常实用,却经常被错误理解和错误配置的功能。我们可以用来限制用户在给定时间内HTTP请求的数量。请求,可以是一个简单网站首页的GET请求,也可以是登录表单的POST请求。流量限制可以用作安全目的,比如可以减慢暴力密码破解的速率。通过将传入请求的速率限制为真实用户的典型值,并标识目标URL地址(通过日志),还可以用来抵御DDOS攻击。更常见的情况,该功能被用来保护上游应用服务器不被同时太多用户请求所压垮。本篇文章将会介绍Nginx的 流量限制 的基

2020-08-18 22:57:46 193

转载 Spring Boot注解大全

一、注解(annotations)列表@SpringBootApplication:包含了@ComponentScan、@Configuration和@EnableAutoConfiguration注解。其中@ComponentScan让spring Boot扫描到Configuration类并把它加入到程序上下文。@Configuration 等同于spring的XML配置文件;使用Java代码可以检查类型安全。@EnableAutoConfiguration 自动配置。@ComponentS

2020-08-18 22:39:27 134

原创 Java 强、弱、软、虚,你属于哪一种?

Java中的四种引用Java中有四种引用类型:强引用、软引用、弱引用、虚引用。Java为什么要设计这四种引用Java的内存分配和内存回收,都不需要程序员负责,都是由伟大的JVM去负责,一个对象是否可以被回收,主要看是否有引用指向此对象,说的专业点,叫可达性分析。Java设计这四种引用的主要目的有两个:可以让程序员通过代码的方式来决定某个对象的生命周期;有利用垃圾回收。强引用强引用是最普遍的一种引用,我们写的代码,99.9999%都是强引用:Object o = new Obje

2020-08-18 22:18:19 127

原创 java学习系列-高并发33:学会使用JUC中常见的集合,常看看!

JUC集合框架图图可以看到,JUC的集合框架也是从Map、List、Set、Queue、Collection等超级接口中继承而来的。所以,大概可以知道JUC下的集合包含了一一些基本操作,并且变得线程安全。MapConcurrentHashMap功能和HashMap基本一致,内部使用红黑树实现的。特性:迭代结果和存入顺序不一致key和value都不能为空线程安全的ConcurrentSkipListMap内部使用跳表实现的,放入的元素会进行排序,排序算法支持2种方式来指定:通

2020-08-16 17:11:20 227

原创 java学习系列-高并发32:google提供的一些好用的并发工具类

guava maven配置 com.google.guava guava 27.0-jre### guava中常用几个类MoreExecutors:提供了一些静态方法,是对juc中的Executors类的一个扩展。Futures:也提供了很多静态方法,是对juc中Future的一个扩展。案例1:异步执行任务完毕之后回调package com.itsoku.chat34;import com.google.common.util.concurrent.Listenab

2020-08-16 17:10:58 412

原创 java学习系列-高并发31:怎么演示公平锁和非公平锁?

先理解一下什么是公平锁、非公平锁?公平锁和非公平锁体现在别人释放锁的一瞬间,如果前面已经有排队的,新来的是否可以插队,如果可以插队表示是非公平的,如果不可用插队,只能排在最后面,是公平的方式。示例测试公平锁和非公平锁的时候,可以这么来:在主线程中先启动一个t1线程,在t1里面获取锁,获取锁之后休眠一会,然后在主线中启动10个father线程去排队获取锁,然后在t1中释放锁代码的前面一步再启动一个线程,在这个线程内部再创建10个son线程,去获取锁,看看后面这10个son线程会不会排到上面10个fat

2020-08-16 17:10:31 144

原创 java学习系列-高并发30:JUC中工具类CompletableFuture,必备技能

CompletableFuture是java8中新增的一个类,算是对Future的一种增强,用起来很方便,也是会经常用到的一个工具类,熟悉一下。CompletionStage接口CompletionStage代表异步计算过程中的某一个阶段,一个阶段完成以后可能会触发另外一个阶段一个阶段的计算执行可以是一个Function,Consumer或者Runnable。比如:stage.thenApply(x -> square(x)).thenAccept(x -> System.out.pri

2020-08-16 17:10:11 191

原创 java学习系列-高并发29:JUC中原子类,一篇就够了

JUC中原子类介绍什么是原子操作?atomic 翻译成中文是原子的意思。在化学上,我们知道原子是构成一般物质的最小单位,在化学反应中是不可分割的。在我们这里 atomic 是指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰,所以,所谓原子类说简单点就是具有原子操作特征的类,原子操作类提供了一些修改数据的方法,这些方法都是原子操作的,在多线程情况下可以确保被修改数据的正确性。JUC中对原子操作提供了强大的支持,这些类位于java.util.concurren

2020-08-16 17:09:46 202

原创 java学习系列-高并发28:实战篇,微服务日志的伤痛,一并帮你解决掉

日志有什么用?系统出现故障的时候,可以通过日志信息快速定位问题,修复bug,恢复业务提取有用数据,做数据分析使用本文主要讨论通过日志来快速定位并解决问题。日志存在的痛点先介绍一下多数公司采用的方式:目前比较流行的是采用springcloud(或者dubbo)做微服务,按照业拆分为多个独立的服务,服务采用集群的方式部署在不同的机器上,当一个请求过来的时候,可能会调用到很多服务进行处理,springcloud一般采用logback(或者log4j)输出日志到文件中。当系统出问题的时候,按照系统故障

2020-08-15 13:22:17 250

原创 java学习系列-高并发05:深入理解进程和线程

进程进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。程序是指令、数据及其组织形式的描述,进程是程序的实体。进程具有的特征:动态性:进程是程序的一次执行过程,是临时的,有生命期的,是动态产生,动态消亡的并发性:任何进程都可以同其他进行一起并发执行独立性:进程是系统进行资源分配和调度的一个独立单位结构性:进程由程序,数据和进程控制块三部分组成我们经常使用windows系统,经常会看见.exe后缀的文件,双击这个.e

2020-08-15 13:11:36 143

原创 java学习系列-高并发27:高并发中计数器的实现方式有哪些?

需求:一个jvm中实现一个计数器功能,需保证多线程情况下数据正确性。我们来模拟50个线程,每个线程对计数器递增100万次,最终结果应该是5000万。我们使用4种方式实现,看一下其性能,然后引出为什么需要使用LongAdder、LongAccumulator。方式一:synchronized方式实现package com.itsoku.chat32;import java.util.ArrayList;import java.util.List;import java.util.concurr

2020-08-15 12:59:32 281

原创 java学习系列-高并发26:获取线程执行结果,这6种方法你都知道?

在一个线程中需要获取其他线程的执行结果,能想到几种方式?各有什么优缺点?结合这个需求,我们使用6种方式,来对之前学过的知识点做一个回顾,加深记忆。方式1:Thread的join()方法实现代码:package com.itsoku.chat31;import java.sql.Time;import java.util.concurrent.*;/** * */public class Demo1 { //用于封装结果 static class Result<

2020-08-15 12:49:25 374

原创 java学习系列-高并发25:高并发中常见的限流方式

常见的限流的场景秒杀活动,数量有限,访问量巨大,为了防止系统宕机,需要做限流处理国庆期间,一般的旅游景点人口太多,采用排队方式做限流处理医院看病通过发放排队号的方式来做限流处理。常见的限流算法通过控制最大并发数来进行限流使用漏桶算法来进行限流使用令牌桶算法来进行限流通过控制最大并发数来进行限流以秒杀业务为例,10个iphone,100万人抢购,100万人同时发起请求,最终能够抢到的人也就是前面几个人,后面的基本上都没有希望了,那么我们可以通过控制并发数来实现,比如并发数控制在10个

2020-08-15 11:58:21 223

原创 java学习系列-高并发24:实战篇,接口性能提升几倍原来这么简单

案例讲解电商app都有用过吧,商品详情页,需要给他们提供一个接口获取商品相关信息:商品基本信息(名称、价格、库存、会员价格等)商品图片列表商品描述信息(描述信息一般是由富文本编辑的大文本信息)数据库中我们用了3张表存储上面的信息:商品基本信息表:t_goods(字段:id【商品id】、名称、价格、库存、会员价格等)商品图片信息表:t_goods_imgs(字段:id、goods_id【商品id】、图片路径),一个商品会有多张图片商品描述信息表:t_goods_ext(字段:id,goo

2020-08-15 11:50:44 146

原创 java学习系列-高并发23:JUC底层工具类Unsafe,高手必须要了解

基本介绍最近我们一直在学习java高并发,java高并发中主要涉及到类位于java.util.concurrent包中,简称juc,juc中大部分类都是依赖于Unsafe来实现的,主要用到了Unsafe中的CAS、线程挂起、线程恢复等相关功能。所以如果打算深入了解JUC原理的,必须先了解一下Unsafe类。先上一幅Unsafe类的功能图:Unsafe是位于sun.misc包下的一个类,主要提供一些用于执行低级别、不安全操作的方法,如直接访问系统内存资源、自主管理内存资源等,这些方法在提升Ja

2020-08-15 11:44:08 232

原创 java学习系列-高并发22:java中的CAS,你需要知道的东西

我们需要解决的问题需求:我们开发了一个网站,需要对访问量进行统计,用户每次发一次请求,访问量+1,如何实现呢?下面我们来模仿有100个人同时访问,并且每个人对咱们的网站发起10次请求,最后总访问次数应该是1000次。实现访问如下。方式1代码如下:package com.itsoku.chat20;import java.util.concurrent.CountDownLatch;import java.util.concurrent.TimeUnit;/** * */publi

2020-08-15 11:24:56 135

原创 java学习系列-高并发21:JUC中的Executor框架详解2

需要解决的问题还是举个例子说明更好理解一些。买新房了,然后在网上下单买冰箱、洗衣机,电器商家不同,所以送货耗时不一样,然后等他们送货,快递只愿送到楼下,然后我们自己将其搬到楼上的家中。用程序来模拟上面的实现。示例代码如下:package com.itsoku.chat18;import java.util.concurrent.*;/** * */public class Demo12 { static class GoodsModel { //商品名称

2020-08-15 11:06:55 118

原创 java学习系列-高并发20:JUC中的Executor框架详解1

Executors框架介绍Executors框架是Doug Lea的神作,通过这个框架,可以很容易的使用线程池高效地处理并行任务。Excecutor框架主要包含3部分的内容:任务相关的:包含被执行的任务要实现的接口:Runnable接口或Callable接口任务的执行相关的:包含任务执行机制的核心接口Executor,以及继承自Executor的ExecutorService接口。Executor框架中有两个关键的类实现了ExecutorService接口(ThreadPoolExecutor和S

2020-08-15 11:00:05 138

原创 java学习系列-高并发19:掌握JUC中的阻塞队列

Queue接口队列是一种先进先出(FIFO)的数据结构,java中用Queue接口来表示队列。Queue接口中定义了6个方法:public interface Queue<E> extends Collection<E> { boolean add(e); boolean offer(E e); E remove(); E poll(); E element(); E peek();}每个Queue方法都有两种形式:(1)

2020-08-12 23:39:10 177

原创 java学习系列-高并发18:ThreadLocal、InheritableThreadLocal(通俗易懂)

需要解决的问题我们还是以解决问题的方式来引出ThreadLocal、InheritableThreadLocal,这样印象会深刻一些。目前java开发web系统一般有3层,controller、service、dao,请求到达controller,controller调用service,service调用dao,然后进行处理。我们写一个简单的例子,有3个方法分别模拟controller、service、dao。代码如下:package com.itsoku.chat24;import java.

2020-08-12 23:14:54 139

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除