Redis应用(2)——Redis的项目应用(一):验证码 ---> UUID到雪花ID JMeter高并发测试 下载安装使用

目录

  • 引出
  • Redis的项目应用(一):验证码
    • 1.整体流程
    • 2.雪花ID
      • 1)UUID(Universally Unique Identifier,通用唯一识别码)
      • 2)Twitter 的雪花算法(SnowFlake)
    • 雪花ID优缺点
      • 优点
      • 缺点
      • 时钟回拨
    • 3.雪花id的工具类SnowFlakeUtil.java
    • 4.生成验证码
      • 前端显示
    • 5.JMeter测试验证码生成
  • JMeter
    • 什么是JMeter?
    • JMeter安装配置
      • 1.官网下载
      • 2.下载后解压
      • 3.汉语设置
  • JMeter的使用方法
    • 1.新建线程组
    • 2.设置参数
    • 3.添加取样器
    • 4.设置参数:协议,ip,端口,请求方式,路径
    • 5.添加查看结果树
    • 6.启动+查看结果
  • 总结

引出


1.验证码:如何生成一个唯一的ID;
2.UUID和雪花ID,雪花ID递增趋势,纯数字;
3.验证码应用,生成验证码,过期时间,存redis,前端显示;
4.JMeter高并发测试,官网下载,汉语设置;
5.JMeter的使用方法;

Redis的项目应用(一):验证码

凡是和抢相关的,redis+MQ

1.整体流程

在这里插入图片描述

2.雪花ID

1)UUID(Universally Unique Identifier,通用唯一识别码)

UUID(Universally Unique Identifier,通用唯一识别码)是按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片 ID 码和许多可能的数字。

UUID 是由一组 32 位数组成,由16 进制数字所构成,是故 UUID 理论上的总数为16的32次方。这个总数是多大呢?打个比方,如果每纳秒产生 1 百万个 UUID,要花 100 亿年才会将所有 UUID 用完。

UUID 通常以连字号分隔的五组来显示,形式为 8-4-4-4-12,总共有 36 个字符(即 32 个英数字母和 4 个连字号)。例如: 123e4567-e89b-12d3-a456-426655440000

JDK 从 1.5 开始在 java.util 包下提供了一个 UUID 类用来生成 UUID:

UUID uuid = UUID.randomUUID();
String uuidStr1 = uuid.toString();
String uuidStr2 = uuidStr1.replaceAll("-","");

UUID 的缺点和一个『好』ID 的标准

UUID的缺点:

为了得到一个全局唯一 ID,很自然地就会想到 UUID 算法。但是,UUID 算法有明显的缺点:

  • UUID 太长了,通常以 36 长度的字符串表示,很多场景不适用。

  • 非纯数字。UUID 中会出现 ABCDEF 这些十六进制的字母,因此,在数据库和代码中,自然就不能存储在整型字段或变量。因此,在数据库中以它作为主键,建立索引的代价比较大,性能有影响。

  • 不安全。UUID 中会包含网卡的 MAC 地址。

一个『好』ID 的标准应该有哪些:

  • 最好是由纯数字组成。

  • 越短越好,最好能存进整型变量和数据库的整型字段中。

  • 信息安全。另外,『ID 连续』并非好事情。

  • 在不连续的情况下,最好是递增的。即便不是严格递增,至少也应该是趋势递增。

2)Twitter 的雪花算法(SnowFlake)

Snowflake 是 Twitter(美国推特公司)开源的分布式 ID 生成算法。最初 Twitter 把存储系统从 MySQL 迁移到 Cassandra(它是NoSQL数据库),因为Cassandra 没有顺序 ID 生成机制,所以 Twitter 开发了这样一套全局唯一 ID 生成服务。

SnowFlake 优点:

整体上按照时间自增排序,并且整个分布式系统内不会产生 ID 碰撞(由数据中心 ID 和机器 ID 作区分),并且效率较高。经测试,SnowFlake 每秒能够产生 26 万 ID 左右。

Snowflake 会生成一个 long 类型的数值,long是8个字节,一共是64位,Snowflake 对于 long 的各个位都有固定的规范:

在这里插入图片描述

