- 博客(76)
- 收藏
- 关注
原创 Redis 基础 - 优惠券秒杀《初步优化(异步秒杀)》
Redis基础 - 基本类型及常用命令Redis基础 - Java客户端Redis 基础 - 短信验证码登录Redis 基础 - 用Redis查询商户信息Redis 基础 - 优惠券秒杀《非集群》Redis 基础 - 优惠券秒杀《分布式锁(初级)》Redis 基础 - 优惠券秒杀《分布式锁(使用Redisson)》Redis优化秒杀回顾秒杀业务的流程前端发起请求,到达Nginx,Nginx会把请求负载均衡到Tomcat,在Tomcat内部的业务流程是,根据优惠券id查询优惠券->判断
2022-05-30 20:18:44 393
原创 Redis 基础 - 优惠券秒杀《分布式锁(使用Redisson)》
Redis基础 - 基本类型及常用命令Redis基础 - Java客户端Redis 基础 - 短信验证码登录Redis 基础 - 用Redis查询商户信息Redis 基础 - 优惠券秒杀《非集群》Redis 基础 - 优惠券秒杀《分布式锁(初级)》基于setnx实现的分布式锁存在的问题1)不可重入同一个线程无法多次获取同一把锁2)不可重试获取锁只尝试一次就返回false,没有重试机制3)超时释放锁超时释放虽然可以避免死锁,但如果是业务执行耗时较长,也会导致锁释放,存在安全隐患4)主
2022-05-26 20:21:58 647
原创 Redis 基础 - 优惠券秒杀《分布式锁(初级)》
参考Redis基础 - 基本类型及常用命令Redis基础 - Java客户端Redis 基础 - 短信验证码登录Redis 基础 - 用Redis查询商户信息Redis 基础 - 优惠券秒杀《非集群》synchronized在集群上使用时的问题synchronized只能够保证一个JVM内部的多个线程之间的互斥,而无法在集群之间互斥,要想解决这个问题必须要使用分布式锁。分布式锁是满足分布式系统或集群模式下“多进程可见”并且能“互斥”的锁。为何需要分布式锁比如有两个JVM,JVM1和JVM2
2022-05-24 21:06:36 303
原创 JVM 直接内存
直接内存 Direct Memory直接内存不是JVM里的内存,而是操作系统里的内存。(1)常见于NIO操作时,用于数据缓冲区(比如ByteBuffer使用的是直接内存)(2)分配、回收成本较高,但读写性能高// 演示ByteBuffer作用public class Demo { static final String FORM = "D:\\asd\\asd.mp4";// 选的是比较大的文件,比如200多兆 static final String TO = "D:\\asd.mp4";
2022-05-23 20:44:18 1693
原创 JVM 方法区 - 常量池(2)StringTable
JVM 方法区 - 常量池(1)概念StringTable(串池)是运行时常量池中的重要部分。public class Demo { public static void main(String[] args) { String s1 = "a"; String s2 = "b"; String s3 = "a" + "b"; }}假设有这段代码,先编译,编译成字节码以后,再通过反编译,查看他的常量池到底长什么样子。javap -v Demo.class在输出的一堆人类可看
2022-05-22 11:25:32 415
原创 Redis 基础 - 优惠券秒杀《非集群》
参考Redis基础 - 基本类型及常用命令Redis基础 - Java客户端Redis 基础 - 短信验证码登录Redis 基础 - 用Redis查询商户信息摘要用Redis生成保证唯一性的订单id代码示例1~代码示例8是优惠券秒杀简单代码的修改过程,可以加深印象,还可以巩固基础知识本文仅限于非集群模式的场景关于订单id当商铺发优惠券后,大量用户就会去抢购。抢购后,就会生成订单,并插入到订单表。当使用数据表自增主键做订单id时id的规律性太明显比如某用户今天下单后,其订单号
2022-05-20 21:01:16 457
原创 Redis 基础 - 用Redis查询商户信息
请参考Redis基础 - 基本类型及常用命令Redis基础 - Java客户端Redis 基础 - 短信验证码登录本文摘要本文是Redis缓存的简单应用,以根据id查询商户信息为例,先简单介绍基本使用。接着根据缓存更新策略对代码实例进行简单修改。最后再简单介绍缓存穿透、缓存雪崩、缓存击穿的问题以及代码修改。Redis缓存简单应用缓存是存储数据的临时地方,一般读写性能较好。前端请求时,先到达Redis。查看有无数据,有则直接返回。没有时才会去数据库查。能大大减轻数据库的压力。当然,查数据库后,
2022-05-18 21:35:44 496
原创 Redis 基础 - 短信验证码登录
本文摘要先简单列出用session方式,然后简单换为用Redis的方式,并最后通过优化来解决一些小问题。基于session实现短信登陆的简单流程发送验证码前端把手机号传给服务端,后端经过校验后,生成验证码并存入到session中,并通过第三方平台给用户手机发短信验证码。登陆/注册前端把登陆用的手机号和刚才接收的验证码传给服务端,后端经过校验后,若没毛病就用手机号去查用户表,没有用户的话给他注册,若有用户,就算是登陆成功。注册/登陆成功后,把用户的部分信息(除去敏感信息)放到session中。1
2022-05-16 21:48:17 2014
原创 JVM 方法区 - 常量池(1)
概念方法区是所有Java虚拟机线程共享的区域(这点跟堆有点像),这里存储了跟类的结构相关的一些信息,比如成员变量、方法数据以及成员方法、构造方法的代码部分,还有特殊方法(主要是指类的构造器)。因此可看出来,方法区存的是跟类相关的一些信息,还有运行时常量池。方法区是在虚拟机启动时被创建,方法区在逻辑上是堆的组成部分(可以理解为他在概念上定义了方法区,但是具体不同的JVM厂商去实现方法区时,不一定遵从这种逻辑上的定义,实际上是不是堆的一部分,不同的JVM厂商实现方式上是不一样的),这个规范并不强制你这个方法
2022-05-14 11:16:05 727
原创 Redis基础 - Java客户端
在Redis官网中提供了各种语言的客户端。地址:https://redis.io/clients前三名客户端是jedis、lettuce、redisson。jedis:以Redis命令作为方法名称,学习成本低,简单实用。但是jedis实例是线程不安全的,所以每个线程都要建立单独的jedis势力,所以多线程环境下需要基于连接池来使用。lettuce:是基于netty实现的,支持同步、异步和响应式编程方式,并且是线程安全的。支持Redis的哨兵模式、集群模式和管道模式。redisson:是一个基于Re
2022-05-13 22:54:00 335
原创 Redis基础 - 基本类型及常用命令
Redis数据结构介绍Redis是一个key-value的数据库,key一般是string类型,不过value的类型多种多样:string《 hello world 》Hash《 {name: “jack”, age: 12} 》List 《 [A -> B -> C -> C] 》Set 《 {A, B, C} 》SortedSet 《 {A: 1, B: 2, C: 3} 》GEO 《 {A: (120.3, 30.5)} 》BitMap 《 011101010101
2022-05-13 22:28:02 656
原创 Redis基础 - 安装
centOS7 安装Redis安装Redis依赖Redis是基于C语言编写的,因此首先需要安装Redis所需要的gcc依赖。yum install -y gcc tcl上传安装包并解压把Windows本地下载的Redis安装包(如:redis-6.2.6.tar.gz)上传到Linux的任意目录(如:/usr/local/src/),因为这个目录一般放安装文件。进入该目录cd /usr/local/src/解压安装包tar -zxvf redis-6.2.6.tar.gz解压后出现
2022-05-13 21:54:18 318
原创 JVM 堆
定义像程序计数器、本地方法栈、虚拟机栈都是线程私有的,而堆(Heap)、方法区都是线程共享的区域。通过new关键字创建的对象都会使用堆内存。特点它是线程共享的,堆中对象都需要考虑线程安全的问题。有垃圾回收机制,即堆中不再被引用的对象就会当成垃圾进行回收,已释放空闲的内存,这样不至于堆被创建的对象给撑爆。堆内存溢出堆内存有垃圾回收器,为何还会存在堆内存溢出问题呢?比如,对象被当做垃圾回收的条件是这个对象没人再使用他,但是如果不断的产生对象,而产生的这些新对象仍然有人在使用他呢?是不是意味着
2022-05-13 21:25:16 158
原创 JVM 栈
栈的数据结构先进后出Java虚拟机栈的概念英文全称是Java virtual machine stacks。比如,Java中每个线程运行的时候,需要给每个线程划分一个内存空间。虚拟机栈其实是线程运行时需要的内存空间。一个线程,就需要一个栈,如果是多个线程,就需要多个虚拟机栈。栈内由什么组成一个栈内,可以看做是由多个栈帧组成,比如,一些元素要放入栈的话,这些元素都称之为栈帧。什么是栈贞一个栈帧对应着一次方法的调用。因为线程最终是为了要执行代码的,这些代码又是由一个个的方法组成的,所以线程运行的时
2022-05-12 21:26:59 1190
原创 JVM 程序计数器
概念程序计数器的英文全称是Program Counter Register,又叫程序计数寄存器。Register的命名源于CPU的寄存器,寄存器存储指令相关的现场信息。CPU只有把数据装载到寄存器才能够运行。JVM中的PC寄存器是对物理PC寄存器的一种抽象模拟。即在物理上实现程序计数器是通过一个叫寄存器来实现的,我们的程序计数器是Java对物理硬件的屏蔽和抽象,他在物理上是通过寄存器来实现的。寄存器可以说是整个CPU组件里读取速度最快的一个单元,因为读取/写指令地址这个动作是非常频繁的。所以Java虚拟
2022-05-11 12:11:57 3258
原创 排序算法 - 插入排序(Insertion Sort)
插入排序插入式排序属于内部排序法, 是对于欲排序的元素以插入的方式找寻该元素的适当位置, 以达到排序的目的。* 插入排序的问题: 当需要排序的数组中小值越靠后, 就会循环判断次数越多(希尔排序是插入排序的优化版本, 又称缩小增量排序)插入排序的演变过程(从小到大)把 n 个待排序的元素看成为一个有序表和一个无序表,开始时有序表中只包含一个元素, 无序表中包含有 n-1 个元素, 排序过程中每次从无序表中取出第一个元素, 把它的排序码依次与有序表元素的排序码进行比较, 将它插入到有序表中的适当位置
2020-12-23 15:49:27 187
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人