开发环境
jdk 11.0.10
SpringBoot 2.6.2
Idea
主要依赖
redis.clients
jedis
org.apache.commons
commons-pool2
org.springframework.boot
spring-boot-starter-aop
org.springframework.boot
spring-boot-devtools
runtime
true
org.springframework.boot
spring-boot-configuration-processor
true
核心代码
自定义注解
@Documented
@Retention(RUNTIME)
@Target(value = {ElementType.METHOD})
public @interface RateLimit {
/**
* 限流接口名称
* @return 限流接口名称
*/
String interfaceName();
/**
* 最大令牌数
* @return 最大令牌数
*/
long maxPermits();
/**
* 每秒生成的令牌数
* @return
*/
long tokensPerSeconds();
}
限流器抽象类
public abstract class RateLimiter {
private static final Logger logger = LoggerFactory.getLogger(RateLimiter.class);
/**
* 是否开启限流
*/
private boolean limited = true;
/**
* 开启限流功能
*/
public void open() {
if (!this.limited) {
this.limited = true;
} else {
logger.info("the limiter has started...");
}
}
/**
* 关闭限流功能
*/
public void close() {
if (this.limited) {
this.limited = false;
} else {
logger.info("the limiter has stopped...");
}
}
/**
* 获取令牌(指定接口限流)
* @param interfaceName 需要限流的接口名
* @param maxPermits 最大令牌数
* @param tokensPerSeconds 每秒生成的令牌数
* @return boolean 是否通过限流(获取到令牌)
*/
protected abstract boolean acquire(String interfaceName, long maxPermits, long tokensPerSeconds);
/**
* 获取令牌(指定接口)
* @param interfaceName 需要限流的接口名
* @return boolean 是否通过限流(获取到令牌)
*/
public boolean tryAcquire(String interfaceName, long maxPermits, long tokensPerSeconds) {
if (this.limited) {
return this.acquire(interfaceName, maxPermits, tokensPerSeconds);
} else {
return true;
}
}
}
令牌桶实现类
public class TokenBucketRateLimiter extends RateLimiter {
private static final Logger logger = LoggerFactory.getLogger(TokenBucketRateLimiter.class);
/**
* redis的lua脚本
*/
private DefaultRedisScript script;
/**
* redisTemplate
*/
private RedisTemplate redisTemplate;
public TokenBucketRateLimiter(DefaultRedisScript script, RedisTemplate redisTemplate) {
this.script = script;
this.redisTemplate = redisTemplate;
}
/**
* 限流检测(单个接口)
* @param interfaceName 需要限流的接口名
* @param maxPermits 最大令牌数
* @param tokensPerSeconds 每秒生成的令牌数
* @return 是否通过限流 true: 通过
*/
@Override
protected boolean acquire(String interfaceName, long maxPermits, long tokensPerSeconds) {
// 错误的参数将不起作用
if (maxPermits <= 0 || tokensPerSeconds <= 0) {
logger.warn("maxPermits and tokensPerSeconds can not be less than zero...");
return true;
}
// 参数结构: KEYS = [限流的key] ARGV = [最大令牌数, 每秒生成的令牌数, 本次请求的毫秒数]
Boolean result = this.redisTemplate.execute(this.script, Collections.singletonList(interfaceName), maxPermits, tokensPerSeconds, System.currentTimeMillis());
return result!=null && result;
}
}
具体实现令牌桶的Lua脚本
-- LUA脚本会以单线程执行,不会有并发问题,一个脚本中的执行过程中如果报错,那么已执行的操作不会回滚
-- KEYS和ARGV是外部传入进来需要操作的redis数据库中的key,下标从1开始
-- 参数结构: KEYS = [限流的key] ARGV = [最大令牌数, 每秒生成的令牌数, 本次请求的毫秒数]
local info = redis.pcall('HMGET', KEYS[1], 'last_time', 'stored_token_nums')
local last_time = info[1] --最后一次通过限流的时间
local stored_token_nums = tonumber(info[2]) -- 剩余的令牌数量
local max_token = tonumber(ARGV[1])
local token_rate = tonumber(ARGV[2])
local current_time = tonumber(ARGV[3])
local past_time = 0
local rateOfperMills = token_rate/1000 -- 每毫秒生产令牌速率
if stored_token_nums == nil then
-- 第一次请求或者键已经过期
stored_token_nums = max_token --令牌恢复至最大数量
last_time = current_time --记录请求时间
else
-- 处于流量中
past_time = current_time - last_time --经过了多少时间
if past_time <= 0 then
--高并发下每个服务的时间可能不一致
past_time = 0 -- 强制变成0 此处可能会出现少量误差
end
-- 两次请求期间内应该生成多少个token
local generated_nums = math.floor(past_time * rateOfperMills) -- 向下取整,多余的认为还没生成完
stored_token_nums = math.min((stored_token_nums + generated_nums), max_token) -- 合并所有的令牌后不能超过设定的最大令牌数
end
local returnVal = 0 -- 返回值
if stored_token_nums > 0 then
returnVal = 1 -- 通过限流
stored_token_nums = stored_token_nums - 1 -- 减少令牌
-- 必须要在获得令牌后才能重新记录时间。举例: 当每隔2ms请求一次时,只要第一次没有获取到token,那么后续会无法生产token,永远只过去了2ms
last_time = last_time + past_time
end
-- 更新缓存
redis.call('HMSET', KEYS[1], 'last_time', last_time, 'stored_token_nums', stored_token_nums)
-- 设置超时时间
-- 令牌桶满额的时间(超时时间)(ms) = 空缺的令牌数 * 生成一枚令牌所需要的毫秒数(1 / 每毫秒生产令牌速率)
redis.call('PEXPIRE', KEYS[1], math.ceil((1/rateOfperMills) * (max_token - stored_token_nums)))
return returnVal
切面类
@Aspect
public class RateLimitAspect {
private static final Logger logger = LoggerFactory.getLogger(RateLimitAspect.class);
private RateLimiter rateLimiter;
public RateLimitAspect(RateLimiter rateLimiter) {
this.rateLimiter = rateLimiter;
}
/**
* 标注切点-所有标识了RateLimit注解的方法
*/
@Pointcut("@annotation(cn.t.redis.limiter.annotations.RateLimit)")
public void pointCut(){};
@Before("pointCut()")
public void before(JoinPoint joinPoint) {
Method method = ((MethodSignature)joinPoint.getSignature()).getMethod();
RateLimit a = method.getAnnotation(RateLimit.class);
if (a != null) {
String name = a.interfaceName();
long maxPermits = a.maxPermits();
long tokensPerSeconds = a.tokensPerSeconds();
// 执行限流判断
var ret = this.rateLimiter.tryAcquire(name, maxPermits, tokensPerSeconds);
if (!ret) {
throw new RateLimitException("the interface can not be accessed in the meantime...");
}
}
}
}
自定义异常
public class RateLimitException extends RuntimeException {
public RateLimitException() {}
public RateLimitException(String message) {
super(message);
}
}
自动配置类
@Configuration
@AutoConfigureBefore(RedisAutoConfiguration.class) // 高优先级,先于自动默认的自动配置生成RedisTemplate
public class LimiterAutoConfiguration {
@Autowired
private RedisConnectionFactory connectionFactory;
/**
* 配置redisTemplate
* @return redisTemplate
*/
@Bean
@ConditionalOnMissingBean(RedisTemplate.class)
public RedisTemplate redisTemplate() {
RedisTemplate redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(this.connectionFactory);
// 定义Jackson2JsonRedisSerializer序列化对象
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
// 指定要序列化的域,ALL:field,get和set等,ANY: 可见性,会将有private修饰符的字段也序列化
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
// 使用StringRedisSerializer来序列化和反序列化redis的key值
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
// 使用jackson2JsonRedisSerializer序列化和反序列化value
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
// 属性设置完成afterPropertiesSet就会被调用,可以对设置不成功的做一些默认处理
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
/**
* redis的lua脚本对象
* @return lua脚本对象
*/
@Bean
public DefaultRedisScript redisScript() {
DefaultRedisScript redisScript = new DefaultRedisScript<>();
redisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource("RateLimiter.lua")));
redisScript.setResultType(Boolean.class);
return redisScript;
}
/**
* 默认限流器的实现-令牌桶
* @return 默认限流器
*/
@Bean
@ConditionalOnMissingBean(RateLimiter.class)
public RateLimiter rateLimiter() {
return new TokenBucketRateLimiter(this.redisScript(), this.redisTemplate());
}
/**
* 限流切面
* @param rateLimiter
* @return
*/
@Bean
@ConditionalOnBean(RateLimiter.class)
public RateLimitAspect rateLimitAspect(RateLimiter rateLimiter) {
return new RateLimitAspect(rateLimiter);
}
}
自动配置类指示文件(src/main/resources/META-INF/spring.factories
)
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
cn.t.redis.limiter.configuration.LimiterAutoConfiguration
打包后在需要使用限流功能的模块中引入即可
使用方法
引入本jar包
cn.t.redis.limiter
limiter-spring-boot-starter
1.0.0
配置Redis
连接信息
spring:
redis:
#host: localhost # 单点连接ip
#port: 18379 # # 单点连接端口
timeout: 6000 # 连接超时时间
password: your password
client-type: lettuce #指定连接工厂类型
cluster:
max-redirects: 3 # 获取失败 最大重定向次数
nodes: # 集群节点
- 127.0.0.1:7001
- 127.0.0.1:7002
- 127.0.0.1:7003
- 127.0.0.1:7004
- 127.0.0.1:7005
- 127.0.0.1:7006
lettuce: # lettuce连接池
pool:
max-active: 100 # 连接池最大连接数(使用负值表示没有限制)
max-idle: 20 # 最大空闲连接数
min-idle: 10 # 最小空闲连接数
max-wait: 1500 # 连接池最大阻塞等待时间(ms)(使用负值表示没有限制)
在需要限流的接口处使用注解
@RequestMapping("/index")
@RateLimit(interfaceName = "limit", maxPermits = 5, tokensPerSeconds = 1)
public String ratelimit() {
return "hello world";
}
未通过限流的访问会抛出异常,建议在全局异常处理器中捕获处理。
例如:
@RestControllerAdvice
public class GlobalErrorController {
@ExceptionHandler(RateLimitException.class)
public String ratelimiteHanler(RateLimitException e) {
return e.getMessage();
}
}
代码地址: 基于Redis + Lua的令牌桶限流器的实现
你可能感兴趣的:(基于Redis + Lua的令牌桶限流器的实现)
回溯-全排列
Vacant Seat
算法 java 回溯
46.全排列给定一个不含重复数字的数组nums,返回其所有可能的全排列。你可以按任意顺序返回答案输入:数组输出:二维列表思路:等待二刷classSolution{List>result=newArrayListpath=newLinkedList>permute(int[]nums){intlen=nums.length;used=newboolean[len];if(len==0){return
Git 的详细介绍及用法
xluo1715
工程化 git 代码管理 gitlab 程序员
一、Git的优点分布式版本控制每个开发者都拥有完整的仓库副本,无需依赖中央服务器(如SVN)。支持离线操作(提交、查看历史、创建分支等)。高效的分支管理创建和切换分支速度快(几乎是瞬间完成)。适合多人协作开发,支持多种工作流(如GitFlow、GitHubFlow)。强大的撤销和恢复能力可以回退到任意历史版本,避免代码丢失。提供gitreset、gitrevert、gitstash等撤销工具。数据
PIPCA个人信息保护合规审计师认证介绍!
熙丫 13381482386
大数据
个人信息保护合规审计师"(PersonalInformationProtectionComplianceAuditor-CCRC)是中国网络安全审查认证中心与市场监管大数据中心为深入贯彻实施《个人信息保护法》,推动个人信息处理者切实履行合规审计职责,针对企事业单位及第三方机构中从事个人信息保护合规审计(简称“个保审计”)的专业人员,依据《个人信息保护法》、《网络安全从业人员能力基本要求》
doris:Elasticsearch
向阳1218
大数据 doris
ElasticsearchCatalog除了支持自动映射ES元数据外,也可以利用Doris的分布式查询规划能力和ES(Elasticsearch)的全文检索能力相结合,提供更完善的OLAP分析场景解决方案:ES中的多index分布式Join查询。Doris和ES中的表联合查询,更复杂的全文检索过滤。使用限制支持Elasticsearch5.x及以上版本。创建CatalogCREATECATALOG
doris:阿里云 MaxCompute
向阳1218
大数据 doris
MaxCompute是阿里云上的企业级SaaS(SoftwareasaService)模式云数据仓库。什么是MaxCompute连接MaxCompute示例--1.创建Catalog。CREATECATALOGmcPROPERTIES("type"="max_compute","mc.default.project"="xxx","mc.access_key"="xxxx","mc.secret_
MyBatis Plus 在 Java 项目中的高效使用
随风九天
匠心数据库 java spring java mybatis MyBatis Plus
1.前言1.1MyBatisPlus简介MyBatisPlus是一个MyBatis的增强工具,旨在简化开发人员在数据库操作上的工作量。它提供了丰富的功能,如自动化的CRUD操作、条件构造器、分页查询等,极大地提高了开发效率。1.2为什么选择MyBatisPlus简化代码:自动生成基础的CRUD方法,减少重复代码。提高效率:内置多种插件和工具,提升开发速度。易于维护:代码结构清晰,便于后续维护和扩展
java--数据校验Validator
郑*杰
java 开发语言 spring
一、基于注解进行数据校验1、配置依赖java--常用依赖配置_郑*杰的博客-CSDN博客2、创建一个配置类packagecom.ruqi.aditainoal;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.ComponentScan;importorg.s
使用 ResponseBodyEmitter 实现异步响应式数据流处理
随风九天
spring java 多线程 BodyEmitter 异步响应
1.概述1.1什么是ResponseBodyEmitterResponseBodyEmitter是SpringMVC提供的一个接口,用于支持异步返回响应数据流。它允许在控制器方法中逐步发送数据给客户端,而无需一次性生成完整的响应。1.2使用场景实时数据推送(如股票行情、聊天消息等)。大量数据分批传输。服务器发送事件(SSE,Server-SentEvents)。1.3优势与局限性优势:支持异步数据
掌握SQL多表连接查询_轻松处理复杂数据关系
随风九天
匠心数据库 java sql 数据库
1.引言1.1数据库中的多表关系概述在实际应用中,数据库通常由多个表组成,每个表存储不同类型的数据。例如,在一个电子商务系统中,可能会有用户表、订单表、产品表等。这些表之间存在关联关系,通过多表连接查询可以整合这些数据,提供更全面的信息。1.2多表连接查询的重要性多表连接查询是SQL中最常用和重要的操作之一。它允许我们从多个表中提取相关数据,并根据特定条件进行组合。掌握多表连接查询可以帮助我们更高
Apache Doris 实现毫秒级查询响应
随风九天
匠心数据库 服务 java apache Apache Doris
1.引言1.1数据分析的重要性随着大数据时代的到来,企业对实时数据分析的需求日益增长。快速、准确地获取数据洞察成为企业在竞争中脱颖而出的关键。传统的数据库系统在处理大规模数据时往往面临性能瓶颈,难以满足实时分析的需求。例如,一个电商公司需要实时监控销售数据以调整库存和营销策略,而传统的数据库可能需要数分钟甚至数小时才能生成报表,这显然无法满足业务需求。1.2ApacheDoris简介ApacheD
Flink实时流处理入门与实践
随风九天
spring java Flink 实时流
一、引言1.1实时流处理的重要性在当今数据驱动的时代,实时数据处理变得越来越重要。企业需要从不断产生的大量数据中快速提取有价值的信息,以支持决策制定和业务优化。实时流处理技术能够实时处理数据流,提供即时的洞察和响应,从而提高业务效率和竞争力。1.2Flink简介ApacheFlink是一个开源的分布式流处理框架,支持批处理和流处理。Flink提供了高吞吐量、低延迟和精确一次(exactly-onc
一学就会的深度学习基础指令及操作步骤(6)迁移学习
小圆圆666
深度学习 迁移学习 人工智能 卷积神经网络
文章目录迁移学习模型准备数据增强模型训练模型微调和预测检查预测结果迁移学习迁移学习是将一个任务中学到的知识应用到另一个相关任务上,以提高新任务的学习效率和性能。优势:节省训练时间,提高模型性能,尤其在小数据场景下效果显著。核心是利用源域的知识来帮助目标域任务,比如在ImageNet上预训练的模型用于医疗影像分类。源域(SourceDomain):已有知识的领域(如ImageNet图像库)。目标域(
Unity游戏引擎
喜欢星期五
游戏引擎 unity
在数字创意的世界里,Unity引擎以其强大的功能和灵活性,已经成为无数开发者心中构建梦想游戏的首选工具。今天,我们就来深入探讨Unity的奥秘,解锁它如何帮助我们实现那些令人惊叹的游戏项目。unity博文的概要:1.入门教程和资源分享初学者指南:这类博文为刚接触Unity的新手提供入门指导,介绍Unity界面布局、基本操作和简单的游戏开发流程。资源推荐:分享对开发者非常有帮助的Unity插件、模型
通义万相2.1:AI视频生成迎来“质变”,运镜、文字、物理规律全面突破
that's boy
人工智能 通义万象2.1 chatgpt openai qwen AI作画 AI编程
AI视频生成,从“能看”到“惊艳”的跨越在人工智能的浪潮中,AI视频生成无疑是最受瞩目的领域之一。从最初的简单动画到如今的逼真模拟,AI视频生成技术正在快速发展,不断刷新人们的认知。近日,阿里云旗下通义万相视频生成模型宣布了2.1版本的重磅升级,不仅在性能上实现了全面提升,更在运镜、文字生成、物理规律模拟等方面取得了突破性进展,让AI视频生成真正进入了“质变”的新阶段。通义万相2.1的出现,不仅是
YOLOv8制作自己的实例分割数据集保姆级教程(包含json转txt)
Sir小珂
YOLO python 深度学习 人工智能
1.数据准备首先对原始数据集进行整理,将标注好的图像和标签分别放在两个文件夹中,同时额外新建两个文件夹,用于存放转换完的标签与划分后的数据集。1.1将json格式文件转换为txt格式新建json2txt.py文件,将代码中的文件路径修改为自己的路径。❗❗❗代码中第43行的classes中存放的是自己数据集的分类标签,记得修改成自己的。importjsonimportosfromtqdmimport
【贪心算法2】
m0_46150269
贪心算法 算法
力扣122.买卖股票最佳时机Ⅱ链接:link思路要求最大利润,可以分解成子问题求解,在最低价格买入,最高价格卖出。假如第0天价格最低,第3天价格最高,利润=prices[3]-pricnes[0],可以将利润公式拆解成(prices[3]-prices[2])+(prices[2]-prices[1])+(prices[1]-prices[0])最终变成了求相邻两天的利润,所以可以得到一个关于利润
three.js 鼠标点击获取模型对象
lucky_zouzou
javascript 开发语言 ecmascript
three.js创建模型后,想要实现点击模型获取模型对象触发相应事件。可以使用它提供的APITHREE.Raycaster()https://threejs.org/docs/index.html?q=Raycaster#api/en/core/Raycaster//监听点击事件window.addEventListener('click',(event)=>{event.preventDefau
Linux 内核移植
River-D
Driver
NXP官方开发板Linux内核编译37.2.1修改顶层Makefile修改顶层Makefile,直接在顶层Makefile文件里面定义ARCH和CROSS_COMPILE这两个的变量值为arm和arm-linux-gnueabihf-37.2.2配置并编译Linux内核和uboot一样,在编译Linux内核之前要先配置Linux内核。每个板子都有其对应的默认配置文件,这些默认配置文件保存在arch
D3D11的简单字体
x-2010
DIRECT3D D3D字体实现
本篇的任务是要先学会混合和纹理才能够做到的。这儿有几种方法能够在D3D11中实现字体显示,一个是学会使用微软想要我们使用的两个新的API,Direct2D和DirectWrite,实际上它们是很有用处的,暂不提它们的灵活性(除了不能够直接使用D3D11设备之外),它的缺点就是由于不能够直接在D3D11中使用,需要在D3D10.1的设备中使用,导致在渲染时需要在这两种设备之间切换。本篇是在混合篇基础
OpenBayes 教程上新 | 性能比肩满血版 DeepSeek-R1,QwQ-32B 一键部署教程上线
上周,阿里云突发大招,强势开源了全新推理模型通义千问QwQ-32B。在多个关键基准测试上,其以32B的参数量,超越了OpenAI-o1-mini,比肩671B参数的满血版DeepSeek-R1。QwQ-32B不仅性能哇塞,在保持强劲性能的同时,它还大幅降低了部署使用成本,在消费级显卡上也能实现本地部署,堪称实力与性价比的典范。QwQ-32B在多项基准测试中与DeepSeek-R1-671B等推理模
C++开源库大全
大王算法
C/C++开发实战365 C++入门及项目实战宝典 c++ 开源
程序员要站在巨人的肩膀上,C++拥有丰富的开源库,这里包括:标准库、Web应用框架、人工智能、数据库、图片处理、机器学习、日志、代码分析等。标准库C++StandardLibrary:是一系列类和函数的集合,使用核心语言编写,也是C++ISO自身标准的一部分。
Apipost一站式API工具评测:整合Postman+Swagger+JMeter三大功能,打造全流程开发解决方案
作为一名Java开发者,始终追求开发过程的高效性。使用IntelliJIDEA编写代码只是开始。一般来说,代码完成后,我们会切换到Postman进行API调试。在确保API表现符合预期后,我们会使用Swagger为前端团队生成文档。最后,再使用JMeter进行性能和负载测试,以确保API工作流顺畅且自动化。Apipost=Postman+Swagger+JMeter然而,这种多工具的方法存在诸多挑
领域大模型之微调技术和最佳实践
程序员莫玛
人工智能 深度学习 语言模型 金融
BERT和GPT-3等语言模型针对语言任务进行了预训练。微调使它们适应特定领域,如营销、医疗保健、金融。在本指南中,您将了解LLM架构、微调过程以及如何为NLP任务微调自己的预训练模型。-介绍-大型语言模型(LLM)的特别之处可以概括为两个关键词——大型和通用。“大”是指它们训练的海量数据集及其参数的大小,即模型在训练过程中学习的记忆和知识;“通用”意味着他们具有广泛的语言任务能力。更明确地说,L
从青铜巨人到硅基生命:机器人文明的意识觉醒之路--三千年人类想象与科技突破的双螺旋演进)
109702008
杂谈 机器人 科技 人工智能
一、神话时代的机械启蒙:人类意识的原始投射公元前3世纪的地中海沿岸,克里特岛民仰望青铜巨人塔罗斯巡视海岸的传说,折射出人类最早的机器人想象。这个由赫菲斯托斯铸造的自动守卫,体内流淌着神秘"ichor"(神之血液),实则是对液压传动原理的原始隐喻。在中国战国时期,《列子》记载的偃师献艺故事中,歌舞机械人"瞬其目而招王之左右侍妾",揭示了人类对仿生智能的本能向往。考古学家在亚历山大港发现的希罗自动剧场
基于PyTorch的深度学习6——数据处理工具箱2
Wis4e
深度学习 pytorch 人工智能
torchvision有4个功能模块:model、datasets、transforms和utils。主要介绍如何使用datasets的ImageFolder处理自定义数据集,以及如何使用transforms对源数据进行预处理、增强等。下面将重点介绍transforms及ImageFolder。transforms提供了对PILImage对象和Tensor对象的常用操作。1)对PILImage的常
基于PyTorch的深度学习——机器学习3
Wis4e
深度学习 机器学习 pytorch
激活函数在神经网络中作用有很多,主要作用是给神经网络提供非线性建模能力。如果没有激活函数,那么再多层的神经网络也只能处理线性可分问题。在搭建神经网络时,如何选择激活函数?如果搭建的神经网络层数不多,选择sigmoid、tanh、relu、softmax都可以;而如果搭建的网络层次较多,那就需要小心,选择不当就可导致梯度消失问题。此时一般不宜选择sigmoid、tanh激活函数,因它们的导数都小于1
详解Vue 的 key 机制
向贤
前端开发 vue.js javascript 前端
详解Vue的key机制(从底层原理到实战价值,彻底讲透关键设计)一、Key的本质作用核心定位:虚拟DOM的身份证Vue通过虚拟DOM实现高效渲染,而key是虚拟节点(VNode)的唯一标识符。其作用可拆解为:场景无Key的问题有Key的解决方案列表更新元素复用错乱,导致状态残留(如输入框内容)精准匹配新旧节点,保持状态一致性组件切换相同类型组件实例被复用,生命周期未触发强制销毁旧组件,触发完整生命
Android Studio 安装汉化包
奥特曼老师
android studio android ide
Chinese(Simplified)LanguagePack/中文语言包确认自己的AndroidStudio的版本,需要跟下载的插件包对应上。插件包下载完成,无需解压打开AndroidStudio进行选择本地导入插件包
React,antd实现自动滚动Table封装组件
前端CV攻城狮
工作中遇到有意思的东西 react.js javascript 前端
这一版在使用过程中会出现一个页面引用多个该组件,获取dom出错的问题,加强版自滚动table已上传点击跳转加强版自滚动组件只是根据工作需要,简单写了这种方如有不妥,你就当看不见…如有好的建议,私我/评论即可.MD参数名称|注释|默认值rollNum|超过多少条开始自动滚动|10rollTop|滚动速度|1.5rollTime|滚动时间|100msscroll|表格大小|y:500pxx:100%f
npm install -g yarn 报错 -13 code: ‘EACCES‘ 亲测有效
前端CV攻城狮
入门分享 npm 前端 node.js
在配置新mac的环境的时候,发现yarn无论如何也无法下载安装,搜了很久,最终找到了一个完美的结局办法,亲测有效报错内容zhaowei@zhaoweideMacBook-Pro~%npminstall-gyarnnpmERR!codeEACCESnpmERR!syscallmkdirnpmERR!path/usr/local/lib/node_modules/yarnnpmERR!errno-13
PHP,安卓,UI,java,linux视频教程合集
cocos2d-x小菜
java UI PHP android linux
╔-----------------------------------╗┆
各表中的列名必须唯一。在表 'dbo.XXX' 中多次指定了列名 'XXX'。
bozch
.net .net mvc
在.net mvc5中,在执行某一操作的时候,出现了如下错误:
各表中的列名必须唯一。在表 'dbo.XXX' 中多次指定了列名 'XXX'。
经查询当前的操作与错误内容无关,经过对错误信息的排查发现,事故出现在数据库迁移上。
回想过去: 在迁移之前已经对数据库进行了添加字段操作,再次进行迁移插入XXX字段的时候,就会提示如上错误。
&
Java 对象大小的计算
e200702084
java
Java对象的大小
如何计算一个对象的大小呢?
Mybatis Spring
171815164
mybatis
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
CustomerService userService = (CustomerService) ac.getBean("customerService");
Customer cust
JVM 不稳定参数
g21121
jvm
-XX 参数被称为不稳定参数,之所以这么叫是因为此类参数的设置很容易引起JVM 性能上的差异,使JVM 存在极大的不稳定性。当然这是在非合理设置的前提下,如果此类参数设置合理讲大大提高JVM 的性能及稳定性。 可以说“不稳定参数”
用户自动登录网站
永夜-极光
用户
1.目标:实现用户登录后,再次登录就自动登录,无需用户名和密码
2.思路:将用户的信息保存为cookie
每次用户访问网站,通过filter拦截所有请求,在filter中读取所有的cookie,如果找到了保存登录信息的cookie,那么在cookie中读取登录信息,然后直接
centos7 安装后失去win7的引导记录
程序员是怎么炼成的
操作系统
1.使用root身份(必须)打开 /boot/grub2/grub.cfg 2.找到 ### BEGIN /etc/grub.d/30_os-prober ### 在后面添加 menuentry "Windows 7 (loader) (on /dev/sda1)" {
Oracle 10g 官方中文安装帮助文档以及Oracle官方中文教程文档下载
aijuans
oracle
Oracle 10g 官方中文安装帮助文档下载:http://download.csdn.net/tag/Oracle%E4%B8%AD%E6%96%87API%EF%BC%8COracle%E4%B8%AD%E6%96%87%E6%96%87%E6%A1%A3%EF%BC%8Coracle%E5%AD%A6%E4%B9%A0%E6%96%87%E6%A1%A3 Oracle 10g 官方中文教程
JavaEE开源快速开发平台G4Studio_V3.2发布了
無為子
AOP oracle mysql javaee G4Studio
我非常高兴地宣布,今天我们最新的JavaEE开源快速开发平台G4Studio_V3.2版本已经正式发布。大家可以通过如下地址下载。
访问G4Studio网站
http://www.g4it.org
G4Studio_V3.2版本变更日志
功能新增
(1).新增了系统右下角滑出提示窗口功能。
(2).新增了文件资源的Zip压缩和解压缩
Oracle常用的单行函数应用技巧总结
百合不是茶
日期函数 转换函数(核心) 数字函数 通用函数(核心) 字符函数
单行函数; 字符函数,数字函数,日期函数,转换函数(核心),通用函数(核心)
一:字符函数:
.UPPER(字符串) 将字符串转为大写
.LOWER (字符串) 将字符串转为小写
.INITCAP(字符串) 将首字母大写
.LENGTH (字符串) 字符串的长度
.REPLACE(字符串,'A','_') 将字符串字符A转换成_
Mockito异常测试实例
bijian1013
java 单元测试 mockito
Mockito异常测试实例:
package com.bijian.study;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import org.junit.Assert;
import org.junit.Test;
import org.mockito.
GA与量子恒道统计
Bill_chen
JavaScript 浏览器 百度 Google 防火墙
前一阵子,统计**网址时,Google Analytics(GA) 和量子恒道统计(也称量子统计),数据有较大的偏差,仔细找相关资料研究了下,总结如下:
为何GA和量子网站统计(量子统计前身为雅虎统计)结果不同?
首先:没有一种网站统计工具能保证百分之百的准确出现该问题可能有以下几个原因:(1)不同的统计分析系统的算法机制不同;(2)统计代码放置的位置和前后
【Linux命令三】Top命令
bit1129
linux命令
Linux的Top命令类似于Windows的任务管理器,可以查看当前系统的运行情况,包括CPU、内存的使用情况等。如下是一个Top命令的执行结果:
top - 21:22:04 up 1 day, 23:49, 1 user, load average: 1.10, 1.66, 1.99
Tasks: 202 total, 4 running, 198 sl
spring四种依赖注入方式
白糖_
spring
平常的java开发中,程序员在某个类中需要依赖其它类的方法,则通常是new一个依赖类再调用类实例的方法,这种开发存在的问题是new的类实例不好统一管理,spring提出了依赖注入的思想,即依赖类不由程序员实例化,而是通过spring容器帮我们new指定实例并且将实例注入到需要该对象的类中。依赖注入的另一种说法是“控制反转”,通俗的理解是:平常我们new一个实例,这个实例的控制权是我
angular.injector
boyitech
AngularJS AngularJS API
angular.injector
描述: 创建一个injector对象, 调用injector对象的方法可以获得angular的service, 或者用来做依赖注入. 使用方法: angular.injector(modules, [strictDi]) 参数详解: Param Type Details mod
java-同步访问一个数组Integer[10],生产者不断地往数组放入整数1000,数组满时等待;消费者不断地将数组里面的数置零,数组空时等待
bylijinnan
Integer
public class PC {
/**
* 题目:生产者-消费者。
* 同步访问一个数组Integer[10],生产者不断地往数组放入整数1000,数组满时等待;消费者不断地将数组里面的数置零,数组空时等待。
*/
private static final Integer[] val=new Integer[10];
private static
使用Struts2.2.1配置
Chen.H
apache spring Web xml struts
Struts2.2.1 需要如下 jar包: commons-fileupload-1.2.1.jar commons-io-1.3.2.jar commons-logging-1.0.4.jar freemarker-2.3.16.jar javassist-3.7.ga.jar ognl-3.0.jar spring.jar
struts2-core-2.2.1.jar struts2-sp
[职业与教育]青春之歌
comsci
教育
每个人都有自己的青春之歌............但是我要说的却不是青春...
大家如果在自己的职业生涯没有给自己以后创业留一点点机会,仅仅凭学历和人脉关系,是难以在竞争激烈的市场中生存下去的....
&nbs
oracle连接(join)中使用using关键字
daizj
JOIN oracle sql using
在oracle连接(join)中使用using关键字
34. View the Exhibit and examine the structure of the ORDERS and ORDER_ITEMS tables.
Evaluate the following SQL statement:
SELECT oi.order_id, product_id, order_date
FRO
NIO示例
daysinsun
nio
NIO服务端代码:
public class NIOServer {
private Selector selector;
public void startServer(int port) throws IOException {
ServerSocketChannel serverChannel = ServerSocketChannel.open(
C语言学习homework1
dcj3sjt126com
c homework
0、 课堂练习做完
1、使用sizeof计算出你所知道的所有的类型占用的空间。
int x;
sizeof(x);
sizeof(int);
# include <stdio.h>
int main(void)
{
int x1;
char x2;
double x3;
float x4;
printf(&quo
select in order by , mysql排序
dcj3sjt126com
mysql
If i select like this:
SELECT id FROM users WHERE id IN(3,4,8,1);
This by default will select users in this order
1,3,4,8,
I would like to select them in the same order that i put IN() values so:
页面校验-新建项目
fanxiaolong
页面校验
$(document).ready(
function() {
var flag = true;
$('#changeform').submit(function() {
var projectScValNull = true;
var s ="";
var parent_id = $("#parent_id").v
Ehcache(02)——ehcache.xml简介
234390216
ehcache ehcache.xml 简介
ehcache.xml简介
ehcache.xml文件是用来定义Ehcache的配置信息的,更准确的来说它是定义CacheManager的配置信息的。根据之前我们在《Ehcache简介》一文中对CacheManager的介绍我们知道一切Ehcache的应用都是从CacheManager开始的。在不指定配置信
junit 4.11中三个新功能
jackyrong
java
junit 4.11中两个新增的功能,首先是注解中可以参数化,比如
import static org.junit.Assert.assertEquals;
import java.util.Arrays;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runn
国外程序员爱用苹果Mac电脑的10大理由
php教程分享
windows PHP unix Microsoft perl
Mac 在国外很受欢迎,尤其是在 设计/web开发/IT 人员圈子里。普通用户喜欢 Mac 可以理解,毕竟 Mac 设计美观,简单好用,没有病毒。那么为什么专业人士也对 Mac 情有独钟呢?从个人使用经验来看我想有下面几个原因:
1、Mac OS X 是基于 Unix 的
这一点太重要了,尤其是对开发人员,至少对于我来说很重要,这意味着Unix 下一堆好用的工具都可以随手捡到。如果你是个 wi
位运算、异或的实际应用
wenjinglian
位运算
一. 位操作基础,用一张表描述位操作符的应用规则并详细解释。
二. 常用位操作小技巧,有判断奇偶、交换两数、变换符号、求绝对值。
三. 位操作与空间压缩,针对筛素数进行空间压缩。
&n
weblogic部署项目出现的一些问题(持续补充中……)
Everyday都不同
weblogic部署失败
好吧,weblogic的问题确实……
问题一:
org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: URL [zip:E:/weblogic/user_projects/domains/base_domain/serve
tomcat7性能调优(01)
toknowme
tomcat7
Tomcat优化: 1、最大连接数最大线程等设置
<Connector port="8082" protocol="HTTP/1.1"
useBodyEncodingForURI="t
PO VO DAO DTO BO TO概念与区别
xp9802
java DAO 设计模式 bean 领域模型
O/R Mapping 是 Object Relational Mapping(对象关系映射)的缩写。通俗点讲,就是将对象与关系数据库绑定,用对象来表示关系数据。在O/R Mapping的世界里,有两个基本的也是重要的东东需要了解,即VO,PO。
它们的关系应该是相互独立的,一个VO可以只是PO的部分,也可以是多个PO构成,同样也可以等同于一个PO(指的是他们的属性)。这样,PO独立出来,数据持