位数作用
时间戳41位当前时间戳与指定的时间戳之间的差值,即:(指定时间戳 - 当前时间戳)。
数据中心5位配置文件或环境构成,比如使用ip地址生成。
实例(机器标志位)5位同一数据中心,机器码设置。
12位毫秒内的计数器1毫秒之内产生不同id

在这里插入图片描述

  • 最高位标识(1 位)

    由于 long 基本类型在 Java 中是带符号的,最高位是符号位,正数是 0,负数是 1,因为 id 一般是正数,所以最高位是 0 。

  • 毫秒级时间戳(41 位)

    注意,41 位时间戳不是存储当前时间的时间戳,而是存储时间的差值(当前时间戳 - 开始时间戳) 得到的值,这里的的开始时间,一般是我们的 id 生成器开始使用的时间,由我们程序来指定的(如下面程序 IdGenerator 类的 startTime 属性)。

    41 位的时间截,可以使用 69 年。

    2的41次方 除以 (1000毫秒 * 60 * 60 * 24 * 365) = 69

  • 数据机器位(10 位)

    10-bit机器可以分别表示1024台机器,这 10 位的机器位实际上是由 5 位的 互联网数据中心(datacenterId) 和 5 位的工作机器id(workerId) 。这样就可以有32个互联网数据中心(机房)(2的5次方),每个互联网数据中心可以有32台工作机器 。即,总共允许存在 1024 台电脑各自计算 ID 。

    每台电脑都由 data-center-id 和 worker-id 标识,逻辑上类似于联合主键的意思。

  • 12位的自增序列号,用来记录同毫秒内产生的不同id,就是一毫秒内最多可以产生4096个id

    毫秒内的计数,12为的自增序列号 支持每个节点每毫秒(同一机器,同一时间截)产生 4096(2的12次方) 个 ID 序号,这种分配方式可以保证在任何一个互联网数据中心的任何一台工作机器在任意毫秒内生成的ID都是不同的

面试常问:如果是并发量高,同一台机器一毫秒有5000个id,那么id会不会重复,不会,根据源码如果一毫秒内超过4096个id,则会阻塞到下一毫秒再生成

雪花ID优缺点

优点

1、生成速度快经测试,SnowFlake每秒能够产生26万ID左右。

2、生成id有序,雪花算法生成的id整体是递增的,但是不是连续的。

3、本地即可生成,无需消耗额外的资源,如zookeeper、redis等。

缺点

1、id长度比较长(大概18位)

2、id不连续,生成的id是无规则的。

3、如果机器时钟回拨,就会导致id生成失败。

4、不同机器的时钟不是完全一致的,导致全局的id并不是统一向上自增。

时钟回拨

  1. 人为原因,把系统环境的时间改了。
  2. 有时候不同的机器上需要同步时间,可能不同机器之间存在误差,那么可能会出现时间回拨问题。

Leaf——美团点评分布式ID生成系统 - 美团技术团队 (meituan.com)

uid-generator/README.zh_cn.md at master · baidu/uid-generator · GitHub

3.雪花id的工具类SnowFlakeUtil.java

<!--        雪花id--><!--    工具包--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.11</version></dependency>
package com.tianju.springboot.util;import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.net.NetUtil;
import cn.hutool.core.util.IdUtil;
import lombok.extern.slf4j.Slf4j;import javax.annotation.PostConstruct;/*** 雪花id的工具类*/
@Slf4j
public class SnowFlakeUtil {private static long workerId = 0;private static long datacenterId = 1;private static Snowflake snowflake = IdUtil.getSnowflake(workerId,datacenterId);@PostConstruct // 自动调用,在构造方法前做public void init(){try {workerId = NetUtil.ipv4ToLong(NetUtil.getLocalhostStr());log.info("当前机器的workId:{}",workerId);}catch (Exception e){log.error("当前机器的workId获取失败",e);workerId = NetUtil.getLocalhostStr().hashCode();}}public static synchronized long snowflakeId(){return snowflake.nextId();}public static synchronized  String snowflakeIdStr(){return String.valueOf(snowflake.nextId());}public static void main(String[] args) {System.out.println(SnowFlakeUtil.snowflakeIdStr());}
}

4.生成验证码

