自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(128)
  • 收藏
  • 关注

原创 springboot项目中使用docker

docker容器化部署是现在后端集群服务部署的主流方式,我们项目也是基于这种方式,通过swarm管理平台进行集群管理,当需要发布项目时从docker镜像仓库拉取需要发布的镜像,然后让镜像在集群的某一台机器生成容器完成发布。这就需要我们开发将自己的项目在开发完成后把项目打包成docker镜像上传到docker镜像仓库中。我们这里分别介绍一下java springboot项目在maven结构和gradle结构下,如何docker插件完成docker镜像的生成和往docker仓库推送镜像的工作。

2022-11-13 15:29:06 1965 1

原创 redis宕机导致数据丢失的重大生产事故总结

这周五周六经历一次严重的redis宕机导致数据丢失的严重生产数据,并导致了10小时的停服。算是工作以来经历的最大生产事故,今天做一个全面总结,也算是吃一堑长一智。

2022-07-25 00:00:55 1222

原创 redisHyperLogLog原理解析

场景做服务端的同学,应该都遇到过计数场景,比如我想知道浏览某一个web页面的总人数,总次数;查看某条热门动态的总人数总次数;购买某件商品的总人数总次数;对于总次数我们直接基于计数器累加就能很方便的解决,时间和空间复杂度都不高。而对于总人数,常规思路我们都是基于去重数据结构Set来存储,将所有访问了的用户id就存到到set中,最终获取set集合中的元素个数即为总人数。当平台量不大时可能还好,一旦访问人数过大,这将是一笔不小的存储开销,并且随着人数的不断增多,所需要的存储空间也会不断加大,这就有点头疼了。r

2022-05-04 14:21:00 2353 1

原创 利用charles抓包

charles是一款http抓包软件,和fiddler极为相似,所以大家就会问,为啥不用fiddler呢,因为mac没有fiddler。而且charles还是付费版本。所以我们这里从安装破解到抓包成功一步一步讲清楚。下载并安装我们进入charles官网进行下载:https://www.charlesproxy.com/latest-release/download.do ,我是mac,所以选择其中的macOS下载dmg包之后我们正常的安装,安装完成打开,大概就是这样的模样破解我们打开激活码生成界

2022-04-23 11:31:21 3610

原创 mongo的tickets被耗尽导致卡顿问题

    近一年来,项目线上环境的mongo数据库出现多次tickets被耗尽,导致数据库卡顿,并且都是突然出现,等待一段时间后又能自动恢复。为了解决这个问题,我们进行了长期的探索和研究,先后从多个角度进行优化,于此记录和分享一下这一路的历程。tickets是什么    为了解决这个问题,我们首先要明白ticktes是什么,其实网上基本都说的一知半解,没有一个能说明白的,但是有一个查询tieckts消耗情况的mongo命令: db.serverStatus().wiredTiger.concurr

2022-04-13 10:55:25 2933

原创 rabbitmq上云实践

    由于线上rabbitmq集群出现两次问题,一次由于阿里云机器本身宕机,阿里云自动在另一台机器上启动新的rabbitmq服务,导致新的服务中没有对应的队列等等,从而无法进行正常运转;另一次是因为小伙伴的不正确的编码,导致生产者产生的消息瞬间过多压垮了rabbitmq服务,基于两次问题,决定对rabbitmq进行上云尝试,希望依托阿里云来让rabbitmq的服务更加强劲。上云方案    为了实现无感知上云,设计了一套上云流程:让一台机器的生产者和消费者都连接云上rabbitmq集群,确认云上集

2022-02-15 17:03:20 1002

原创 mongo游标使用

    当我们需要读大量数据库数据进行操作时,游标经常是我们的选择之一,其原理是,首次读取数据时只会将所有项数据的index返回回来,然后再分批次读取完整的数据,这样可以避免一次性大量数据读取到服务器中,占用大量内存。同样能够避免大量数据一次性读进内存的方式还有分页查询,但是分页查询存在深翻页问题,会导致越查越慢。另一种游标式翻页(每次记录上一次查询的最后一条,并作为下一次查询的条件之一),这种唯一的缺点就是每次都需要重新做一次查询,但这个损耗也可以基本忽略,但是有一个问题就是,往往这样的条件不好找。  

