自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(166)
  • 资源 (9)
  • 收藏
  • 关注

原创 优惠券秒杀(三)

保证一个用户只能抢一张券,则只要保证该用户下的优惠券只要一张,即根据优惠卷id和用户id查询是否已经下过这个订单,如果能够查询到结果,则表明下过该订单,不能再次下单,否则表示没有下过单,进行下单操作。存在问题:实现一人一单时,也存在线程安全问题,当多个线程携带的同一个用户id和同一个优惠券id时,此时该用户还没获取过该优惠券,则可能出现多线程问题,多个线程通过用户ID和优惠券ID可能查询不到订单,所以会有多个线程能够下单成功。乐观锁适合更新数据,现在需要时插入数据,所有我们需要使用悲观锁操作。

2023-07-28 13:23:42 161

原创 优惠券秒杀(二)

例如:线程1发送请求,查询库存,发现库存大于1,在还没来及扣除库存时,线程2甚至线程3等发送请求,发现这个数量也是大于1,那么这多个线程都会去扣除库存,最终多个线程都去扣除库存,此时就会出现库存的超卖问题。在数据库等中设置一个版本号字段,每次操作数据会对版本号进行加一操作,当每次读取数据时,读出版本号字段 ,在修改数据的时候,需要判断读出的版本号和数据库是否一致,如果一致,则表明在自己操作该数据的过程中,没有其他线程操作该数据,如果版本号不一致,则表明数据以及被别人修改过了。使用乐观锁解决库存超卖问题。

2023-07-27 17:16:14 158

原创 优惠券秒杀(一)

受单表数据量限制:随着订单的增加,mysql单表容量不宜超过500W,数据量过大时,需要进行拆库拆表,拆表之后,订单表在逻辑上讲,还是一张表,所有他们的id不能一样,而我们。id的规律性太明显:如果id具有很强规律性,用户等一些人很容易猜测出我们的一些敏感信息,例如商场一天内卖出多少单等,这样不合适。为了生成全局唯一ID,我们采用全局ID生成器,它是一种在分布式系统下用来生成全局唯一ID的工具。序列号:32bit,秒内的计数器,支持每秒生成2的32次方个不同ID。snowflake算法。

2023-07-20 08:17:12 135

原创 Redis实战——商户查询(三)

基于StringRedisTemplate封装一个缓存工具类- 将任意Java对象序列化为json并存储在string类型的key中,并且可以设置TTL过期时间- 将任意Java对象序列化为json并存储在string类型的key中,并且可以设置**逻辑过期时间**,用于处理缓存击穿问题- 根据指定的key查询缓存,并反序列化为指定类型,利用**缓存空值**的方式解决缓存穿透问题- 根据指定的key查询缓存,并反序列化为指定类型,需要利用**逻辑过期**解决缓存击穿问题- 根据指定的key查询缓

2023-07-06 16:05:09 169

原创 Redis实战——商户查询(二)

当客户端请求不存在的数据时,请求先经过redis,redis中没有该数据,则进行数据库访问,但是发现数据库中也没有该数据,因为数据库能够承受的并发量有限,若大量的请求访问的都是这种不存在的数据,则都会访问到数据库,对数据库的压力很大,而缓存空对象的解决方案就是不管数据库中被访问的数据存在还是不存在,都将该数据写入缓存中,不存在的写入缓存时,其value置空即可,这样,下次用户过来访问这个不存在的数据时,redis缓存中也能找到该数据,不会访问到数据库。如果布隆过滤器判断不存在,则直接返回。

2023-07-05 18:16:57 139

原创 Redis实战——商户查询(一)

应该先操作数据库,在删除缓存,因为我们先删除缓存,在操作数据库,假设两个线程并发访问时,线程1先进入,它先删除了缓存,还没操作数据库呢,线程2进来进行查询,它查询缓存数据并不存在,于是它从数据库中获取数据,并写入缓存,当线程2写入缓存后,线程1才完成数据库的更新操作,那么这个时候,数据库的数据是新数据,缓存的数据还是旧数据,会造成数据不一致问题。在没有缓存时,查询商户信息,我们直接操作从数据库中去进行查询,但是从数据库中查询肯定是个耗时操作。经综合考虑,一般采用方案一,采用方案一时,需要考虑的问题。

2023-07-04 14:03:32 106

原创 Redis实战——短信登录(一)