流程:

  • 生成4位的验证码;
  • 产生唯一的id,作为验证码的key;
  • 以key,value的形式存储到redis中;
  • 前端显示验证码图片;

设置验证码的有效时间

// 3.redis中存储,key-value,设置有效时间为 60 s
stringRedisTemplate.opsForValue().set(key,code,60,TimeUnit.SECONDS);

package com.tianju.springboot.controller;import cn.hutool.captcha.CaptchaUtil;
import cn.hutool.captcha.LineCaptcha;
import com.tianju.springboot.dto.HttpRespSimple;
import com.tianju.springboot.util.SnowFlakeUtil;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Objects;import java.util.concurrent.TimeUnit;/*** 雪花id的调用,返回一张图片*/
@RestController
@RequestMapping("/api/user/code")
public class CodeDemoController {@Resourceprivate StringRedisTemplate stringRedisTemplate;@GetMapping("/snowcode.jpg")public HttpRespSimple createCode(HttpServletResponse response) throws IOException {// 1.产生验证码LineCaptcha lineCaptcha = CaptchaUtil.createLineCaptcha(200, 100, 4, 10);String code = lineCaptcha.getCode();// 2.产生唯一的值,作为key,用雪花id作为唯一的keyString key = SnowFlakeUtil.snowflakeIdStr(); // 生成雪花id,string类型的// 3.redis中存储,key-value,设置有效时间为 60 sstringRedisTemplate.opsForValue().set(key,code,60,TimeUnit.SECONDS);// 4.返回给浏览器cookieresponse.addCookie(new Cookie("vc", key));// 5.显示到前端lineCaptcha.write(response.getOutputStream());System.out.println(">>>>>>>>>>>>验证码为:"+code);return new HttpRespSimple(20001, "验证码创建成功");}@GetMapping("/inputcode")public HttpRespSimple inputCode(HttpServletRequest request){for (Cookie cookie: request.getCookies()) {if (cookie.getName().equals("vc")){String key = cookie.getValue();System.out.println("从redis取出存入的验证码:"+stringRedisTemplate.opsForValue().get(key));if (Objects.isNull(stringRedisTemplate.opsForValue().get(key))){return new HttpRespSimple(40001, "验证码无效");}else {return new HttpRespSimple(20002, "验证码成功");}}}return new HttpRespSimple(20003, "验证码不存在");}
}

在这里插入图片描述

前端显示

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>验证码</title>
</head>
<body>
<!--http://localhost:9090/api/user/code/snowcode.jpg-->
<img src="/api/user/code/snowcode.jpg"></body>
</html>

5.JMeter测试验证码生成

1)新建线程组

在这里插入图片描述

2)设置参数

在这里插入图片描述

3)添加取样器

在这里插入图片描述

4)设置参数:协议,ip,端口,请求方式,路径

在这里插入图片描述

5)添加查看结果树

在这里插入图片描述

6)启动+查看结果

在这里插入图片描述

在这里插入图片描述

JMeter

在这里插入图片描述

什么是JMeter?

Apache JMeter™

The Apache JMeter™ application is open source software, a 100% pure Java application designed to load test functional behavior and measure performance(接口性能),It was originally designed for testing Web Applications but has since expanded to other test functions.

JMeter安装配置

1.官网下载

在这里插入图片描述

2.下载后解压

在这里插入图片描述

3.汉语设置

在这里插入图片描述

JMeter的使用方法

在这里插入图片描述

1.新建线程组

在这里插入图片描述

2.设置参数

在这里插入图片描述

3.添加取样器

在这里插入图片描述

4.设置参数:协议,ip,端口,请求方式,路径

在这里插入图片描述

5.添加查看结果树

在这里插入图片描述

6.启动+查看结果

在这里插入图片描述


总结

1.验证码:如何生成一个唯一的ID;
2.UUID和雪花ID,雪花ID递增趋势,纯数字;
3.验证码应用,生成验证码,过期时间,存redis,前端显示;
4.JMeter高并发测试,官网下载,汉语设置;
5.JMeter的使用方法;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/6307.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java】一个简单的接口例子(帮助理解接口+多态)

