小工具      在线工具  汉语词典  css  js  c++  java

乐檬商城是一个全品类的电商项目
项目主要采用分布式架构,达博+zookeeper整合ssm
主要技术有:springsecurity、弹性搜索、springdata-redis、rabbitmq、thymeleaf模板引擎、cas单点登录、分布式事务等
用到的第三方接口有:阿里云的OSS、阿里云的短信服务、微信的统一下单接口、查询接口等
前端技术有:vue、elementUI、vue-router、qrcode、axios等
数据库有:mysql、Redis、elasticsearch

主要架构主要分为:服务层、应用层、公共层

常用软件端口号
3306端口:MYSQL数据库端口
6379端口:Redis数据库端口
8080端口:(tomcat)TCP服务端默认端口
9200端口:Elasticsearch服务器端口
5601端口:kibana端口

RabbitMQ  端口号:4369 \ WEB  页面的端口15672
activeMQ的两个默认端口 8161是后台管理系统,61616是给java用的tcp端口。

应用层包就是面向用户的,
    主要包括:
        后台管理端,主要就是商品信息的维护,包括品牌、分类、模板、规格、参数、相册、商品等信息的维护,以及后端RBAC权限模型的集成
        用户中心,主要是面向用户的个人中心模块,在网站前台面向用户使用的,比如查看个人订单、物流信息、以及个人信息维护等
        网站前台,是网站的入口,这里主要包括了:首页、分类模块、轮播图模块、搜索、详情页、加入购物车、购物车信息维护、提交订单、支付、微信通知、支付成功通知跳转等模块
服务层是给应用层提供服务的,服务层面向数据库,提供数据支持,主要包括
    主要包括:
        商品服务,主要是给后台管理模块提供服务以及数据支持
        用户服务,主要是给前台用户提供注册、以及用户中心的信息维护
        短信服务,所有的发短信业务都在这里
        业务模块,轮播图、广告等相关业务在这里
        订单模块,主要是订单、购物车等前台模块的重要服务
        系统模块,主要是管理端菜单以及管理人员以及权限等的相关配置

1、前端主页模块是面向用户的主页,因此数据加载速度是一个重要的要求。因此首页的分类、轮播图片等信息都会被缓存并预热到redis中。相应信息变更后会同步。修改缓存信息

Redis相关面试题

1、Redis是基于C语言开发的key-value形式的nosql数据库,数据存储在内存中,有string hash list set zset 五种数据类型
2、由于数据存储在内存中,为防止服务器宕机数据丢失,支持RDB和 AOF 俩种持久化方式。
RDB: 默认开启,把内存快照的形式把内存中的数据持久化到本地磁盘文件。
AOF: 默认不开启,需要手动开启,设置appendonly 值为yes;aof是把写或删除的操作(命令)日志以追加的方式保存磁盘文件

2.谈谈对Redis缓存使用的理解

1、Redis缓存使用,首先查询数据时先从Redis缓存中查询,如果缓存中有数据,直接返回数据。如果查询不到,再去数据库中查询,查到数据添加到Redis缓存,返回查询的数据。

2、Redis缓存涉及到数据同步问题: 
当数据库数据发生变化时,Redis缓存中的数据也需要同步,否则导致数据不一致。
所以,数据新增、修改、删除时,把Redis缓存的数据清空。当再次查询时,先从数据库查询,然后把数据缓存到Redis中;这样就保证了数据的同步。
数据发生变化时,Redis缓存中的数据也需要同步,否则导致数据不一致。

3.介绍Redis缓存雪崩?

缓存雪崩造成因素有2个:
1、Redis服务器宕机
2、同一时间Redis中缓存的数据大量过期,原本该去缓存查询的大量请求,有缓存出现问题,全都去数据查询,导致数据压力太大,系统崩溃。
解决方案:
可以给key的过期时间+随机数(让key的过期时间尽可能的分散)

4.介绍Redis缓存穿透

缓存穿透是指用户查询数据,在数据库没有,自然在缓存中也不会有。这样就导致用户查询的时候,在缓存中找不到,每次都要去数据库再查询一遍,然后返回空(相当于进行了两次无用的查询)。这样请求就绕过缓存直接查数据库。