集群部署的tomcat又面临新的问题,即session共享问题,由于每个tomcat都有一份属于自己的session,某个用户第一次访问tomcat时,把自己的信息存放到了编号01的tomcat服务器的session中,当第二次访问时,没有访问01服务器,而是访问到了其他tomcat服务器,而其他tomcat服务器没有该用户存放的session,此时整个登录拦截都会出现问题。用户发送请求时,会从cookie中携带JsessionId到后台,后台通过JsessionId从session中获取用户信息,

2023-06-30 18:23:04 191

原创 Redis实战——短信登录(二)

在使用session时,每个用户都会有自己的session,这样虽然验证码的键都是“code”,但是相互不影响,从而确保每个用户获取到的验证码只能够自己使用,当使用redis时,redis的key是共享的,不分用户,就要求在redis中存储验证码时,不能直接将验证码的键设置为"code",这样无法保证其唯一性。因为设置了redis中存储的用户的有效期,所以在用户访问界面的时,需要更新token令牌的存活时间,例如修改LoginInterceptor拦截器,在此拦截器中刷新过期时间。修改Service层。

2023-06-30 14:17:41 2207

原创 Redis常见命令

sortedSet是一个可排序的set集合,与java种的TreeSet类似,但底层结构差别很大,sortedSet中的每个元素都带有一个score属性,可以基于score属性对元素排序,是通过调表加hash表实现的。经常用来实现排行榜等功能。redis没有类似mysql中的table的概念,该怎样区分不同类型的key呢?

2023-05-30 13:23:29 779

原创 Redis客户端介绍

redis安装完成后有自带的命令行客户端,即redis-cli,使用方式如下-p 6379-a xxxxxxcommondsping当使用-a参数时,会出现警告,所以建议通过auth参数指定密码,如下。

2023-05-26 17:08:30 1080

原创 安装Redis

redis安装,以及配置文件讲解,并设置开机自启动

2023-05-26 15:53:06 948

原创 安装Redis6

若需要将redis以后台方式启动,则必须修改redis配置文件,该配置文件在redis的安装包中,文件名为redis.conf,即刚才解压的包中(/usr/local/src/redis-6.2.6)的redis.conf。在该目录下,查看README.md文件,可以发现如下内容,即make install命令默认将redis安装到了/usr/local/bin下。redis是基于C语言编写的,因此首选需要安装redis所需的gcc依赖。redis-server:是redis的服务端启动脚本。

2023-05-26 15:51:32 1416

原创 Spring Boot 使用SSL-HTTPS

SpringBoot设置更安全的HTTPS请求

2023-05-17 17:45:14 498

原创 Spring Boot 使用SSL-HTTPS

HTTPS协议可以理解为HTTP+SSL/TLS,可以理解为HTTP下加入了SSL层,通过SSL证书来验证服务器的身份,并为浏览器和服务器之间的通信进行加密。SSL(Secure Socket Layer安全套接字层):SSL协议位于TCP/IP协议和应用层协议之间,为数据通讯提供安全支持。TLS(Transport Layer Security传输层安全):用于两个应用程序之间,提供保密性和数据完整性。通过编程方式配置HTTP connector,然后重定向到HTTPS connector。

2023-05-17 17:34:28 747

原创 Springboot APO面向切面编程

Springboot APO面向切面编程

2023-05-08 15:38:51 479

原创 Springboot整合Jasypt实战

Springboot整合Jasypt,完成配置文件数据库连接信息加密

2023-05-06 12:10:23 560

原创 java整合clamav完成文件查杀(Linux版)

java整合clamav完成文件查杀(Linux版)

2022-09-22 11:42:56 817 1

原创 java整合clamav完成文件查杀(Windows版)

java整合clamav完成文件查杀(Windows版)

2022-09-20 15:39:53 1667 4

原创 GDAL获取Hadoop hdfs tif文件信息(java)

GDAL获取Hadoop hdfs tif文件信息,对环境依赖比较大。

2022-06-24 10:39:19 576

原创 制作国产操作系统麒麟的docker基础镜像

制作国产操作系统麒麟的docker基础镜像

2022-06-22 17:27:42 3204 2

原创 银河麒麟操作系统上安装docker

银河麒麟操作系统上安装docker

2022-06-22 09:22:03 14580 9

原创 Docker安装Redis

