![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
存储
文章平均质量分 78
菜爷面馆
大家好,
我叫青菜,
原阿里巴巴资资深软件工程师,
原梵帝IT技术总监,
45岁转行学厨师,
你们愿意看我怎么学厨师,
然后一步步走上创业之路吗?
展开
-
Redis应用之二分布式锁2
1、设置锁的超时时间,超时时间不能设置太短,一定要比业务代码执行耗时最长的时间再大一些,一般设置为3秒差不多,上一篇文章用了Redis分布式锁还产生问题的原因就是因为超时时间设置太短造成的,业务代码还未执行完,锁就失效被另外一个线程持有然后在并发量大的情况就产生问题了。将代码部署在两台机器,库存设置为10000, set "inventory:9321785256118" 10000,然后Jemter创建两个线程组,每个线程组起500个线程,循环执行10次,结果库存值为0,没有产生并发问题。原创 2023-11-13 22:30:44 · 153 阅读 · 0 评论 -
Redis应用之二分布式锁
将代码部署到两台机器,然后用Jmeter创建两个线程组,分别对两台机器接口进行请求,每个请求只使用一个线程请求500次,执行结果 Redis中的库存值并不为0,而是大于0不确定的值(第一次结果348,第二次结果55),如果改成每个线程组的线程数为10个请求次数为50次,这时结果会更大一些。这就是分布式环境多台机器并发的问题,多台机器从Redis中取出相同的值,然后分别再执行扣减库存操作,结果就会发生超卖的问题,线程数更多结果更大这是因为更多的请求从Redis中取出了相同的值,然后进行扣减库存。原创 2023-11-13 22:16:57 · 235 阅读 · 0 评论 -
Redis应用之一自增编号
淘宝订单编号 827768001755267512 ,共18位,其中最后6位是不变的,这个订单编码变更过几次,现在具体规则我也不太清楚,原来和淘宝的商品中心打过一些交道,好像还下载代码,不管是表结构还是代码架构扩展性做得很好,不像商品发布Shell平台那么乱。Redis是IO多路复用单线程模型,一个CPU绑定了一块内存区域,所有客户端的命令都会放入队列,然后逐条执行,所以Redis INCR命令本身是原子性的,它能保证每次返回的结果不会是相同的值,可以做为原子性计数器。订单编码要保证绝对不能重复。原创 2023-11-13 22:00:47 · 569 阅读 · 0 评论 -
Redis被攻击纪实
1、2017年时候测试环境安装的是Redis4.0版本(或者更低,记不太清了),默认安装6379端口可以远程访问,然后被黑了,被人家做为挖矿机,他们太狠了,一定要把我CPU耗尽,搞得别的程序都跑不了(这样别人不就发现了吗,不能控制CPU的占用情况吗?上周新来的同事分享Redis的原理和机制,想起2017年的时候测试环境Redis被攻击,最后只能重新安装服务器,今天试验一把利用Redis漏洞进行攻击,只有理解了别人是怎么攻击的,才能更好地进行防范。注:忘记截屏了,重启了Redis,那个注入的key找不到了。原创 2023-11-08 17:43:04 · 440 阅读 · 0 评论 -
MySQL Too Many Connections
可以查看当前MySQL允许打开的文件句柄数,我们在设置max_connections最大连接数时不能超过 open_files_limit的值,因为 open_files_limit除了包含Socket连接还包含打开的文件数(数据库表文件等,如下图),如果max_connections大于open_files_limit MySQL是无法启动的。:调整max_connections的值,在MySQL命令行中执行后可以立即生效,但MySQL服务器重启后会被恢复成默认的设置。原创 2023-11-05 11:33:26 · 131 阅读 · 0 评论 -
MySQL Create table as select无法执行
MySQL5.6及更低版本系统参数enforce_gtid_consistency 默认值为OFF,MySQL5.7及更高版本默认值为ON,当设置为ON时,MySQL只允许能够保障事务安全并且能够被日志记录的语句才会被执行,而像create table as select 或create temporarytable 这种一条语句中包括事务和非事务是不被允许执行的。根据GTID可以知道事务最初是在哪个实例上提交的,可以更简单实现主从复制且更安全。注:下次写一篇传统的主从复制和GTID主从复制的文章。原创 2023-11-05 10:32:11 · 1409 阅读 · 0 评论 -
MySQL BinLog实战应用之二
注:这里是仅单机环境,我们的场景单机也就可以了,如果要保证可靠性使用多个接收端,需要引入zk来保证同一时间只有一个消费端工作,因为canal通过ack保证必须按顺序消费,以免数据无序造成数据错乱。我们知道MySQL主从复制是Mster将数据变更写入BinLog,然后Slave将Master的BinLog拷贝到它的中继日志,最后重放中继日志完成将数据同步到Slave。Canal其实它就是参考主从复制原理,将自己伪装成Slave,接收Master推送的二进制日志。类似于MQ的消息接收端。原创 2023-11-03 09:54:28 · 184 阅读 · 0 评论 -
MySQL Binlog实战应用之一
最开始了解到BinLog是在2007年左右,当时公司会员数据库是1主3从架构,主从复制其实是依赖于binlog,印象比较深的就是主从复制延迟的问题。2、对接Binlog日志解析数据生成日志数据,这种方案可以记录字段变更前旧值以及变更后的值,但日志不够清晰,主要是记录谁什么时间对哪张表哪个字段做了变更,变更前数据是什么,变更后数据是什么。记录的方式是行,即如果批量修改数据,记录的不是批量修改的SQL语句事件,而是每条记录被更改的SQL语句。安装的MySQL默认是没有开启BinLog的,可以用命令进行确认。原创 2023-11-02 09:03:11 · 196 阅读 · 0 评论 -
ElasticSearch 同步数据变少了
至于我们的问题是因为开始是使用数据库的自增ID做为ES的ID(文档内容中也含有ID),但我们数据库的ID是有断层的情况(测试环境做了物理删除,有跳跃的情况),然后ES就凌乱了,后面不管3721,把ID换成ES内部自增ID就好了。结论:更新(重新写入,数据内容不变)实际上原来老的文档标记为删除状态,并新增一个新的文档,版本号为原来文档版本号+1。有两种方式生成,第一种是ES自动生成,Base64编码20位的唯一ID.另外一种是手动指定ID,比如来自数据库的自增ID或UUID,但要确保是唯一的。原创 2023-09-30 16:24:17 · 583 阅读 · 0 评论 -
ELK介绍
前面的章节我们介绍通过ES Client将数据同步到ElasticSearch中,但是像日志这种数据没有必要自己写代码同步到ES那样会折腾死,直接采用ELK方案就好,ELK是Elasticsearch、Logstash、Kibana三款开源软件的缩写,ELK主要用于收集多台服务器日志统一整合后提供给用户。优点是架构简单,缺点是Logstash比较占资源,并且当Logstash故障时数据会丢失,这种加构用来收集系统日志没什么问题,但用于同步业务数据肯定是不行的。原创 2023-09-30 16:19:56 · 763 阅读 · 0 评论 -
ElasticSearch 10000条查询数量限制
我们将库存快照数据导入ES后发现要分页查询10000条以后的记录会报错,这是因为ES通过index.max_result_window这个参数控制能够获取数据总数from+size最大值,默认限制是10000条,因为ES考虑到数据要从其它节点上报到协调节点如果搜索请求的数据越多,会导致ES协调节点占用的堆内存和搜索排序时间越大,但是我们又有这样的需求,虽然页面展示不需要翻到10000条记录后,但在导出XLS是需要将20万条数据一次性导出,本文介绍如何实现。它们分页的组件如下,从产品层面避免了深度分页。原创 2023-09-30 16:05:43 · 3934 阅读 · 0 评论 -
ElasticSearch更新数据后查不到的问题
ES在进行写操作时,会先在内存中缓存一段数据,然后采取一定的策略,将 这些数据写入磁盘,这个过程称Refresh,每次Refresh都会产生一个新的Lucene段,但段过多又会消耗文件句柄,内存,所以又有一定的策略将这些较小的段合并为大的段,刷新的ES默认采用每隔1秒定时刷新,所以刚写进去的数据立即去查极有可能是查不到。原创 2023-09-30 15:39:36 · 1793 阅读 · 0 评论 -
ElasticSearch一对多关系方案
使用MySQL做为存储,表与表之间有很多是一对多关系,比如订单和订单商品明细,客户和客户地址等等,但是因为ES本身是扁平化文档结构,一般不同索引之间是没有关系的,ES在处理这种关系时相比MySQL并不擅长,不过也提供了几种方式来支持这种关系,下面就以客户和客户地址(一个客户有多个地址)为例来讲述一下各种类型存储的优缺点,正好我们本周一个迭代要把客户数据迁移到ES中。注:使用join表示父子关联结构,relations里的custmoer是父文档,customerAddr是子文档。原创 2023-09-30 09:55:31 · 1075 阅读 · 0 评论 -
ElasticSearch映射与模板介绍
索引模板的使用场景:比如我们的库存快照数据需要按天创建索引存储数据,即每天一个索引文件,如果没有索引模板,我们就需要每天定时创建索引映射,但有了索引模板,你插入数据时会检查有没有此索引名称匹配的索引模板,如果有就按模板创建索引映射最后插入数据。前面有相关系列文章介绍了ES的基本概念和各种版本SDK的使用,ES现在已升级到8.5版本,有些概念和SDK用法都有很大变化,后续ES相关的文章会以8.3版本为基准介绍一些实际中应用需要掌握的概念以及一些比较实际的例子。字段和字段类型会根据规则自动创建。原创 2023-09-29 22:48:48 · 664 阅读 · 0 评论 -
搭建自己的搜索引擎之五
前面介绍的几种方法中,TransportClient、Jest新版本里都不建议再去使用,官方提供的RestClient API相对来讲学习成本有点高,而Spring Data Elasticsearche 因为有着与其它Spring Data成员通用的接口,相对来讲更简单。注:四种API使用Spring-Data-ES相对来讲是最简单的,简单的东西才是最好的,想起了觉醒年代里陈独秀、胡适等人提倡的白话文。注:主要就是Spring-data-Es提供的注解@Document、@Field等定义。原创 2023-09-29 21:11:35 · 2453 阅读 · 0 评论 -
搭建自己的搜索引擎之四
注:这种查询语法直接是很难写正确的,有一个小技巧,你可以用ElasticSearch-Head界面操作然后查看浏览器Network发出请求的PayLoad复制过来即可,它的增删改都与直接使用RestFul操作语法一样,只不过RestClient包装了Http请求响应的处理。使用HTTP REST风格交互,客户端发送请求到ES的任何节点,节点会通过transport接口将请求路由到其他节点,完成数据处理后汇总并返回客户端,客户端负载低,它又有两套API。注:有点类似于孔乙己说茴字的四种写法。原创 2023-09-29 10:41:26 · 2498 阅读 · 0 评论 -
搭建自己的搜索引擎之三
ElasticSearch中可以包含多个索引,每个索引中可以包含多个类型(高版本(7.X以上)只能包含一个类型,类型名就为_doc,据说后续8.X的已经把类型这个概念去掉了),每个类型包含多个文档,每个文档包含多个字段。创建索引并设置字段类型,可以理解为创建一张表结构,settings设置索引的一些信息,这里设置了分片,因为我们还是单节点,这里先设置为了1,打开head可以查看索引信息。注:ES修改文档其实是先删除旧的文档然后再重新创建新文档,用HEAD查看文档内容可以发现_version变成2了。原创 2023-09-29 10:32:42 · 2012 阅读 · 0 评论 -
搭建自己的搜索引擎之二
ElasticSearch默认会使用JAVA_HOME环境变量配置的JAVA,要使用内置JDK需要修改启动文件bin/elasticsearch-env,注释掉下面这几行。ElasticSearch-head是用来监控ElasticSearch状态的客户端插件,包括数据可视化、执行增删改查操作等,它需要依赖于依赖于Node环境,ElasticSearch版本更新比较频繁,当前已经是8.0版本了,我这里安装的是7.1.1版本,其它版本详细说明可以查阅官方文档。然后就可以创建索引、查询数据,下一篇再讲了。原创 2023-09-22 07:49:11 · 1152 阅读 · 0 评论 -
搭建自己的搜索引擎之一
1、10几年前在东奇软件做企业网站时玩过Lucene,当时中文分词还很弱,很多词搜不出来,印象中当时好像是给中国银行做企业网站,然后我的技术被银行的人鄙视,不过银行技术部门的人虽然会做银行的信息系统,但用的是C或Dephi,还不会JSP根本不会做网站,哈哈。英文单词比较简单直接空格分词,中文需要分词器,过滤掉无意义的词比如in、too等,过滤掉标点符号,然后统一大小写,还原lives和lived成live,这样通过查live可以把lives和lived一起查出来。单词1 出现的次数 ,单词1出现的位置;原创 2023-09-22 07:40:45 · 561 阅读 · 0 评论