解决方案:
查询数据库如果没有,也要在Redis缓存一个空数据(key的value值:空字符串)。
但是有可能出现缓存同步问题:
解决方案: key设置一个很短的过期时间。key过期以后,Redis会清空这个key ,下次去查询时候,Redis中查不到,就会去查数据库,如果数据库查到值,就可以缓存到Redis,从而保证数据的同步。

5.Redis过期策略

● 定时删除:在设置key的过期时间的同时,为该key创建一个定时器,让定时器在key的过期时间来临时,对key进行删除
● 惰性删除:key过期的时候不删除,每次从数据库获取key的时候去检查是否过期,若过期,则删除,返回null
● 定期删除:每隔一段时间执行一次删除过期key操作
Redis默认过期策略是:定期删除+惰性删除。


6.Redis缓存预热

缓存预热就是系统上线后,提前将相关的缓存数据直接加载到缓存系统。避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题!用户直接查询事先被预热的缓存数据! 
缓存预热解决方案: 
(1)直接写个缓存刷新页面,上线时手工操作下; 
(2)数据量不大,可以在项目启动的时候自动进行加载; 


7.Redis缓存降级

当访问量急剧增加,出现服务问题,例如响应速度慢或无响应,或者非核心服务影响核心进程的性能时,您仍然需要确保服务仍然可用,即使是有问题的服务。 Redis可以帮助系统实现数据降级载体。系统可以根据一些关键数据自动降级,也可以配置交换机实现手动降级。降级的最终目的是保证核心服务可用,即使有损


8.Redis缓存同步

mysql的数据可能会发生变化,所以redis必须和数据库中的数据保持一致。我们实际使用的时候,就是数据发生变化的地方,比如增删改查,启动一个新的线程,然后更新变化的数据。在redis中,根据不同的场景需求,当数据发生变化时,redis中的数据也可以被删除。下次用户查询发现redis中没有数据时,会重新加载数据库,同样可以实现。同步效应


9.Redis 是单线程的么?线程安全么

redis 是单线程,线程安全。 
因为 Redis 是基于内存的操作,CPU 不是 Redis 的瓶颈,Redis 的瓶颈最有可能是机器内存的大小或者网络带宽。 
redis 实际上是采用了线程封闭的观念,把任务封闭在一个线程,自然避免了线程安全问题
不过对于需要依赖多个 redis 操作的复合操作来说,依然需要锁,而且有可能是分布式锁

10.用什么操作redis
 现在用的是SpringDataRedis  之前用的是jedis 
  注解:RedisTemplate
 怎么操作:  配置文件 对应的依赖

11.redis基本类型:
 list   set  zset  hash   String
 为什么要用redis
 为了提升页面的加载速度,减轻数据库访问压力,我们将数据加载在缓存中

我们使用了百里香叶完成首页广告轮播图渲染  和分类导航渲染

百里香叶是一款用于渲染XML/XHTML/HTML5内容的模板引擎。类似JSP,Velocity,FreeMaker等, 它也可以轻易的与Spring MVC等Web框架进行集成作为Web应用的模板引擎。与其它模板引擎相比, Thymeleaf最大的特点是能够直接在浏览器中打开并正确显示模板页面,而不需要启动整个Web应用。 

ES相关面试题:

1.介绍ElasticSearch及其在项目中的应用

用Java开发的基于Lucene的分布式全文搜索引擎。基于宁静的网络界面。他在检索领域相当出色。在我们的项目中,他主要负责检索产品信息。产品信息的构成比较复杂,数据量巨大,至少有数十万条。如果使用mysql进行检索,效率会很低,会给mysql带来很大的压力。

使用过程中主要需要做几件事:

1、Es服务安装,中文分词器使用IK分词器。这个主要是运维的职责;

2、将springDataElasticSearch框架集成到项目中来操作ES;