安装Redis搜索镜像[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rzhPCEml-1641482818404)(C:\Users\liang\AppData\Roaming\Typora\typora-user-images\image-20211107223619507.png)]拉取镜像[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CNqhv7D4-1641482818421)(C:\Users\liang\AppDat

2022-01-10 23:02:31 88

原创 Docker安装tomcat

安装tomcat搜索镜像拉取镜像查看镜像启动镜像操作镜像欢迎关注本人微信公众号

2022-01-07 23:31:29 532

原创 Docker安装mysql

安装步骤安装mysql搜索镜像拉取镜像查看镜像启动镜像 命令说明: -p 12345:3306:将主机的12345端口映射到docker容器的3306端口。 --name mysql:运行服务名字 -v /zzyyuse/mysql/conf:/etc/mysql/conf.d :将主机/zzyyuse/mysql录下的conf/my.cnf 挂载到容器的 /etc/mysql/conf.d -v /zzyyuse/mysql/logs:/logs:将主

2022-01-06 21:01:41 105

原创 浅谈Dockerfile文件

DockerFiledockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。DockerFile构建过程解析Dockerfile内容基础知识每条保留字指令都必须为大写字母且后面要跟随至少一个参数指令按照从上到下顺序执行#表示注释每条指令都会创建一个新的镜像层,并对镜像进行提交Docker执行Dockerfile的大致流程docker从基础镜像运行一个容器执行一条指令并对容器做出修改执行类似docker commit的操作提交一个新的镜像层doc

2022-01-05 21:32:46 1517

原创 Docker容器数据卷

Docker容器数据卷容器具有隔离性,默认情况下,容器内应用产生的数据都是由容器本身独有,如果容器被删除,对应的数据文件就会跟着消失。从容器隔离性角度来看,数据和容器时共存亡的;但是在实际应用场景中,更多的是需要数据能够持久化,而且很多场景也需要容器间数据能够共享。手动存储数据手动存储数据有两种方式:命令拷贝和容器提交为镜像。命令拷贝容器和主机之间可以通过命令进行数据拷贝,在容器删除之前,可以先将容器中的数据拷贝下来。容器提交为镜像​ 通过将容器进行提交,制作为新的镜像

2021-12-29 21:54:59 831

原创 Docker重要容器命令

容器重要命令启动守护式容器docker run -d 镜像docker run -d image [command][arg...]使用centos:latest镜像,以后台模式启动一个容器docker run -d centos通过docker ps -a命令进行查看,会发现容器启动过,并且已经退出,其实在Docker中,容器运行的命令不是那些一直挂起的命令,就是会自动退出,这是Docker的机制问题。很重要的要说明的一点:Docker容器后台运行,就必须有一个前台进程。例如 正常情况下

2021-12-27 21:05:01 2140

原创 SpringBoot 在IDEA中实现热部署

热部署 Devtools添加devtools依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <version>2.5.4</version></dependency>添加插件<build> <plugins&

2021-12-23 21:55:33 155

原创 Docker常用容器命令

容器命令docker run 镜像名称docker run [options] image [command][arg...]命令参数OPTIONS说明–name为容器指定一个名称-d后台运行容器,并返回容器ID,即启动守护式容器-i以交互模式运行容器,通常与it同时使用-t为容器重新分配一个伪输入终端,通常与-i同时使用-P随机端口映射-p指定端口映射指定端口映射的四种方式: ip:hostPort:containerPort

2021-12-22 22:07:14 1134

原创 centos7环境Docker安装

1.Docker简介​ Docker是基于Go语言实现云开源项目,Docker的主要目标是“Build,Ship and Run Any App,Anywhere”,也就是通过对应用组件的封装、分发、部署、运行等生命周期的管理,使用户的APP(可以是一个WEB应用或数据库应用等等)及其运行环境能够做到“一次封装,到处运行”。​ Linux 容器技术的出现就解决了这样一个问题,而 Docker 就是在它的基础上发展过来的。将应用运行在 Docker 容器上面,而 Docker 容器在任何操作系统上都是

2021-12-21 23:04:58 805

原创 Docker常用命令

2.Docker常用命令2.1 帮助命令docker versiondocker infodocker --help开启Docker sudo systemctl start docker查看Docker状态 sudo systemctl status docker关闭Docker sudo systemctl stop docker 关闭Docker出现如下警告时: Warning: Stopping docker.service, but it can still be act

2021-12-20 17:02:31 2155

原创 Java-网络编程

计算机网络是通过传输介质、通信设施和网络通信协议,把各种网络设备互相连接起来,实现资源共享和数据传输的系统。网络编程是实现互联网上的多个设备之间进行数据传输网络协议网络协议是用来规定数据传输的规则,为了统一网络传输的标准,国际标准化组织定义了OSI模型(开放系统互联参考模型),但由于OSI模型的协议比较复杂,所以并没有得到广泛的应用,而在实际应用中一般采用TCP/IP模型。网络通信的要素ip地址端口号 端口分类: 公有端口 0~1023 H

2020-11-25 21:39:26 225 4

原创 基本DOS命令

打开CMD的方式Win7图标 – 所有程序 – 附件 – 命令提示符(win7); 开始 – 系统 – 命令提示符(win10)。Win键+R 运行的打开输入框输入cmd回车即可。在任意文件夹下面,通过 Shift + 鼠标右键, 点击在此处打开命令行窗口。资源管理器的地址栏前面输入 cmd 需要打开的路径 回车后可打开。常用的DOS命令盘符切换:输入盘符 + :查看当前目录下所有文件切换目录(change directory)

2020-11-19 16:39:41 153

原创 最简单的B树——2-3树

由于2-3树属于B树,那么B树的所有叶子节点都在同一层这个条件它也是满足的;2-3树之所以叫2-3树,主要是由于其构成是由二节点和三节点构成。二节点:有两个子节点的节点叫二节点,二节点要么没有子节点,要么有两个子节点;三节点:有三个子节点的节点叫三节点,三节点要么没有子节点,要么有三个子节点;根据2-3插入规则构建2-3树插入规则:除了上述规则外:需要注意的是2-3树的值大小依然遵循二叉排序树的规则。此处特别需要注意的是该节点满时,对于节点的拆分。...

2020-09-20 21:15:38 988 1

原创 和为S的两个数

题目输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。分析先确定一个数,再依次判断数组中剩余的数字与它的和是不是等于s,若等于s则返回这两个数。代码public class Solution { public static void main(String[] args) { int[] arr = {10,26,30,31,47,60}; int[] arrayList = two

2020-09-13 13:54:30 130

原创 两个链表的第一个公共节点

题目输入两个链表,找出它们的第一个公共节点。分析代码class ListNode{ public int data; public ListNode next; public ListNode(int data) { this.data = data; } @Override public String toString() { return "ListNode{" + "data=

2020-09-11 11:15:45 115

原创 1~n整数中1出现的次数(整数中1出现的次数)

题目输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。分析public class Solution { public static void main(String[] args) { System.out.println(countDigitOne(12)); } /** * 1~n整数中1出现的次数 * @param n

2020-09-10 17:21:17 1270

原创 数组中出现次数超过一半的数字

题目数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。分析代码public class Solution { public static void main(String[] args) { int[] arr = {1, 2, 3, 2, 5}; System.out.println(

2020-09-08 11:16:26 518

原创 栈的压入、弹出序列

题目输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。分析总结上述过程,则可得到以下规律:如果下一个弹出的数字刚好是栈顶数字,那么直接弹出;如果下一个弹出的数值不是栈顶数字,则把压栈序列中还没有入栈的数字压入辅助栈,直到把下一个需要弹出的数字压入栈顶位置;如果所

2020-09-07 16:29:07 120

原创 反转链表

题目定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。分析代码class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } @Override public String toString() { return "ListNode1{" + "val="

2020-09-06 16:38:42 103

我的第一本算法书

《我的第一本算法书》没有枯燥的理论和复杂的公式,而是通过大量的步骤图帮助读者加深对数据结构 原理和算法执行过程的理解,便于学习和记忆。

2019-02-20

Computing Euler angles from a rotation matrix

通过当前的旋转矩阵计算出当前这个旋转矩阵对应的三个轴的旋转角度

2018-05-02

精通Python设计模式

精通Python设计模式讲述了16种基本设计模式,轻松解决软件设计常见问题;借力高效的Python语言,用现实例子展示各模式关键特性。

2018-02-05

计算机网络:自顶向下方法

本书采用了独创的自顶向下方法,即从应用层开始沿协议栈向下讲解计算机网络的基本原理,强调应用层范例和应用编程接口,内容深入浅出,注重教学方法,理论与实践相结合

2018-02-03

计算机网络高级软件编程技术

计算机网络高级软件编程技术介绍了计算机网络课程内容、编程训练目的与教学指导、Ethernet帧结构解析程序、IP包流量分析程序、FTP协议实现程序等

2018-02-03

《白帽子讲Web安全》.pdf

《白帽子讲web安全》是根据作者若干年实际工作中积累下来的丰富经验而写成的,在解决方案上具有极强的可操作性,深入分析了各种错误的解决方案与误区

2018-02-03

笨办法学 Python.pdf

笨办法学 Python是Zed Shaw 编写的一本Python入门书籍。适合对计算机了解不多,没有学过编程,但对编程感兴趣的朋友学习使用。

2018-02-02

Dive Into Python 3 中文版.pdf

Dive Into Python 3 中文版.pdf 如果需要英文的也可以联系我

2018-01-09

空空如也

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

TA关注的人

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