要求&#xff1a; 请实现笔记本电脑使用USB鼠标、USB键盘的例子 1. USB 接口&#xff1a;包含打开设备、关闭设备功能 2. 笔记本类&#xff1a;包含开机功能、关机功能、使用 USB 设备功能 3. 鼠标类&#xff1a;实现 USB 接口&#xff0c;并具备点击功能 4. 键盘类&am…

磁盘分区形式MBR与GPT介绍

磁盘分区形式MBR与GPT介绍 磁盘分区形式有两种&#xff1a; 1、MBR&#xff08;主启动记录&#xff09;形式&#xff0c;它是存在于磁盘驱动器开始部分的一个特殊的启动扇区&#xff1b; 2、GPT&#xff08;GUID分区表&#xff09;形式&#xff0c;它是一种使用UEFI启动的磁盘…

C#使用Linq和Loop计算集合的平均值、方差【标准差】

方差【标准差】 标准差公式是一种数学公式。标准差也被称为标准偏差&#xff0c;或者实验标准差&#xff0c;公式如下所示&#xff1a; 样本标准差方差的算术平方根ssqrt(((x1-x)^2 (x2-x)^2 ......(xn-x)^2)/n) 总体标准差σsqrt(((x1-x)^2 (x2-x)^2 ......(xn-x)^2)/n ) …

❤️创意网页:抖音汉字鬼抓人小游戏复刻——附带外挂(“鬼鬼定身术”和“鬼鬼消失术”)坚持60秒轻轻松松(●‘◡‘●)

✨博主&#xff1a;命运之光 &#x1f338;专栏&#xff1a;Python星辰秘典 &#x1f433;专栏&#xff1a;web开发&#xff08;简单好用又好看&#xff09; ❤️专栏&#xff1a;Java经典程序设计 ☀️博主的其他文章&#xff1a;点击进入博主的主页 前言&#xff1a;欢迎踏入…

OpenCv之图像形态学

目录 一、形态学 二、图像全局二值化 三、自适应阈值二值化 四、腐蚀操作 五、获取形态学卷积核 六、膨胀操作 七、开运算 八、闭运算 一、形态学 定义: 指一系列处理图像形状特征的图像处理技术形态学的基本思想是利用一种特殊的结构元(本质上就是卷积核)来测量或提取输…

Flink简介及部署模式

文章目录 1、Flink简介2、Flink部署2.1 本地模式2.1 Standalone模式部署2.2 Standalone模式下的高可用2.3 Yarn模式Yarn模式的高可用配置&#xff1a;yarn模式中三种子模式的区别&#xff1a; 3、并行度4、提交命令执行指定任务Application Mode VS yarn per-job 5、注意事项5、…

4.1 Bootstrap UI 编辑器

文章目录 1. Bootstrap Magic2. BootSwatchr3. Bootstrap Live Editor4. Fancy Boot5. Style Bootstrap6. Lavish7. Bootstrap ThemeRoller8. LayoutIt!9. Pingendo10. Kickstrap11. Bootply12. X-editable13. Jetstrap14. DivShot15. PaintStrap 以下是 15 款最好的 Bootstrap…

ffplay播放器剖析(5)----视频输出剖析

文章目录 1.视频输出模块1.1 视频输出初始化1.1.1 视频输出初始化主要流程1.1.2 calculate_display_rect初始化显示窗口大小 1.2 视频输出逻辑1.2.1 event_loop开始处理SDL事件1.2.2 video_refresh1.2.2.1 计算上一帧显示时长,判断是否还要继续上一帧1.2.2.2 估算当前帧显示时长…

笔记本电脑的电池健康:确保长时间使用和优异性能的关键

笔记本电脑已经成为我们日常生活中不可或缺的工具&#xff0c;无论是办公、学习还是娱乐&#xff0c;我们都依赖着它的便携性和高效性能。而在所有的硬件组件中&#xff0c;电池健康被认为是确保长时间使用和良好性能的关键因素之一。一块健康的电池不仅能提供持久的续航时间&a…

CHI协议保序之Compack保序

一致性系统中&#xff0c;使用三种保序方式&#xff1b; Completion ack response ⭕Completion acknowledgment&#xff1a; □ 该域段主要是用来&#xff0c; □ 决定 RN 发送的 trans&#xff0c;与其他 RN 发送的命令产生的 SNP 之间的顺序&#xff1b; …