3、创建一个实体类,并用Document注解进行标记。该注解声明了索引库的名称及其类型,以及其分片信息和副本信息。在此类中创建所有与产品相关的字段。还会有一些注释来标识其数据类型。例如,id 字段将有一个 id 注释。其他字段会使用@Field注解来标记ES中存储的数据类型,是否进行分词等,有些字段也可能会被省略。对于任何一个注解,es都会根据存储的数据来判断es中存储的字段类型。其他字段构建完成后,添加新的统一搜索字段。我们为它定义的名字就是全部。我们将把所有经常搜索的数据定义到这个字段中。例如产品标题、副标题、品牌等;

4. 初始全量数据导入

使用springboot测试类实现导入,批量从mysql取出,组装数据,保存到es中。

5.修改、添加、删除等增量数据导入

使用rabbitMQ实现,产品上架、下架时发送Mq消息、搜索微服务和静态页面微服务实现ES数据同步和静态页面数据同步操作

6.使用es实现搜索

  • 使用all进行分词查询。搜索时,遵循matchQuery。该方法是将输入的关键词进行分词,然后进行匹配。我们设置的匹配规则是 和 来匹配,即分词后的每个单词。如果所有字段都匹配,则匹配被视为匹配。我们在项目中设置了一个all字段,将所有可能切分的字段都放到这个字段中。我们只对该字段设置分段。当搜索关键字时,该字段将被匹配。 ,
  • 使用规格参数聚合实现商品搜索规格参数的渲染
  • 利用分类和品牌聚合实现产品分类和品牌查询渲染
  • 使用布尔查询来过滤规格、品牌和类别
  • 实现分页、排序等需求

2.为什么要用Es?

​ 因为以后我们商城会有大量的数据,使用之前的模糊查询以及模糊查询预配置会放弃索引,导致商品查询扫描全表。在百万级数据库中,效率非常高。低,而且我们用ES来做全文索引。我们将经常查询的产品的某些字段(例如产品名称、描述、价格和 id)放入我们的索引库中。 es内部有一个倒排索引。机制,普通索引的原理是通过id来查找数据,而倒排索引是通过数据来查找id。其总体原理是通过ik分词器将需要分词的数据划分后,记录每个词条对应的文档。 id,搜索时,将搜索关键词分词后,找到每个词条的文档id,然后通过id进行搜索操作,这样就大大提高了全文检索的效率。这也是全文检索中最常用的技术。 。

3.什么是桶?什么是指标?

,是按照某种方式对数据进行分组,每一组数据在ES中称为一个,例如我们根据国籍对人划分,可以得到中国桶英国桶日本桶……或者我们按照年龄段对人进行划分:010,1020,2030,3040等。分桶的方式有很多,比如按日期阶梯分组、按数值阶梯分组、按词条内容分组、按数值和日期范围分组等。

措施,分组完成以后,我们一般会对组中的数据进行聚合运算,例如求平均值、最大、最小、求和等,这些在ES中称为度量。度量有求平均值、求最大最小值、求百分比、求和等。

4、es内部存储的存储结构

es内部默认的是分布式存储结构。每当我们创建索引库时,都需要指定当前索引库的分片数量和副本数量。分片的数量意味着数据分布式存储在分片上。所有分片的数据总和就是整个索引数据库的数据量。分片越多,存储的数据就越分散。搜索时,ES会检索每个分片的数据并一起返回。副本数是指数据进入索引数据库时需要同时备份的数量。副本数量越多,消耗的存储空间就越多。如果副本太多,就会造成空间的浪费。一般在生产中使用。使用的默认配置是 5 个分片和 2 个副本。

5.描述Elasticsearch中更新和删除文档的过程

1、删除和更新也是写操作,但Elasticsearch中的文档是不可变的,因此无法通过删除或修改来显示其变化; 2. 当文档创建时,ES会给该文档分配一个版本号。执行更新时,文档的旧版本会在 .del 文件中标记为删除,而文档的新版本会被索引到新段中。旧版本的文档仍将与查询匹配,但将从结果中过滤掉。同样的方法删除

6. 详细描述Elasticsearch搜索流程

1. 搜索是作为一个两阶段过程执行的,我们称之为“Query then Fetch”; 2. 在初始查询阶段,查询将被广播到每个索引的主分片或副本分片。搜索并建立优先级队列。 3. 每个分片将其各自优先级队列中所有文档的ID和排序值返回给协调节点以合并结果列表。 4、协调节点在结果列表中检索该ID对应的文档,并将结果返回给客户端。