2021-10-21 18:26:44 539

原创 egret引入外部字体

    由于默认的字体类型都不满足我们的ui设计要求,我们经常需要引入一些外部的字体,这里记录一下egret如何引入外部字体,之前百度和谷歌下来,方式都是一样的,就是在index.html中引入字体样式,然后在需要的地方通过设置fontFamily属性来使用字体,而且有且仅有这样方式,但是这种方式偏偏我怎么试都不行,卡了多日终于解决,这里进行一个详细记录:index.html文件引入字体。网上其实都这么说,但是egret项目中是有两个index.html文件的,网上部分人说是template/web/i

2021-08-18 17:48:27 823

原创 spring-data-mongo的坑之id查询

背景    这是一次生产事故,会后定位到原因是因为spring-data-mongo的id查询导致的,所以将完整的过程都记录一下。我们生产环境有一个mongo表,数据近两千万条,考虑到数据的持续增加,打算进行数据迁移。由于没有现成的索引能进行有效的数据迁移,并且因为表太大也不适合进行建索引,最终的解决方案就是换表。所以这就是一个线上不停机迁表方案,由于该表的读写相对简单,所以采取一次性迁移,流程如下:新数据写进新表数据读取时,先查新表,配置中心增加迁移完成的配置开关,如果开关打开表示迁移没有全部完成

2021-07-29 14:37:35 776

原创 linux配置ssh免密登录

    linux配置ssh或者git免密码登录流程如下(该流程基于当前的ssh可用,如果当前ssh都无法用密码登录,请先解决该问题,可以参考《ssh远程无法访问linux解决方案》):修改配置文件 /etc/ssh/sshd_config## 下面这一行注释取消掉,如果配置的no,改成yes#PubkeyAuthentication yes# The default is to check both .ssh/authorized_keys and .ssh/authorized_keys2

2021-07-29 14:35:47 308

