# gmall1031 **Repository Path**: Springhuge/gmall1031 ## Basic Information - **Project Name**: gmall1031 - **Description**: 电商项目(ssm),对dubbo和redis的简单应用 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2019-11-17 - **Last Updated**: 2022-07-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README //gmall 1031 本地修改版本 ============================================================== 使用window连接linux上的zookeeper时一定要将虚拟机的防火墙关闭才可以连接 关闭防火墙命令:service iptables stop =============================================================== gamll-user-service 用户服务的service层8070 gamll-user-web用户服务的web层8080 gmall-manage-service 后台管理service层 8071 gmall-manage-web 后台管理用户service层 8081 //gmall-item-service 前台的商品详情服务 8072 直接调用manage-service服务 gmall-item-web 前台的商品详情展示 8082 gmall-search-web 搜索服务的前台 8083 gmall-search-service 搜索服务的后台 8074 gmall-redisson-test redissson测试项目 gmall-web-service-test webservice 服务端学习项目 gmall-web-service-client-test webservice 客户端学习项目 ================================================================================= 前后端跨域问题: 端口号不同,ip地址不同都是跨域问题 1.前端127.0.0.1:8888 2.后端127.0.0.1:8080 前端和后端因为来自不同的网域,所以在http的安全协议策略下,不信任 3.解决方案: a.在前端请求添加跨域协议 b.在SpringMvc的控制层加入@CrossOrigin跨域访问的注解 ================================================================================= 引入分布式文件系统 fastdfs 引入thymeleaf模板技术 引入redis 增加一个redis工具类,用来初始化redis的池子 增加一个redis配置类,将redis的配置写入spring的容器中 ================================================================================= redis 常见问题: 1.缓存在高并发和安全压力下的一些问题 a.缓存击穿:对一些设置了过期时间的key,如果这些key可能会在某些时间点被高并发的访问,是一种非常"热点"的数据。这个时候,需要考虑一个 问题:如果这个key在大量请求同时进来前正好失效,那么所有对这个key的数据查询都落到db,我们成为缓存击穿。 和缓存雪崩的区别: 击穿是一个热点key失效 雪崩是很多key集体失效 解决: b.缓存穿透:是指查询一个一定不存在的数据,由于缓存时不命中,将去查询数据库,但是数据库也无此记录,并且处于容错考虑,我们没有将这次 查询的null值写入缓存,这将导致这个不存在的的数据每次请求都要到存储层去查询,失去了缓存的意义。在流量大时,可能DB就挂掉了,要是有人利 用这个不存在的key频繁攻击我们的应用,这就是漏洞。 解决:空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。 c.缓存雪崩:缓存雪崩式指我们在设置缓存时采用了相同的过期时间,导致缓存在某一时刻同时失效,请求全部转发到DB,DB瞬时压力过重雪崩。 解决:原有的失效时间基础上增加一个随机值,比如1-5分钟随机,这样每一个缓存的福哦其时间的重复率就会降低,就很难引发集体失效 的事件。 穿透:利用不存在的key去攻击mysql数据库。 雪崩:缓存中的很多key失效,导致数据库负载过重宕机。 击穿:在正常的访问下,如果缓存失效,如何保护mysql,重启服务。 2.如何解决缓存的问题 使用redis数据库的分布式锁,解决mysql的访问压力问题 第一种分布式锁:redis自带一个分布式锁,set px nx Key Value 过期时间 分布式锁参数只有不存在才能参数成功 set sku:108:lock 1 px 60000 nx 问题1:如果在reids中的锁已经过期了,然后锁过期的那个请求又执行完毕,回来删 锁,删除了其他线程的锁,怎么办? 在加锁的时候给在给v的值加一个随机的值,在删锁的时候先去获取这个锁的值,当值存 在且值于之前的token相同的时候,在去删除锁。 问题2:如果碰巧在查询redis锁还没有删除的时候,正在网络传输时,锁过期了,怎么办? 可以用lua脚本,在查询到key的同时删除该key,防止高并发下的意外的发生 String script = "if redis.call('get',key[1])==ARGV[1] then return redis.call('del',key[1]) else return 0 end"; jedis.eval(script,Collections.singletonList("lock"),Collections.singletonList(token)); 第二种分布式锁:redisoon框架,一个redis的juc的实现(既有jedis的功能,又有juc的功能) ​ ================================================================================= 使用apache工具httpb对redis进行压力测试,端口为9999 压测命令:ab -c 200 -n 1000 http:nginx ab -c 200 -n 1000 http://127.0.0.1/testRedisson 解决端口被占用问题 修改httpd端口 默认httpd端口为80,现在改成800 修改两个地方: 1.修改配置文件httpd.conf listen 80 把80改成需要的端口 2.修改配置文件**httpd-vhosts.conf** ``` DocumentRoot "E:/wamp/www/test" ServerName test.cm ServerAlias test.cm ErrorLog "logs/dummy-host.example.com-error.log" CustomLog "logs/dummy-host.example.com-access.log" common DocumentRoot "E:/wamp/www/test" ServerName test.cm ServerAlias test.cm ErrorLog "logs/dummy-host.example.com-error.log" CustomLog "logs/dummy-host.example.com-access.log" common ``` 把80改成需要的端口 如果是xampp在启动项vi xampp if testport 80 then $GETTEXT -s "fail." echo "XAMPP: " $($GETTEXT 'Another web server is already running.') return 1 把80改成需要的端口 搜索引擎 elasticSearch6 (和elasticSearch5的区别在于,root用户权限、一个库能否建立多个表) 进行文本搜索(以空间换算时间算法)文本比对文本速度就会快很多。 同类产品solr、ElaticSearch、Hermes(腾讯)(实时检索分析) ElaticSearch和solr一样都是基于lucene(apache),默认以集群方式工作。 ​ ​ Lucene是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎,搜索引擎产品简介。 ​ 搜索引擎(以百度和goole为例)的工作原理是什么? ​ 1.爬虫 ​ 2.分析 ​ 3.查询 ​ ​ elasticSearch(搜索引擎算法)的算法 ​ 倒排索引(在内容上建立索引,用内容区匹配索引) ​ Btree(balance tree b-tree) ​ B+tree ​ es的配置 ​ 需要改成其他非root用户启动 ​ es使用的jvm默认内存大小要大于2G才可以使用 ​ Exception in thread "main" java.nio.file.AccessDeniedException:/opt/es/elasticsearch/elasticsearch-6. ​ 在elasticSearch中的config目录下修改jvm.option配置能够使用jvm内存大小,建议使用1到4G ​ 在elasticSearch.yml(集群配置文件)配置es的host地址,配成本机地址,外面才可以访问 es的概念 1.通过(9200端口)http协议进行交互 GET/_cat/indeices?v http的get请求,_cat下划线的关键字,indeices索引 2.基本概念 Index 库 Type 表 Document 行(一条数据) Field 字段 3.第一命令 ​ 建立索引 ​ 增删改查命令 ​ PUT ​ DELETE ​ POST ​ GET ​ es默认不识别中文,需要引入ik分词器 ​ ik(中英文分词器)默认有两个: ​ 1.ik_smart(简易分词) ​ 2.ik_max_word(尽最大分词) ​ ``` 相关系算分数: 查询的关键字在进行分词处理后,与es的文档(分词处理并建立了索引)之间的相关度的高低。 ``` es查询api Search search = new Search.Builder("dsl的json语句").addIndex("索引名").addType("表名").builder(); 查询的dsl的封装工具类 ``` { //jest的dsl工具 SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder(); //bool BoolQueryBuilder boolQueryBuilder = new BoolQueryBuilder(); //filter boolQueryBuilder.filter(null); //must boolQueryBuilder.must(null); //query searchSourceBuilder.query(boolQueryBuilder); //from searchSourceBuilder.from(0); //size searchSourceBuilder.size(20); //highlight searchSourceBuilder.highlight(null); //用api执行复杂查询 List pmsSearchSkuInfos = new ArrayList<>(); Search search = new Search.Builder("{\n" + " \"query\": {\n" + " \"match\": {\n" + " \"skuName\": \"华为\"\n" + " }\n" + " }\n" + "}").addIndex("gmall1031").addType("PmsSkuInfo").build(); SearchResult execute = jestClient.execute(search); List> hits = execute.getHits(PmsSearchSkuInfo.class); for (SearchResult.Hit hit : hits) { PmsSearchSkuInfo source = hit.source; pmsSearchSkuInfos.add(source); } System.out.println(pmsSearchSkuInfos); } ```