- 博客(167)
- 资源 (9)
- 收藏
- 关注
原创 优惠券秒杀(三)
保证一个用户只能抢一张券,则只要保证该用户下的优惠券只要一张,即根据优惠卷id和用户id查询是否已经下过这个订单,如果能够查询到结果,则表明下过该订单,不能再次下单,否则表示没有下过单,进行下单操作。存在问题:实现一人一单时,也存在线程安全问题,当多个线程携带的同一个用户id和同一个优惠券id时,此时该用户还没获取过该优惠券,则可能出现多线程问题,多个线程通过用户ID和优惠券ID可能查询不到订单,所以会有多个线程能够下单成功。乐观锁适合更新数据,现在需要时插入数据,所有我们需要使用悲观锁操作。
2023-07-28 13:23:42
267
原创 优惠券秒杀(二)
例如:线程1发送请求,查询库存,发现库存大于1,在还没来及扣除库存时,线程2甚至线程3等发送请求,发现这个数量也是大于1,那么这多个线程都会去扣除库存,最终多个线程都去扣除库存,此时就会出现库存的超卖问题。在数据库等中设置一个版本号字段,每次操作数据会对版本号进行加一操作,当每次读取数据时,读出版本号字段 ,在修改数据的时候,需要判断读出的版本号和数据库是否一致,如果一致,则表明在自己操作该数据的过程中,没有其他线程操作该数据,如果版本号不一致,则表明数据以及被别人修改过了。使用乐观锁解决库存超卖问题。
2023-07-27 17:16:14
241
原创 优惠券秒杀(一)
受单表数据量限制:随着订单的增加,mysql单表容量不宜超过500W,数据量过大时,需要进行拆库拆表,拆表之后,订单表在逻辑上讲,还是一张表,所有他们的id不能一样,而我们。id的规律性太明显:如果id具有很强规律性,用户等一些人很容易猜测出我们的一些敏感信息,例如商场一天内卖出多少单等,这样不合适。为了生成全局唯一ID,我们采用全局ID生成器,它是一种在分布式系统下用来生成全局唯一ID的工具。序列号:32bit,秒内的计数器,支持每秒生成2的32次方个不同ID。snowflake算法。
2023-07-20 08:17:12
196
原创 Redis实战——商户查询(三)
基于StringRedisTemplate封装一个缓存工具类- 将任意Java对象序列化为json并存储在string类型的key中,并且可以设置TTL过期时间- 将任意Java对象序列化为json并存储在string类型的key中,并且可以设置**逻辑过期时间**,用于处理缓存击穿问题- 根据指定的key查询缓存,并反序列化为指定类型,利用**缓存空值**的方式解决缓存穿透问题- 根据指定的key查询缓存,并反序列化为指定类型,需要利用**逻辑过期**解决缓存击穿问题- 根据指定的key查询缓
2023-07-06 16:05:09
233
原创 Redis实战——商户查询(二)
当客户端请求不存在的数据时,请求先经过redis,redis中没有该数据,则进行数据库访问,但是发现数据库中也没有该数据,因为数据库能够承受的并发量有限,若大量的请求访问的都是这种不存在的数据,则都会访问到数据库,对数据库的压力很大,而缓存空对象的解决方案就是不管数据库中被访问的数据存在还是不存在,都将该数据写入缓存中,不存在的写入缓存时,其value置空即可,这样,下次用户过来访问这个不存在的数据时,redis缓存中也能找到该数据,不会访问到数据库。如果布隆过滤器判断不存在,则直接返回。
2023-07-05 18:16:57
184
原创 Redis实战——商户查询(一)
应该先操作数据库,在删除缓存,因为我们先删除缓存,在操作数据库,假设两个线程并发访问时,线程1先进入,它先删除了缓存,还没操作数据库呢,线程2进来进行查询,它查询缓存数据并不存在,于是它从数据库中获取数据,并写入缓存,当线程2写入缓存后,线程1才完成数据库的更新操作,那么这个时候,数据库的数据是新数据,缓存的数据还是旧数据,会造成数据不一致问题。在没有缓存时,查询商户信息,我们直接操作从数据库中去进行查询,但是从数据库中查询肯定是个耗时操作。经综合考虑,一般采用方案一,采用方案一时,需要考虑的问题。
2023-07-04 14:03:32
151
原创 Redis实战——短信登录(一)
集群部署的tomcat又面临新的问题,即session共享问题,由于每个tomcat都有一份属于自己的session,某个用户第一次访问tomcat时,把自己的信息存放到了编号01的tomcat服务器的session中,当第二次访问时,没有访问01服务器,而是访问到了其他tomcat服务器,而其他tomcat服务器没有该用户存放的session,此时整个登录拦截都会出现问题。用户发送请求时,会从cookie中携带JsessionId到后台,后台通过JsessionId从session中获取用户信息,
2023-06-30 18:23:04
244
原创 Redis实战——短信登录(二)
在使用session时,每个用户都会有自己的session,这样虽然验证码的键都是“code”,但是相互不影响,从而确保每个用户获取到的验证码只能够自己使用,当使用redis时,redis的key是共享的,不分用户,就要求在redis中存储验证码时,不能直接将验证码的键设置为"code",这样无法保证其唯一性。因为设置了redis中存储的用户的有效期,所以在用户访问界面的时,需要更新token令牌的存活时间,例如修改LoginInterceptor拦截器,在此拦截器中刷新过期时间。修改Service层。
2023-06-30 14:17:41
2258
原创 Redis常见命令
sortedSet是一个可排序的set集合,与java种的TreeSet类似,但底层结构差别很大,sortedSet中的每个元素都带有一个score属性,可以基于score属性对元素排序,是通过调表加hash表实现的。经常用来实现排行榜等功能。redis没有类似mysql中的table的概念,该怎样区分不同类型的key呢?
2023-05-30 13:23:29
845
原创 Redis客户端介绍
redis安装完成后有自带的命令行客户端,即redis-cli,使用方式如下-p 6379-a xxxxxxcommondsping当使用-a参数时,会出现警告,所以建议通过auth参数指定密码,如下。
2023-05-26 17:08:30
1172
原创 安装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
1636
原创 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
890
原创 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
124
原创 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
131
原创 浅谈Dockerfile文件
DockerFiledockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。DockerFile构建过程解析Dockerfile内容基础知识每条保留字指令都必须为大写字母且后面要跟随至少一个参数指令按照从上到下顺序执行#表示注释每条指令都会创建一个新的镜像层,并对镜像进行提交Docker执行Dockerfile的大致流程docker从基础镜像运行一个容器执行一条指令并对容器做出修改执行类似docker commit的操作提交一个新的镜像层doc
2022-01-05 21:32:46
1613
原创 Docker容器数据卷
Docker容器数据卷容器具有隔离性,默认情况下,容器内应用产生的数据都是由容器本身独有,如果容器被删除,对应的数据文件就会跟着消失。从容器隔离性角度来看,数据和容器时共存亡的;但是在实际应用场景中,更多的是需要数据能够持久化,而且很多场景也需要容器间数据能够共享。手动存储数据手动存储数据有两种方式:命令拷贝和容器提交为镜像。命令拷贝容器和主机之间可以通过命令进行数据拷贝,在容器删除之前,可以先将容器中的数据拷贝下来。容器提交为镜像 通过将容器进行提交,制作为新的镜像
2021-12-29 21:54:59
917
原创 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
2207
原创 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
200
原创 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
1174
原创 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
915
原创 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
2193
原创 Java-网络编程
计算机网络是通过传输介质、通信设施和网络通信协议,把各种网络设备互相连接起来,实现资源共享和数据传输的系统。网络编程是实现互联网上的多个设备之间进行数据传输网络协议网络协议是用来规定数据传输的规则,为了统一网络传输的标准,国际标准化组织定义了OSI模型(开放系统互联参考模型),但由于OSI模型的协议比较复杂,所以并没有得到广泛的应用,而在实际应用中一般采用TCP/IP模型。网络通信的要素ip地址端口号 端口分类: 公有端口 0~1023 H
2020-11-25 21:39:26
310
4
原创 基本DOS命令
打开CMD的方式Win7图标 – 所有程序 – 附件 – 命令提示符(win7); 开始 – 系统 – 命令提示符(win10)。Win键+R 运行的打开输入框输入cmd回车即可。在任意文件夹下面,通过 Shift + 鼠标右键, 点击在此处打开命令行窗口。资源管理器的地址栏前面输入 cmd 需要打开的路径 回车后可打开。常用的DOS命令盘符切换:输入盘符 + :查看当前目录下所有文件切换目录(change directory)
2020-11-19 16:39:41
205
原创 最简单的B树——2-3树
由于2-3树属于B树,那么B树的所有叶子节点都在同一层这个条件它也是满足的;2-3树之所以叫2-3树,主要是由于其构成是由二节点和三节点构成。二节点:有两个子节点的节点叫二节点,二节点要么没有子节点,要么有两个子节点;三节点:有三个子节点的节点叫三节点,三节点要么没有子节点,要么有三个子节点;根据2-3插入规则构建2-3树插入规则:除了上述规则外:需要注意的是2-3树的值大小依然遵循二叉排序树的规则。此处特别需要注意的是该节点满时,对于节点的拆分。...
2020-09-20 21:15:38
1070
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
165
原创 两个链表的第一个公共节点
题目输入两个链表,找出它们的第一个公共节点。分析代码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
163
原创 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
1465
原创 数组中出现次数超过一半的数字
题目数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为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
561
原创 栈的压入、弹出序列
题目输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。分析总结上述过程,则可得到以下规律:如果下一个弹出的数字刚好是栈顶数字,那么直接弹出;如果下一个弹出的数值不是栈顶数字,则把压栈序列中还没有入栈的数字压入辅助栈,直到把下一个需要弹出的数字压入栈顶位置;如果所
2020-09-07 16:29:07
155
计算机网络:自顶向下方法
2018-02-03
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人