7、并发情况下,如果Elasticsearch保证读写一致,

整体采用版本号乐观锁机制进行控制;对于写入操作,默认情况下仅在大多数分片可用时才允许写入操作。但即使大部分可用,也可能会因为网络等原因导致写入副本失败,分片会在不同的节点上重建,直到成功。对于读操作,您可以将副本设置为同步状态(默认),这意味着它将在主分片和辅助分片都完成后返回。如果将副本设置为异步,也可以通过参数设置只查询主分片,以保证数据最新。

8、Elasticsearch如何实现Master选举?

1. ZenDiscovery模块负责选择ES的master。首先配置每个节点是否可以成为主节点。当ZenDiscovery通过ping发现大多数节点认为当前没有master时,就会发起选举。 2、选举时,所有可以成为master的节点根据节点id字典排序,暂定第一个节点为主节点3,然后发起投票。如果收到超过一半的选票并且节点自己选举自己,那么这个节点就是主节点。

9.什么是倒排索引表:
1、将要搜索的文档内容分词,所有不重复的词组成分词列表。
2、将搜索的文档最终以Document方式存储起来。
3、每个词和docment都有关联。

10.ES中有什么分词器以及为什么要用:
Ik  分词器,默认对中文每个字进行分词,作为词条,显然不符合逻辑,他也可以分成自己想要的词条
IK分词器测试

11.ES中的String类型有哪些?

文本:

  • 会进行分词,分词后会创建索引。
  • 支持模糊查询和精确查询。
  • 不支持聚合查询

关键字类型:

  • 没有直接创建分词和索引。
  • 支持模糊查询和精确查询。
  • 支持聚合查询。

 对于字符串类型字段,除非有特殊要求,尽量使用关键字type。

jdbc是干什么的?
1.jdbc用来连接我们的java应用程序和 数据库,用jdbc 我们能用java应用程序读取数据库里面的数据,还能够存储数据。

2.我们可以通过jdbc连接不同的数据库,比如Oracle、Mysql和sql Server。

单点登录面试问题:

登入:简称sso,用户只需要登录一次就可以访问所有相互信 任的应用系统
当我们访问其中一个前台系统需要登录才可以访问的页面时,
自动跳转到登录中心 进行登录,登录后再次跳转回该前台系统,该前台系统可以获取登录名。
实现单点登录有多种方案:
(1)    使用redis实现session共享 
比如A中的tomcat 有10  个session, B 中有5 个session,  tomcat  不存储,全部放到redis中,来判断是否登录
在tomcat 的内存中  比如: A和B  都存储这对方的 session。
缺点:浪费内存 、资源
spring-  session:  内存    redis  mysql  

(2)使用开源的单点登录系统

CAS具有以下特点:

1.开源的企业级单点登录解决方案。
2.  跨语言   跨平台

 6、认证中心整个使用CAS做的单点登录,因为模块众多,不可能让用户访问不同模块的时候,重复登录,这里使用的是CAS,由CAS提供统一的登录认证服务,需要CAS的server端提供服务
    需要给CAS整合我们统一的登录页面,接入我们的数据库,并且指定bcrypt的加密策略,这样在登录的时候,就会使用我们项目的数据了,
    认证通过之后,然后由项目中springsecurity提供授权服务。

Spring安全简介

Spring Security 是 Spring 家族中的一个安全管理框架,提供了一套 Web 应用安全性的完整解决方案。在用户认证方面,Spring Security 框架支持主流的认证方式。在用户授权方面,Spring Security 提供了基于角色的访问控制和访问控制列表(Access Control List,ACL),可以对应用中的领域对象进行细粒度的控制
核心功能主要包括:
1、认证 (你是谁)
2、授权 (你能干什么)
3、攻击防护 

Spring Security执行原理流程

