toNumber

springboot + aop + Lua分布式限流原理解析

时光怂恿深爱的人放手 提交于 2020-04-13 09:15:52
【今日推荐】:为什么一到面试就懵逼!>>> 一、什么是限流?为什么要限流? 不知道大家有没有做过帝都的地铁,就是进地铁站都要排队的那种,为什么要这样摆长龙转圈圈?答案就是为了 限流 !因为一趟地铁的运力是有限的,一下挤进去太多人会造成站台的拥挤、列车的超载,存在一定的安全隐患。同理,我们的程序也是一样,它处理请求的能力也是有限的,一旦请求多到超出它的处理极限就会崩溃。为了不出现最坏的崩溃情况,只能耽误一下大家进站的时间。 限流是保证系统高可用的重要手段!!! 由于互联网公司的流量巨大,系统上线会做一个流量峰值的评估,尤其是像各种秒杀促销活动,为了保证系统不被巨大的流量压垮,会在系统流量到达一定阈值时,拒绝掉一部分流量。 限流会导致用户在短时间内(这个时间段是毫秒级的)系统不可用,一般我们衡量系统处理能力的指标是每秒的 QPS 或者 TPS ,假设系统每秒的流量阈值是1000,理论上一秒内有第1001个请求进来时,那么这个请求就会被限流。 二、限流方案 1、计数器 Java内部也可以通过原子类计数器 AtomicInteger 、 Semaphore 信号量来做简单的限流。 // 限流的个数 private int maxCount = 10; // 指定的时间内 private long interval = 60; // 原子类计数器 private AtomicInteger

Oracle处理varchar2类型排序问题

∥☆過路亽.° 提交于 2020-04-10 18:32:07
开发新项目遇到一个问题,Oracle数据库有张表有个专门用来排序的字段SN的数据类型是varchar2的,当用这个字段进行排序的时候虽然SN中存入的数据都是数字,但是因为是varchar2类型的造成实际排序的时候不论数字有几位只会比较第一位的大小进行排序。 例如: 这里有四条数据如下我们进行排序 这个是我们需要的排序格式: 但是使用SELECT * FROM TEST_TABLE ORDER BY SN;排序出来缺是这样的: 这是因为Oracle在比较varchar2的时候只会讲其第一位比较,如果第一位相同再比较后面的位数,所以造成了上面的原因,我们可以将其转换为数字类型进行排序。具体有一下方式: 一、使用CAST函数 语法:cast( 列名/值 as 数据类型 ) Oracle的CAST可以将列字段类型转化成对应类型的函数。但是这里一定要记住,我们这里如果想让SN字段varchar2转化为int类型,SN必须为全数字字符串,如果SN中含有除数字外的其它字符SQL会报错。 SELECT * FROM TEST_TABLE ORDER BY CAST(SN AS int); 二、使用TO_NUMBER 语法:to_number(列名/值) Oracle的TO_NUMBER函数是将字段类型转化为数字类型,和CAST一样,这里to_number里面的子端不论为什么类型但是必须为数字

接口限流

旧城冷巷雨未停 提交于 2020-04-05 15:44:30
接口限流看这一篇就够了!!! 导读 前几天和一个朋友讨论了他们公司的系统问题,传统的单体应用,集群部署,他说近期服务的并发量可能会出现瞬时增加的风险,虽然部署了集群,但是通过压测后发现请求延迟仍然是很大,想问问我有什么改进的地方。我沉思了一会,现在去改架构显然是不可能的,于是我给出了一个建议,让他去做个接口限流,这样能够保证瞬时并发量飙高也不会出现请求延迟的问题,用户的体验度也会上去。 至于什么是接口限流?怎么实现接口限流?如何实现单机应用的限流?如何实现分布式应用的限流?本篇文章将会详细阐述。 限流的常见几种算法 常见的限流算法有很多,但是最常用的算法无非以下四种。 固定窗口计数器 固定算法的概念如下 将时间划分为多个窗口 在每个窗口内每有一次请求就将计数器加一 如果计数器超过了限制数量,则本窗口内所有的请求都被丢弃当时间到达下一个窗口时,计数器重置。 固定窗口计数器是最为简单的算法,但这个算法有时会让通过请求量允许为限制的两倍。考虑如下情况:限制 1 秒内最多通过 5 个请求,在第一个窗口的最后半秒内通过了 5 个请求,第二个窗口的前半秒内又通过了 5 个请求。这样看来就是在 1 秒内通过了 10 个请求。 滑动窗口计数器 滑动窗口计数器算法概念如下: 将时间划分为多个区间; 在每个区间内每有一次请求就将计数器加一维持一个时间窗口,占据多个区间; 每经过一个区间的时间

Oracle迁移PostgreSQL经验总结(SQL部分,未完待续)

拜拜、爱过 提交于 2020-03-27 13:34:32
3 月,跳不动了?>>> 序号 项目 Oracle PostgreSQL 1 当前时间 SYSDATE 可全部使用current_timestamp替换 2 序列 SEQNAME.NEXTVAL NEXTVAL('SEQNAME') 3 固定值列 SELECT '1' AS COL1 SELECT CAST('1' AS TEXT) AS COL1 4 NVL NVL函数 NVL可以用COALESCE函数替换 5 类型自动转换 Oracle某些情况下支持类型自动转换 会出现类型不匹配等错误,需要在Java或者sql中进行类型转换,使类型匹配 6 INSTR函数 instr('str1','str2') strpos('str1','str2') 7 外连接 Oracle可简写为(+) 用LEFT JOIN等语句替换 8 层次查询 START WITH语句 CONNECT BY语句 用WITH RECURSIVE语句 9 数据库对象大小写 不区分大小写 创建数据库对象时要小写,这样才不区分SQL的大小写 10 同义词 Oracle支持同义词 用视图代替 11 DUAL SELECT 1+1 FROM DUAL SELECT 1+1 或者 CREATE VIEW dual AS SELECT current_timestamp 12 ROWNUM ROWNUM关键字 两种情况: 1

