
学习
文章平均质量分 63
耗子肉
这个作者很懒,什么都没留下…
展开
-
hadoop无密码登录
ssh-keygen -t rsa~/.ssh下会多出两个文件id_rsa是私钥,.pub是公钥cat id_rsa.pub >> authorized_keys改下权限chmod 600 authorized_keyshdfs启动原创 2021-07-16 15:37:30 · 230 阅读 · 0 评论 -
mongodb基础3
mongodb和java加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency>加配置spring: data: mongodb:原创 2021-07-02 18:32:06 · 236 阅读 · 0 评论 -
mongodb基础2
索引概念不多做介绍,需要提的是mongodb是b树。索引的类型mongodb的索引有很多种单字段索引:常见的索引复合索引:多字段的索引地理空间索引(Geospatial Index):为支持地理空间坐标数据的有效查询,mongodb提供两种特殊索引:返回结果使用平面几何的二维索引返回结果使用球面几何的二维球面索引文本索引(Text Index):支持在集合中搜索字符串内容。这些文本索引不存储特定语言的停止词(例如“the”、“a”、“or”),而将集合中的词作为词干,只存储根词。mo原创 2021-07-02 16:41:40 · 184 阅读 · 0 评论 -
mongodb基础1
启动服务1.mongod --dbpath=..\data\db2.创建mongod.confstorage: dbPath: 绝对路径...\data命令:mongod -f ../conf/mongod.conf 或 mongod --config ../conf/mongod.conf启动控制台bin目录下:mongo --host=127.0.0.1一些命令选择/创建数据库:use 数据库名称查看数据库:show dbs / show da原创 2021-07-02 11:02:27 · 271 阅读 · 2 评论 -
WebFlux的WebClient框架
响应式编程,对于普通前端而言其实没有太大变化,该等多长时间还是要等多长时间,更多的是用在后台服务间的调用上。先写个小demo@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)public @interface ApiServer { String value() default "";}...原创 2021-06-15 23:35:23 · 769 阅读 · 0 评论 -
RouterFunction的webflux
RouterFunction可以运行在servlet或netty上,所以我们需要将两个容器间的不同点抽象出来。1.开发HandleFunction,实现输入ServerRequest,输出ServerResponse原创 2021-06-15 16:22:18 · 833 阅读 · 0 评论 -
响应式WebFlux的CURD
1.加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb-reactive</artifactId> </dependency>2.加注解原创 2021-06-15 15:07:47 · 222 阅读 · 1 评论 -
Spring WebFlux介绍
关于概念,这里不多做介绍,原理之前写过,也不多说了。关于Servletservlet分为同步和异步两种。同步使我们常见的,当请求进来后,tomcat分给每个请求一个线程处原创 2021-06-12 17:47:13 · 357 阅读 · 0 评论 -
stream流
关于stream说了很多,这里简单做补充,中间操作、终止操作。没有调用终止操作的情况下,中间操作也不会执行,这也可以叫惰性求值。关于流的创建有如下方法:原创 2021-06-11 18:02:05 · 226 阅读 · 1 评论 -
函数式编程,lambda相关
lambda,很基础的技术,这里做下回顾,查漏补缺。函数式接口写法,一般2用的比较多:@FunctionalInterfaceinterface Interface1{ int countNum(int i);}public class LambdaDemo { public static void main(String[] args) { Interface1 i1 = (i) -> i * 2; Interface1 i2原创 2021-06-10 16:07:04 · 136 阅读 · 0 评论 -
关于Optional
日常编码过程中,空指针异常非常常见。在jdk8以后,添加了Optional,用来解决这个问题。接下来简单介绍一下Optional:创建Optional其中第一行创建了一个空Optional,get()是从Optional实例中取回实际值对象的方法之一: public static void main(String[] args) { Optional<Haozi> emptyOpt = Optional.empty(); emptyOp..原创 2021-05-12 16:06:39 · 310 阅读 · 1 评论 -
springboot多数据源配置
不是什么稀罕玩意,一百度一大堆,只是为了方便自己copy代码。关于AbstractRoutingDataSource,看源码可以知道,这个是用来连数据库的,配置不同的数据库连接,根据不同的key选择不同的链接。/* * Copyright 2002-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use原创 2020-12-29 17:54:15 · 435 阅读 · 1 评论 -
数据库主从搭建及应用数据源切换
数据库主从架构过程,参考https://www.cnblogs.com/cloudhere/p/10991520.html。java关于主从的应用在这里写一下: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring...原创 2020-04-15 19:57:02 · 397 阅读 · 0 评论 -
linux常用命令
查看防火墙开放的端口号:firewall-cmd --list-ports添加端口:firewall-cmd --zone=public --add-port=80/tcp --permanent关闭端口:firewall-cmd --remove-port=80/tcp --permanent重启防火墙:systemctl reload firewalld...原创 2020-04-12 18:10:10 · 195 阅读 · 0 评论 -
11.防刷限流
之前我们已经讲了流量削峰,接下来讲下防刷限流。首先我们可以使用比较通用的验证码,包装秒杀令牌前置,需要验证码来错峰。我们可以使用awt来生成图片:public class CodeUtil { private static int width = 90;// 定义图片的width private static int height = 20;// 定义图片的heigh...原创 2020-04-11 16:18:45 · 462 阅读 · 0 评论 -
10.秒杀削峰泄洪策略
关于削峰技术,常用场景例如秒杀。为什么要流量削峰?之所以叫秒杀,也就是第一秒的时候流量涌入的问题,瞬时流量变大可能对机器造成影响,因此我们需要把第一秒的流量平滑的过度掉,削弱峰值,把流量平滑的过渡到第二秒或者后面,让系统性能有平滑的提升。对于我们现在没有做任何操作的时候,秒杀下单的接口会被脚本不停地刷。秒杀验证逻辑和秒杀下单接口强关联,代码冗余度高。秒杀验证逻辑复杂,对交易系统产生无关联负载。...原创 2020-04-11 14:45:39 · 609 阅读 · 0 评论 -
9.交易性能优化-事务型消息
之前我们说了一个场景,在交易合法性验证后开始扣减库存,用mq来更改数据库,然后进行订单处理。但是这样有个问题就是,如果之后处理订单的时候出问题了,那么之前mq发的消息撤不回来,数据已经改了,那肯定就有问题了。基于这个情况,我们有一个简单的处理方式,由于我们使用了springboot的事务,他给我们提供了一个事务提交以后执行的接口TransactionSynchronizationManager:...原创 2020-04-10 16:07:54 · 349 阅读 · 0 评论 -
8.交易方面的优化,redis和rocketmq
我们对于交易进行一下200个线程压测,看下应用服务器的资源:再看下压测结果:接下来用1000个线程看下数据库资源:并且耗时也加大了:那么对于下单我们一般会有几个步骤:1.校验商品是否存在,用户是否合法,购买数量是否正确。2.落单减库存。3.订单入库,加商品销量。4.返回前端。通过上面步骤,其实我们对于数据库至少有6次操作,而且在减数据库的时候是根据id操作,那还...原创 2020-04-10 00:38:28 · 1151 阅读 · 0 评论 -
7.关于cdn、页面静态化
我们之前一直都在介绍动态请求的加速,接下来讲一下静态请求,也就是cdn。当请求来到服务器上时,如果是访问静态资源,那么就将请求解析到cdn加速域名中,再由cdn(海量的就近加速节点)就近看有没有存静态资源,有的话直接返回,没有的话去指定的http地址中抓取数据返回并缓存起来,下次就可以直接返回了。接下来配置一下,这里用的是阿里云的:在cdn上添加配置,ip就是nginx的ip:...原创 2020-04-08 12:02:47 · 2694 阅读 · 0 评论 -
6.nginx的共享字典、redis实战简介
首先创建一个lua文件ngx.log(ngx.ERR,"lua sucess");在nginx配置文件中加:启动nginx:也就是说这个脚本会在nginx启动的时候执行。当然,一般用的不多,用的更多的是content_by_lua来指定lua实现什么样的内容,接下来试一下:配置下nginx新建lua脚本:ngx.say("hello static ite...原创 2020-04-07 16:03:23 · 461 阅读 · 0 评论 -
5.查询性能优化
缓存设计对于缓存设计,有几个原则:用快速存取设备,例如内存将缓存推到离用户最近的地方脏缓存清理,也就是数据库变化后,缓存内的数据也要同步更新多级缓存redis缓存对于redis,不同太多介绍了。这里介绍一下单机版和sentinal哨兵模式和集群cluster模式对于哨兵模式,就是用一个sentinal节点管理redis,sentinal和主从redis有长连接,并发...原创 2020-04-07 14:33:55 · 299 阅读 · 0 评论 -
4.会话管理
基于cookie传输sessionid:java tomcat容器session实现对于传统实现,我们经常会用cookie来传输session,将登录状态等信息传到request的session中。基于token传输类似sessionid:java代码session实现在移动端或是很多浏览器会禁用cookie,导致通过cookie不奏效,因此出现了基于token的方式。具体实现后面再说...原创 2020-04-06 17:05:14 · 135 阅读 · 0 评论 -
3.nginx长连接优化
在单机的情况下的压测结果:分布式的压测结果:虽然tps还是比较少,但是还是有提升,主要是因为数据库的服务器的配置是很低的,所以扩展这里其实就更有帮助,这里就不再修改了。而对于nginx和服务之间的连接还是短连接,所以还是有性能消耗,接下来我们把nginx的连接改成长连接:由于数据库服务器配置问题,所以数字上看不出太多变化,如果配置好的机器,变化是非常大的。...原创 2020-04-03 16:18:40 · 760 阅读 · 0 评论 -
2.nginx分布式扩展
通过单机压测可以看到,吞吐量在200-300之间,对于服务器的数据库也有较大的压力。nginx反向代理负载均衡在单机的情况下,容量总归有上限,对于我们看服务器后台进程情况,有这样一个图:表象上:单机cpu使用率增高,内存占用增加,网络带宽使用增加。cpu us:用户空间的cpu使用情况(用户层代码)cpu sy:内核空间的cpu使用情况(系统调用)load aver...原创 2020-04-03 15:56:14 · 360 阅读 · 0 评论 -
1.springboot压测调优
通过压测可以找到服务器的上限,ps -ef |grep java找到java的进程号,然后通过pstree -p 12569 | wc -l可以看到当前java的线程数。当我们的压测到达一定数量的时候,请求会报错:这是可以去看下线程数:也就是由于server端并发线程数上不去,导致客户端请求被拒。首先看下spring-configuration-metadata.json文件...原创 2020-04-02 23:12:34 · 3167 阅读 · 1 评论 -
jemeter性能压测部署
性能压测所需工具:jemeter,可在阿帕奇下载。下载后windows下直接bin目录下cmd启动即可。关于jemeter工具,我们还需要知道几点:线程组:jemeter用来压测高并发下系统的表现,因此jemeter提供了一个线程组的工具,可以并发多个线程进行测试。http请求:发送http请求模块,不用多解释。查看结果树:发送请求的结果。聚合报告:性能压测报告。那么如何使...原创 2020-04-02 21:57:33 · 310 阅读 · 0 评论 -
linux部署java
安装jdk去官网下rpm包,cd到文件夹后运行命令来赋予权限:chmod 777 jdk-8u241-linux-x64.rpm接下来用rpm工具安装java:rpm -ivh jdk-8u241-linux-x64.rpm安装好后可以去usr/java/中查看文件。接下来运行vim ~/.bash_profile配置环境变量,加如图指令安装数据库直接运行yum...原创 2020-04-02 19:16:45 · 225 阅读 · 0 评论 -
mysql分布式性能优化
上面已经介绍了主从的方式,在这里完善一下。主从分布的优点是实现了备份和读写分离,master只需要专门负责写操作,读操作交给slave来执行,然后主从数据库通过bin_log来异步更新,当然这样也会有一个数据不同步的情况,那可以改成同步的吗?当然,mysql有一个半同步的方式,当写请求来到master上之后,必须保证至少一台slave更新了数据,才会返回写成功的信号,当然这种情况下,对于效率会...原创 2020-03-30 17:10:03 · 527 阅读 · 0 评论 -
mysql性能优化
通用性能优化关于通用性能优化,是在缓存、异步、批处理的范畴做优化。批处理关于mysql的应用优化(这里都是指innodb):写操作:批量insert、批量update。解释一下,例如一个支付场景,一个用户买了多个商品,一般我们会循环遍历来对表进行insert操作和update操作。如何优化?我们可以批量一次性的进行insert或是update操作。也就是说前端传来的集合的数据,我们...原创 2020-03-27 17:09:48 · 197 阅读 · 0 评论 -
使用Redisson实现分布式锁
Redisson是架设在Redis基础上的一个java驻内存数据网格,基于NIO的Netty框架上,充分利用了Redis键值数据库提供的一系列优势。并且在java实用工具包中的常用接口基础上,为使用者提供了一系列分布式特性的常用工具类。Redisson使原本作为协调单机多线程并发程序的工具包获得了协调分布式多机多线程并发系统的能力,大大降低了设计和研发大规模分布式系统的难度。同时结合各富特色的...原创 2020-03-27 15:13:13 · 251 阅读 · 0 评论 -
Redis分布式锁
先讲下流程:1.在redis中设置一个锁setnx(lockkey , currenttime+timeout)。2.返回1代表之前没有这个锁,那么就调用expire(lockkey)来重新设置超时时间,执行业务,接下来del(key),释放锁,最后结束。3.返回0代表有这个锁,那么传统流程中就直接结束。优化后,调用get(lockkey)来获取这个锁的超时时间的value。3.1...原创 2020-03-26 19:49:15 · 184 阅读 · 0 评论 -
Springboot集成SpringSession
在传统web应用中,session都是交给容器管理,但是对于分布式或是集群,如果交给web容器管理的话,自然是行不通的,除非是web容器共享session,但是这样做需要入侵web容器,提高问题的复杂度,并且集群机器之间要相互耦合。因此,springsession来了。springSession将session从web容器中剥离出来,单独存在服务器中。目前支持redis、database、mo...原创 2020-03-25 17:29:06 · 623 阅读 · 0 评论 -
Redis分布式
算法原理举个例子,有若干个redis服务,有一个文件,那么这个文件放在哪呢?通常来说先把这个文件进行哈希,然后用redis个数进行取模,hash(file) % num,余数就是对应的服务器编号。假如有4个redis节点,20个数据,根据上面的算法,redis1上存1,2上存2,以此类推。假如节点现在要扩展,变成5个节点,跟4个节点位置没有发生变化的元素是:redis1-1,redis2-...原创 2020-03-23 12:01:31 · 209 阅读 · 0 评论 -
基于Redis的单点登录
加依赖 <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.6.0</version> </dependency>配置:...原创 2020-03-19 23:07:33 · 166 阅读 · 0 评论 -
Redis数据结构的命令
String字符串set a a:插入setex b 100 b:以秒单位设置超时时间psetex c 10000 c:以毫秒为单位设置超时时间getrange haozi 0 2:拿key为haozi的第0到第2个字符getset a aa:修改key为a的值为aa,同时返回旧值amset a1 a1 b1 b1 c1 c1:同时设置多组值mget a1 b1 c1:...原创 2020-03-18 17:39:47 · 118 阅读 · 0 评论 -
Redis基础
之前一直用redis,但一直没有系统全面的学习,接下来学一下。Redis Object内部使用的对象结构有:数据类型(type),编码方式(encoding),数据指针(ptr),虚拟内存(vm),其他信息等Redis Object用来表示所有的key和valueRedis常用数据类型的编码方式raw、int、ht、zipmap、linkedlist、ziplist、intse...原创 2020-03-18 17:03:49 · 138 阅读 · 0 评论 -
Tomcat+nginx集群搭建
Tomcat集群,可以提高服务的性能,并发能力以及高可用性。提供项目架构的横向扩展能力。那么Tomcat集群的实现原理是?通过nginx负载均衡进行请求转发。Tomcat单机部署多应用Linux下:在/etc/profilexia下增加tomcat环境变量:export CATALINA_BASE=/User/haozi/tomcat1export CATALINA_HOM...原创 2020-03-18 16:11:49 · 374 阅读 · 0 评论 -
ALS召回、LR、GBDT排序的实战,A/B Test
在生成ALS和LR模型以后,接下来就可以用在代码中了。首先ALS,其实在数据已经存在数据库中了,只要从中取出来,去掉个逗号之类的就好@Servicepublic class RecommendService { @Autowired private RecommendDOMapper recommendDOMapper; //找回数据,根据userid召回sho...原创 2020-03-16 00:11:28 · 710 阅读 · 0 评论 -
Spark,ALS、LR、GBDT应用
之前说了很多机器学习,接下来讲下Spark,Spark是为大规模数据处理而设计的快速通用的计算引擎。他有很多的库,例如Spark core、Spark Sql、Spark on Hive、Spark Streaming等。还有机器学习库例如Spark mllib等。现在有一个场景,有一个list,里面存的是商品实体,现在需要将这些实体中的id提取到另一个list中,现有阶段就是遍历然后把id提...原创 2020-03-15 22:04:32 · 406 阅读 · 1 评论 -
机器学习简介,ALS、LR、GBDT
市面上的主流app,大多数情况下不同的用户看到的页面都是不同的,这里面就有一个推荐的因素了。那么我们如果想要做推荐,首先需要实现的当然是千人千面,也就是不同的人推荐展示的内容是不一样的,再有就是需要根据场景去推荐。推荐的方法基于规则的推荐:可以按照销量、品类等方式来推荐。基于传统机器学习的推荐:是根据海量的用户的历史行为或门店用户的特征等。当然,上面说的推荐都是基于机器学习的算法。...原创 2020-03-13 18:29:04 · 768 阅读 · 0 评论