原创 typescript将ES5转ES6

    今天准备使用typescript的Map,结果发现我的egret项目中不支持,但是typescript的文档中明明写着是有这个类可以使用,结果发现上面有一行小字写着ES6支持,我打开项目中的tyconfig.json文件:{ "compilerOptions": { "target": "es5", "outDir": "bin-debug", "experimentalDecorators": true, "lib": [

2021-07-24 22:14:05 956

原创 egret环境问题汇总

    作为egret刚入门的小白这里汇总一些目前遇到过的一些比较棘手并解决了的坑,供大家参考。自定义组件无法显示    我们定义的新的组件皮肤,当我们在新的皮肤中想要使用时,发信显示出来的只有一个框框,没有具体的组件内容,虽然也可以将就着用但很不舒服。原因是我们没有在resource/default.thm.json这个皮肤配置文件中进行配置,该文件默认内容:{ "skins": { "eui.Button": "resource/eui_skins/ButtonSkin.exml", "

2021-06-20 19:25:48 860 3

原创 frp实现内网穿透

背景    如果我们希望在家里搭建一台服务器,并且能够被外网访问,那可以行的方案有两种:1、向宽带运营商申请家庭的公网ip,然后配置防火墙,开放端口,就直接可以被外网访问了。2、通过内网穿透,所谓内网穿透其实就是利用代理服务器进行转发,假设你现在有一台存在有公网ip的服务器(比如租一台阿里云服务器,就会有公网ip)A,然后已有一台本地的内网服务器B。我们通过B连接A,然后我们向A请求数据时,A会将请求转发给B进行请求处理,最后在将结果返回给用户。这样用户就能间接通过A来访问B了。    在可能的情况下通

2021-05-27 17:30:35 406 6

原创 aes加解密

提供一个基于kotlin的aes加解密的工具类:import org.slf4j.LoggerFactoryimport xiaosong.yang.smallshopserver.config.interceptor.AdminDataAuthInterceptorimport java.security.SecureRandomimport javax.crypto.Cipherimport javax.crypto.KeyGeneratorimport javax.crypto.Secr

2021-05-27 12:05:23 164 1

原创 抢红包设计方案

    这两天做了一个抢红包的功能,这里对实现方法进行一个整理,整天的两个难点:1、如何应对红包的高并发。其实红包类似于秒杀这种功能,当一个红包从可以开始抢到全部被抢完,很可能不到一秒钟,所以性能上肯定不能有问题。2、红包的公平性,如何做到红包的相对公平以及防止出现10块钱红包10个人抢,第一个人直接抢了9.8导致后面的人可能不够分的情况。所以这里从这两个问题来展开。做到尽可能公平的抢红包    因为这个主要是算法,比较单一,所以先从这个来。基本上分两个思路,一个是创建红包时,就把m金额的红包拆成n份存

2021-05-07 11:32:41 1838

原创 使用mac自带的apache服务器

    由于需要本地测试一下html等相关静态网站,所以想要本地搭建一个静态服务器,apache是一个不错的选择,结果发现mac本身其实是自带apache的。这里记录一下,如何直接使用mac自带的apache服务。启动&关闭&重启sudo apachectl start/restart/stop直接利用apachectl就可以对apache进行启动和关闭操作,需要注意的是,没事的时候需要记得关闭服务,否则会一直在后台消耗性能。修改服务器目录静态服务器都有一个存放html之类的脚本

2021-05-06 14:19:51 468

原创 mac zsh设置git的自动补全和忽略大小写

    记录一下mac里使用zsh时如何能对git相关指令也能进行tab键自动补全。通过brew 安装 zsh-completionUser% brew install zsh-completion修改.zshrc文件,如果这个文件没有,就新建一个,放在用户目录下vi ~/.zshrc添加以下内容:if type brew &>/dev/null; then FPATH=$(brew --prefix)/share/zsh-completions:$FPATH

2021-04-19 20:02:46 1583

原创 mongo——延长NosqlBoosterForMongo的试用期

    mongo的客户端较少,其中Nosql Booster For Mongo算是一个不错的客户端软件,但是他也不是免费的,试用期只有30天。好在这个软件是基于nodejs的。所以我们可以利用npm对这个应用进行解包串改源码,将源码中设置试用期的参数改成足够大,然后再封包,这样我们就能不断的白嫖了。安装工具首先我们需要安装nodejs的一个包(当然你首先得安装nodejs和npm否则都是扯淡):npm install asar -g我这里的npm安装的工具包默认再~/.npm-global/b

2021-04-09 10:43:06 905 3

原创 mongo——事务详解

    mongo事务的本质是给自己写操作执行到的每一行记录加上一个写锁,而如果同时另一个事务也开始修改当前行时,会尝试去获取这个锁,然后阻塞规定时间,如果还没有获取到就会抛出org.springframework.data.mongodb.UncategorizedMongoDbException: Command failed with error 112 (WriteConflict): 'WriteConflict’的异常。而这个锁会等到事务提交,才会释放。需要注意的时,读操作是没有锁的,所以当你对

2021-04-08 15:05:18 2394

原创 mongo——比较两个字段是否相同

    我们在sql中我们经常有这样的写法select * from table1 where table1.field1 = table1.field2查询数据库中,field1字段和field2字段相同的记录。那这种查询方式在mongo中怎么查呢:方式1:db.test.aggregate([ { $project:{ fields1: 1, fields2: 1, difference: { $e

2021-04-07 20:41:10 2407

原创 爬虫进阶路程5——无头浏览器的坑

    本来以为经历前面四道坑,算是走到了反爬的顶端,没想到不到三个月再次倒下了,因为之前的爬虫程序突然被反爬了,怎都拿不到数据,一开始以为自己的代理ip被封了,但是我一个一个试,换了好多个代理ip,没有一个有用的,难道天下所有的ip都被封了嘛。一开始我是这么认为的。一个偶然,就是我用本地的浏览器来爬数据,是可以的,于是我给本地浏览器也加了一个代理ip,发现还是可以的,而同样的代理ip在linux就不行了。    那原因基本就定位到了,是因为window上我们使用的是正常的浏览器,而linux上我们使用的

2021-02-25 18:05:04 676

原创 mongo——limit的坑

    我们在mongo查询中,通过limit限制查出的条数,但是如果limit传0时,limit则默认失效了,会把整个集合中所有符合条件的数据全部给你取出来。所以在数据量大的时候,不要使用limit(0)。    看到上面的结论,可能有人就会喷了,都0了你还查个屁,怎么会有这种场景。下面是我的经历,我们的一个推荐算法中,但前一种推荐数不满足的时候,会去另外一张表里取出剩余的数量,补齐总推荐数,所以当时想当然的直接拿总数减去前一个推荐结果的数量作为limit条件(如果小于零则取0),去后一个表里去获取剩下

2021-02-20 18:10:52 1549 2

原创 easyexcel封装

    项目中有大量的报表并且有对应的报表导出功能,导出功能都是基于报表当前的查询条件,导出所有页的记录,流程相对单一,所以封装了一个阿里的easyexcel,只需要传入指定参数即可,隔离了文件相关处理流程:import com.alibaba.excel.EasyExcelimport com.alibaba.excel.ExcelWriterimport com.alibaba.excel.metadata.Tableimport com.alibaba.excel.write.metadat

2021-02-20 18:00:12 1037 2

原创 mongo——拆分子节点&数据类型转换&根节点替换

拆分子节点&数据类型转换    我们知道mongo的某个元素是list,我们可以通过unwind把每个子元素拆解出来,然后再通过group可以很方便的对原本的list进行一个聚合操作,但是如果我们的元素的子节点是还是多个普通元素呢,就不能直接 通过unwind将每个子节点进行拆分。这个时候我们需要通过$objectToArray方法,将多个子节点转换成多个list元素,eg:db.finance_pay_daily.aggregate() .match({time:{$gte:ISODa

2021-02-20 17:25:58 326

原创 centos设置swap空间

linux centos 如何设置swap大小?swap的值都是安装系统的时候设置好的,一般设置为内存的两倍大小。使用过程中发现swap值过小只能添加。用free -m 命令查看当前swap大小1、使用下面的命令创建2G的空间dd if=/dev/zero of=/var/swap bs=1024 count=2048000if 表示infile,of表示outfile,bs=1024代表增加的模块大小,count=2048000代表2048000个模块,也就是2G空间2、将目的文件设置为swa

2021-01-29 15:19:29 731

原创 mongo——各种数据原子插入方式

    与mysql的insert不同,mongo在数据插入方面有多种方式,这里进行统一的总结一下:insert    和mysql一样,mongo也支持insert这种直接插入,当插入出现唯一键冲突时则会失败,抛出异常:db.test.insert({ "name":"1223"})save    save是基于主键的文档替换,如果主键存在则其他字段完全替换成新的字段,如果老的字段,新的文档中不存在,则删除了,如果主键原本不存在,这插入一条新的文档。可能会觉得这种方式挺好的,不会出现

2021-01-12 13:40:56 619

原创 爬虫进阶路程4——绕过ip反爬

概述    如果走到了这里,算是到了爬虫的终极,因为这说明别人的服务器除了通过并发速度来识别出你是爬虫已经没有其他方式阻止你了,到了这里你也没有太多花里胡哨的招式,就一招:ip代理池。原理也很简单,既然别人通过识别你单台设备的频率来判断你是一个爬虫,那你就让你的爬虫脚本从许多个ip去爬取数据,从而降低单台服务器的频率。所谓ip代理池,理解起来其实就是类似一个正向代理池子,有很多个正向代理,然后你通过这些代理去请求目标url,就能拿到你要的数据了。    我在开篇中讲到,自己通过阿里云去爬取数据,发现根本

2020-12-21 16:50:31 711

原创 爬虫进阶路程3——绕开selenium反爬

    在《爬虫进阶路程1——开篇》中说道过,自己本以为使用了selenium就万事大吉了,结果发现使用selenium之后还是死了的,似乎别人的代码能够识别出自己使用了selenium,查资料下来确实如此,反爬手段其实也简单,就是去获取你当前浏览器的一些基本信息,如果包含了selenium打开浏览器的一些特征,就认为你是selenium,而不是正常的浏览器。知道他反爬的原理,其实就知道怎么解决了,无非两种:在他进行特征判断之前进行篡改,如果你是客户端判断,就要修改源代码,如果是服务端判断,就要修改请求

2020-12-15 14:09:33 1199 2

原创 爬虫进阶路程2——centos安装各个版本chrome

    接《爬虫进阶路程1——开篇》,里面讲到使用selenium进行实现高级别的爬虫,能够绕过那些绞尽脑汁是js复杂化的反爬方式,而selenium是需要配合浏览器来搭配使用的,这里就来讲一下如何在linux安装无头浏览器,window上怎么装就不讲了,直接百度很容易就装上了,但是如果正儿八经做爬虫的肯定不会止步于在自己PC上来爬数据,最终一定是走linux服务器的。安装    这里主要通过yum本地安装rpm包来完成的chrome浏览器安装的,chrome安装包各版本下载地址如下:https://w

2020-12-10 19:48:07 865

原创 centos安装各个版本的java

    centos中安装各个版本的java,一般两种方式:使用yum或者软件压缩包,java这里我们采用软件压缩包来安装。如果之前已经用rpm包安装过其他jdk版本,可以通过以下方式进行卸载。卸载rpm方式安装的jdk查到到对应的软件rpm -qa | grep jdk使用rpm -e --nodeps 命令删除上面查找到的内容rpm -e --nodeps java-1.6.0-openjdk-devel-1.6.0.38-1.13.10.0.el6_7.x86_64全部删除完

2020-12-10 14:36:35 1121

原创 调试redis的lua脚本

    有时候我们在程序中需要使用到redis的lua脚本,但是如果lua脚本中报错了,我们该怎么像普通程序一样进行单步调试呢。客户端方式下载Lua编辑器ZeroBrane Studio:https://studio.zerobrane.com/support,没有强制付费https://studio.zerobrane.com/download?not-this-time,可以使用免安装版。下载ZeroBrane Studio的Redis扩展:https://raw.githubuserconte

2020-12-07 14:08:08 526

原创 kotlin局部变量实现接口

    java8中引入了Lambda表达式,其中带来的一个好处就是,我们实现匿名类时变得更加简洁:java8以前: //对于类的方法覆盖 Thread thread1 = new Thread() { @Override public void run() { System.out.println("hahah"); } }; threa

2020-12-07 11:21:43 535

原创 爬虫进阶路程1——开篇

    终于弄好了,长舒一口气,经过几天的奋斗,终于把整个小东西克服了。既然是开篇,先介绍一下事情的原委:几周前自己通过fiddler分析某股票App上的数据接口,并根据自己的一些设想,利用这些接口爬取了少量数据进行了验证,发现效果良好。正当自己信心满满准备扩大数据集最更大范围内的验证时,发现后院失火了:之前整理出来的数据接口都拿不到数据了,注意是拿不到数据,而不是调不通。我将链接放到浏览器中打开,发现一点问题都没有,但是直接通过接口请求,返回的确实几条简单的js引用和一句window.location.h

2020-11-20 17:41:49 302

原创 mongo文档子列表元素查询

    由于mongo是一个树状结构数据存储,所以我们往往需要基于子文档去查询某个东西,比如数据如下:{ "_id" : "97d73f8dd62a4c659c37335e321b8cc8", "end_time" : ISODate("2020-12-01T00:00:00.000+08:00"), "start_time" : ISODate("2020-11-01T14:00:00.000+08:00"), "week_cfg" : [ NumberInt(0), NumberInt

2020-11-03 15:40:30 675

原创 spring——基于mongo的二维索引实现附近的人

    最近我们项目中增加了附近的人功能,如果单从实现上考虑其实没有什么难度,采集用户的经纬度坐标,然后用户调用接口去查询附近的人,根据用户的当前坐标去db里一个一个算距离,如果我们用户数就几十几百个,可能每次调接口的时候去算,也能够接受,但是如果你有几百万甚至上亿用户,用户每次来获取附近的人,你就把所有的人的坐标和当前距离算一遍,再排个序,肯定炸了。经过研究发现,现有的一些app,比如微信,陌陌等都是有附近的人这个功能的,而这种空间距离计算,其实都是基于geohash这个算法。    我们都知道在一位数

2020-11-02 20:03:12 260

原创 fiddler——抓苹果手机的包

    fiddler用于抓http/https包的,如果你是其他协议的,fiddler无法抓到。整理一下fiddler如何抓苹果手机里app的包。fiddler的配置修改配置fiddler可以拦截https请求(毕竟现在基本都是https协议)[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ikorBKEY-1603780447090)(…\picture_back_up\fiddler配置解密https.webp)]配置fiddler可以接受远程连接[外链图片转

2020-10-27 14:34:30 1511 1

原创 对在线用户进行多维度获取

    有时候我们需要对对用户进行多维度的获取,eg:获取男性用户列表,获取会员用户列表,获取有xx性质的用户列表,这些多维度性质一般都保存在数据库中,我们可以通过sql很方便的查询,另一方面由于这些特性都不是频繁更改的特性,在落库时也没有很大的压力。而用户的在线状态,在很多系统中可能也没有落库压力,根据心跳包来判断用户是否在线,如果心跳停止了,则认为用户下线然后状态落库,但是我们系统底层架构设计不允许这么做,因为后端业务服务器和客户端不直接建立长连接,全部提供restful接口,那没有长连接怎么实现消息推

2020-10-26 11:33:20 211 1

原创 springboot——多环境配置文件

    自己手上有一个项目,想要分环境设置yml配置文件,比如数据库,密钥等,各个环境都配置的不一样。但是又有一些公共的配置,比如一些需要进行配置化的业务常量等。比如当下有开发和生产环境,需要有三个配置文件:application.yml,application-dev.yml,application-prod.yml。其中application.yml为公共配置文件,在其中配置:spring: profiles: active: dev这样开发环境启动的时候,默认加载applicatio

2020-10-16 10:40:35 134

原创 spring——基于mongolist元素实现固定大小队列

    最近手上有一个需求,需要记录任意两人的会话,并且需要记录最近N条聊天记录。我们首先可以想到一个表记录所有人的聊天记录:发送方,接收方,发送内容,时间。然后一个表记录会话,用户1,用户2,最新的会话时间。然后根据会话表查询聊天记录表获取两人之间的按时间倒序的聊天内容。但是如果最近的N条聊天记录要同会话列表有一同展示就有点头秃了。如果查到一个会话列表,然后遍历去查每个会话的前N条聊天记录。那假设每查一次200ms(因为聊天记录表是庞大的,就算加上了索引,也在几百毫秒的性能损耗),那如果一个列表50条数据

2020-10-14 11:12:33 197

原创 IDEA——执行gradle任务输出乱码

    通过IDEA执行gradle的任务时,在终端的输出出现中文乱码。解决方法是Help->Edit Custom VM Options,然后再最后一行加上-Dfile.encoding=UTF-8重启IDEA即可解决,一定要重启!!!

2020-10-10 16:18:50 434

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除