使用redis+lua脚本实现分布式接口限流

被刻印的时光 ゝ 提交于 2020-01-07 03:52:02
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 问题描述   某天A君突然发现自己的接口请求量突然涨到之前的10倍,没多久该接口几乎不可使用,并引发连锁反应导致整个系统崩溃。如何应对这种情况呢?生活给了我们答案:比如老式电闸都安装了保险丝,一旦有人使用超大功率的设备,保险丝就会烧断以保护各个电器不被强电流给烧坏。同理我们的接口也需要安装上“保险丝”,以防止非预期的请求对系统压力过大而引起的系统瘫痪,当流量过大时,可以采取拒绝或者引流等机制。 一、限流总并发/连接/请求数 对于一个应用系统来说一定会有极限并发/请求数,即总有一个TPS/QPS阀值,如果超了阀值则系统就会不响应用户请求或响应的非常慢,因此我们最好进行过载保护,防止大量请求涌入击垮系统。 如果你使用过Tomcat,其Connector 其中一种配置有如下几个参数: acceptCount:如果Tomcat的线程都忙于响应,新来的连接会进入队列排队,如果超出排队大小,则拒绝连接; maxConnections: 瞬时最大连接数,超出的会排队等待; maxThreads:Tomcat能启动用来处理请求的最大线程数,如果请求处理量一直远远大于最大线程数则可能会僵死。 详细的配置请参考官方文档。另外如Mysql(如max_connections)、Redis(如tcp-backlog

如何在以太坊开发发行自己的ERC-20数字货币

谁说胖子不能爱 提交于 2019-12-27 13:38:10
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 今天我将向你展示如何在以太坊区块链上开发你自己的加密货币并将其出售!我将向你展示如何使用以太坊智能合约逐步创建自己的ERC-20代币和众筹销售,如何测试智能合约,如何将智能合约部署到以太坊区块链,以及如何构建ICO网站部署到网络上。我还将解释ERC-20代币是什么,以太坊代币如何工作,初始代币产品(ICO)如何工作。 什么是ERC-20代币? 以太坊区块链允许你创建自己的加密货币或代币,可以通过以太币(以太坊区块链的本地加密货币)购买。ERC-20只是一个标准,它指定了这些代币的行为方式,因此它们与加密货币交换等其他平台兼容。 那怎么做呢?让我们先来看看以太坊区块链的工作原理。 以太坊是像比特币一样的区块链。与比特币一样,以太坊也会跟踪拥有Ether的用户余额,以太坊的原生加密货币。与比特币不同,以太坊也是一个平台,允许你创建自己的代币而无需创建新的区块链。 你可以使用智能合约创建以太坊代币。ERC-20是一个标准,用于指定此代币智能合约应如何工作。 让我们用一个例子来理解ERC-20代币智能合约的工作原理。假设我们想要创建一个名为“My Token”的代币,其符号为“MTK”,并且存在100,000,000个这样的代币。 首先,代币智能合约跟踪一些基本代币属性。例如,它记录名称“My Token”

oracle经典建表语句【scott】--scott数据作业

微笑、不失礼 提交于 2019-12-05 17:42:15
--1. 选择部门30中的所有员工? SELECT * FROM EMP E WHERE E.DEPTNO = '30'; --2. 列出所有办事员(秘书)的姓名,编号和部门编号? SELECT E.ENAME, E.EMPNO, E.DEPTNO FROM EMP E WHERE E.JOB = '秘书'; --3. 找出佣金高于薪金的员工? SELECT * FROM EMP E WHERE E.COMM > E.SAL; --4. 找出佣金高于薪金的60%的员工? SELECT * FROM EMP E WHERE E.COMM - E.SAL > E.SAL * 0.6; --5. 找出部门10中所有经理(经理)和部门20中所有办事员(秘书)的详细资料? SELECT * FROM EMP E WHERE (E.JOB = '秘书' AND E.DEPTNO = '20') OR (E.JOB = '经理' AND E.DEPTNO = '10'); --6. 找出部门10中所有经理(经理),部门20中所有办事员(秘书), --既不是经理又不是办事员但其薪金大于或等于2000的所有员工的详细资料? SELECT * FROM EMP E WHERE (E.JOB = '秘书' AND E.DEPTNO = '20') OR (E.JOB = '经理' AND E

oracle数据库学习相关笔记-转换函数

不想你离开。 提交于 2019-12-03 20:19:01
-- 转换函数 -- to_number(数值类型的字符):将字符装换为数值 -- to_char(数值或者日期):将数值或者日期转换为字符 -- to_date(日期格式的字符):将字符转换为日期 ------------------------------------- -- 字符转换为数字char--->number select to_number('123') +2 from dual -- 数字转换字符number---->char --指定显示格式: --9表示占位,列如999,999,999会将数字按照三个一组使用逗号隔开 --L表示人民币符号,$表示美元符号 --0可以进行占位分组,但是如果真实数据位数不足,会使用0进行补位 select to_char(123456,'$999,999,999') from dual select to_char(123456,'L999,999,999') from dual select to_char(12345678,'000,000,000,000.000') from dual --查询工资大于2000的员工信息 --数值和字符之间的转换可以隐式转换,to_number可以省略不写。 select * from emp where sal>'2000'; select * form emp where sal>to