MySQL存储过程——系统变量

1.存储过程中的变量 1.1 查看系统变量 查看所有的系统变量 show variables;查看会话级别的系统变量 show session variables&#xff1b;查看会话和auto相关的变量 show session variables like auto%;查看全局的和auto相关变量 show global variables like auto%;查看某一…

R语言贝叶斯METROPOLIS-HASTINGS GIBBS 吉布斯采样器估计变点指数分布分析泊松过程车站等待时间...

原文链接&#xff1a;http://tecdat.cn/?p26578 指数分布是泊松过程中事件之间时间的概率分布&#xff0c;因此它用于预测到下一个事件的等待时间&#xff0c;例如&#xff0c;您需要在公共汽车站等待的时间&#xff0c;直到下一班车到了&#xff08;点击文末“阅读原文”获取…

ext4 - delay allocation数据结构

概述 延迟分配delay allocation是ext4非常重要的特性&#xff0c;启用该特性write系统将用户空间buffer写入内存page cache中即返回&#xff0c;此时也不会真正进行磁盘block分配&#xff0c;而是延迟到磁盘回写时&#xff08;比如dirty ratio达到一定值&#xff0c;定时刷新&…

【华为c# OD机考参考答案】01---IPv4地址转换成整数

题目 1、题目 01---IPv4地址转换成整数2、解图思路 1、IP地址转为二进制 2、二进制转十进制 3、注意事项 1、IP地址的范围判断 2、空字符串判断 3、非法字符判断 4、考点 1、string的split 、convert等相关用法 2、正则表达式 3、进制转换 4、理解32位整数的意思 5、代码 判…

【NOSQL】MongoDB

MongoDB MongoDB简介体系结构Linux系统中的安装启动和连接&#xff08;1&#xff09;先到官网下载压缩包——>解压——>重命名新建几个目录&#xff0c;分别用来存储数据和日志&#xff1a;新建并修改配置文件官网下载MongoDB Compass MongoDB简介 MongoDB是一个开源、高…

C# List 详解二

目录 5.Clear() 6.Contains(T) 7.ConvertAll(Converter) ,toutput> 8.CopyTo(Int32, T[], Int32, Int32) 9.CopyTo(T[]) 10.CopyTo(T[], Int32) C# List 详解一 1.Add(T)&#xff0c;2.AddRange(IEnumerable)&#xff0c;3.AsReadOnly()&…

Matlab的GUI设计

文章目录 AppDesigner各个版本的特点mlapp文件基本格式AppDesigner的回调函数常见控件的属性MVC模式MVC模式设计GUIMVC简单使用 其他让app designer置顶将Guide的GUI导出为m文件将app编译为exe将app中的多个控件组合在一起 AppDesigner 20200328 各个版本的特点 在2017b版本中…

【JavaEE】Spring中注解的方式去获取Bean对象

【JavaEE】Spring的开发要点总结&#xff08;3&#xff09; 文章目录 【JavaEE】Spring的开发要点总结&#xff08;3&#xff09;1. 属性注入1.1 Autowired注解1.2 依赖查找 VS 依赖注入1.3 配合Qualifier 筛选Bean对象1.4 属性注入的优缺点 2. Setter注入2.1 Autowired注解2.2…

21matlab数据分析牛顿插值(matlab程序)

1.简述 一、牛顿插值法原理 1.牛顿插值多项式   定义牛顿插值多项式为&#xff1a; N n ( x ) a 0 a 1 ( x − x 0 ) a 2 ( x − x 0 ) ( x − x 1 ) ⋯ a n ( x − x 0 ) ( x − x 1 ) ⋯ ( x − x n − 1 ) N_n\left(x\right)a_0a_1\left(x-x_0\right)a_2\left(x-x_0\…

SpringBoot 如何使用 EmbeddedDatabaseBuilder 进行数据库集成测试

SpringBoot 如何使用 EmbeddedDatabaseBuilder 进行数据库集成测试 在开发 SpringBoot 应用程序时&#xff0c;我们通常需要与数据库进行交互。为了确保我们的应用程序在生产环境中可以正常工作&#xff0c;我们需要进行数据库集成测试&#xff0c;以测试我们的应用程序是否能…