● 首先是认证,即用户登陆,会被 AuthenticationProcessingFilter 拦截,调用认证管理器(AuthenticationManager )的实现类,认证管理器会调用 ProviderManager来获取用户验证信息,如果验证通过后会将用户的权限信息封装一个 User 放到 spring 的全局缓存 SecurityContextHolder 中,以备后面访问资源时使用。 
● 其次是授权,即访问资源,在访问 url 时,会通过 AbstractSecurityInterceptor 拦截器拦截,它会调用对应方法来获取被拦截url所需的全部权限,在调用授权管理器(AccessDecisionManager),这个授权管理器会通过spring的全局缓存SecurityContextHolder获取用户的权限信息,还会获取该url信息以及访问该 url 所需的全部权限,然后根据所配的策略(有:一票决定,一票否定,少数服从多数等),如果权限足够,则返回通过,权限不够则报错并调用权限不足页面

下面讲一下密码加密的登录和注册过程。

1、用户注册的时候,对密码进行加盐加密处理之后,然后将盐值以及加密之后的密码等数据存入数据库,数据库不存储明文密码
2、在登录的时候,服务端接收到用户名密码之后,先根据用户名去数据库查询,如果查询到了,在把用户输入的密码结合查询出来的用户的盐值进行相同的加密处理,然后跟查询出来的密码进行对比,如果一致,则登录成功,否则登录失败

. . .

相关推荐

额外说明

java jdbc原始操作sql

package com.example.demo.test; import java.sql.*; public class DbTest { public static void main(String[] args) throws E

额外说明

正整数(1-12/1-48)正则表达式

背景:需求前段传入参数要做限制,要求是1-12月分的正整数,和1-48周的正整数,没的说当然是正则表达式了,作为一个几年都是代码搬运工的俺来讲,度娘不知道的就得靠自己了, 捡起来吧,都忘个差不多了,先上案例吧: 内容:  count =$('#month

额外说明

正则表达式

                                                                                                                          在线正则表

额外说明

卸载、安装和连接 Navicat for MySQL

一、卸载MySQL 1. 停止MySQL服务 首先快捷键:Ctrl + Shift + ESC调出任务管理器 2. 通过控制面板卸载 3. 文件夹清理 “C:\ProgramData\MySQL ”文件默认是隐藏的,该文件夹要设置显示隐藏文件夹后才可见(

额外说明

MYSQL数据库

数据库的介绍 1.什么是数据库DB DB的全称是database,即数据库的意思。数据库实际上就是一个文件集合,是一个存储数据的仓库,数据库是按照特定的格式把数据存储起来,用户可以对存储的数据进行增删改查操作。 2.什么是sql SQL包含三个部分: D

额外说明

Matplotlib风格与样式

1. Matplotlib 风格 为了满足不同的应用需求,Matplotlib 中包含了 28 种不同的风格,在进行绘图时,可以根据需要选择不同的绘图风格。使用以下代码可以获取 Matplotlib 中所有可用的风格: import matplotlib

额外说明

那些我收藏多年和偷摸使用的工具~~~

作为一个见到好东西,不管有没有用先收藏的我来说,本期活动实在是太有必要写一篇博客了 目录 展示我的收藏癖 生活类收藏 学习类收藏 工具类收藏 谷歌插件类收藏 工具推荐 效率工具 sublime 文件转换工具 text转Markdown Markdown-

额外说明

事件冒泡学个透

事件冒泡,这一逻辑学名词对于很多初次学习JavaScript的程序员还是比较抽象,我想尝试用一种直观的方式,在这里将这个东西讲透。 首先我们去查看了事件冒泡的百度解释: 当事件发生后,这个事件就要开始传播(从里到外或者从外向里)。为什么要传播呢?因为事件

额外说明

Tp6经常报错 Call to undefined method 没有找到类或者方法应该怎么解决?

来源:https://www.toymoban.com/diary/thinkphp/107.html 分析: 当我第一次开始使用Tp6时,我经常收到错误Call to undefined method。为什么是这样? 这个错误的意思是找不到调用未定义的

额外说明

Spring Cloud Netflix Hystrix

Hystrix简介 在微服务架构中,每个服务都是独立部署的,服务之间存在相互依赖关系。与单体系统相比,微服务架构中服务访问失败的原因和场景非常复杂,这需要我们从服务可靠性的角度来设计服务本身以及服务之间的交互流程。服务可靠性是微服务架构的关键要素之一。

ads via 小工具