基于 springBoot 实现webSocket方式的扫码登录
一、首先咱们需要一张表这表是干啥的呢?就是记录一下谁扫码了。谁登录了。
User_Token表
字段如下:
uuid : 用于确保唯一性
userId :谁登录的
loginTime :登录时间
createTime :创建时间 用于判断是否过期
state:是否二维码失效 0有效 1失效
二、角色都有哪些咱们还需要分析一下子。扫码登录这个业务逻辑都有哪些角色
android端 or 微信Web端 :扫码
PC端 :被扫。登录
服务端:掌控全局,提供接口。
三、接口都需要哪些?有了角色。你用大腿也能想出来接口了对不对!!
所以咱们的接口有2个!
生成二维码接口:生成一个二维码。二维码中有UUID。
确认身份接口:确定身份以及判断是否二维码过期等
四、步骤那句话怎么说的来着。要把大象装冰箱一共分几步?
PC端打开。调用生成二维码接口 并与 服务端建立链接。链接使用uuid进行绑定
微信Web端进行扫码。获取二维码中的uuid。
微信Web端拿到uuid以后。显示是否登录页面。点击确定后 调用 确认身份接口。
确认身份接口通过以后。服务端给PC端发送信息。完成登录。此时链 ...
Java8 中 List 转 Map(Collectors.toMap)
使用 Java8 特性1userList.stream().collect(Collectors.toMap(User::getId, User::getName));
当然,如果希望得到 Map 的 value 为对象本身时,可以这样写:
1userList.stream().collect(Collectors.toMap(User::getId, t -> t));
关于 Collectors.toMap 方法Collectors.toMap 有三个重载方法:
1234567toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper);toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper, BinaryOperator<U> me ...
线程池之ThreadPoolExecutor
ThreadPoolExecutor提供了四个构造方法:
12345678public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) { this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, Executors.defaultThreadFactory(), defaultHandler); }
123456789public ThreadPoolExecutor(int corePoolSiz ...
高并发之查询并更新原子问题
场景:在日常开发中经常遇到先根据条件判断某条数据是否存在,如果不存在的话就插入,如果存在的话就更新或提示异常。一般代码的模式都写成下面这个样子,是一种很常见的写法,但是在并发情况下很容易会重复插入两条数据,大概的情况就是第一个请求进来,没有查询到该用户通过了if判断,但是if中有比较耗时的逻辑,在第一个请求还没执行insert的时候第二个请求也进来了,因为这个时候第一个请求还没执行insert操作,所以第二个请求也没有查询到该用户也通过了if判断,这个样子就造成了两条重复的数据。
12345678910// 查询名字叫user1的用户是否存在UserVo userVo= userMapper.selectUserByName("user1"); // 如果不存在就插入数据 if (userVo==null) { Thread.sleep(10000); UserVo userVo = new UserVo(); userVo.setUserName("user1"); ...
架构—秒杀系统优化思路
秒杀系统优化思路
转载:架构之师
一、秒杀业务为什么难做
im系统,例如qq或者微博,每个人都读自己的数据(好友列表、群列表、个人信息);
微博系统,每个人读你关注的人的数据,一个人读多个人的数据;
秒杀系统,库存只有一份,所有人会在集中的时间读和写这些数据,多个人读一个数据。
例如:小米手机每周二的秒杀,可能手机只有1万部,但瞬时进入的流量可能是几百几千万。又例如:12306抢票,票是有限的,库存一份,瞬时流量非常多,都读相同的库存。读写冲突,锁非常严重,这是秒杀业务难的地方。那我们怎么优化秒杀业务的架构呢?
二、优化方向优化方向有两个(今天就讲这两个点):(1)将请求尽量拦截在系统上游(不要让锁冲突落到数据库上去)。传统秒杀系统之所以挂,请求都压倒了后端数据层,数据读写锁冲突严重,并发高响应慢,几乎所有请求都超时,流量虽大,下单成功的有效流量甚小。以12306为例,一趟火车其实只有2000张票,200w个人来买,基本没有人能买成功,请求有效率为0。
(2)充分利用缓存,秒杀买票,这是一个典型的读多写少的应用场景,大部分请求是车次查询,票查询,下单和支付才是写请求。一趟火车其实只 ...
Java中针对List集合(交集/并集/差集)和数组的Lambda操作
Lambda实现Java List的交集/并集/差集/去重复并集
经常记不住,只能写下来了!!!
1.8之前交、并集采用简单的 removeAll retainAll 等操作
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152import static java.util.stream.Collectors.toList;import java.util.ArrayList;import java.util.List;public class Test { public static void main(String[] args) { List<String> list1 = new ArrayList(); list1.add("1111"); list1.add("2222"); ...
Spring Cloud版本号
序Spring Cloud使用的版本号是英文方式,而不是传统的数字版本,为什么呢。因为Spring Cloud是微服务的解决方案,他会有很多子项目,每个子项目都维护这自己的版本号,为了避免冲突,就使用了伦敦地铁站的名字作为版本号。以首字母作为顺序,a,b,c,d….排列。
说明现有版本号:Angel、Brixton、Camden、Daston、Edgware、Finchley、GreenWich、Hoxton。
扩展常见版本号说明
例如 2.1.13.RELEASE
其中Release的意思是最终版本,除此之外:
Base:设计阶段。只有相应的设计没有具体的功能实现。
Alpha:软件的初级版本。基本功能已经实现,但存在较多的bug。
Bate:相对于Alpha已经有了很大的进步,消除了严重的BUG,但还存在一些潜在的BUG,还需要不断测试。
RELEASE:最终版本,没有太大的问题。
Spring Cloud 版本后缀
BUILD-XXX 开发版 开发团队内部使用,不是很稳定
GA 稳定版 相比于开发版,基本上可以使用了
PRE(M1 ...
MinIO-炒鸡好用的网盘+文件服务器
简介
MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。MinIO是一个非常轻量的服务,可以很简单的和其他应用的结合,类似 NodeJS, Redis 或者 MySQL
优点
支持分布式存储,具备高扩展性、高可用性
部署简单但功能丰富 通过 docker 方式部署
官方的文档也很详细 MinIO
部署方式多样性(单机部署,分布式部署)
部署推荐使用 docker 一键安装:
1234567docker run -it -p 9000:9000 --name minio \-d --restart=always \-e "MINIO_ACCESS_KEY=admin" \-e "MINIO_SECRET_KEY=12345678" \-v /data/minio/data:/data \-v /data/minio/confi ...
EasyPoi导出字段为超链接
看文档 http://easypoi.mydoc.io/步骤一
字段上面开启超链接12@Excel(name = "地址", isHyperlink = true)private String path;
步骤二
实现拦截类
代码实现
123456789public class ExcelDataHandler extends ExcelDataHandlerDefaultImpl<Object> { @Override public Hyperlink getHyperlink(CreationHelper creationHelper, Object obj, String name, Object value) { Hyperlink hyperlink = creationHelper.createHyperlink(HyperlinkType.URL); hyperlink.setLabel(name); hyperlink.setAddress((String ...
记录IDEA的关于数据库连接问题
序今天更新了IDEA,更新到2020.1.1,发现了两个关于数据库问题。
1. IDEA 数据库连接,密码不保存,重复输入问题
明明是永远save,就是不起作用,每次重启IDEA都要输入。
解答:在IDEA File—>Setting—>搜索In KeePass,然后勾选即可。
2. IDEA 数据库连接上,mapper.xml文件中sql的表名和字段,不能点击问题解答:
首先连接数据源
File->Settings->Languages&Frameworks->SQL Resolution Scopes 勾选所有数据源
File->Settings->Languages&Frameworks->SQL Dialects -> 全局和项目选择MySQL
OK,解决!