我的博客
此间奥秘都在博客里了
SpringBoot实战——瑞吉外卖
SpringBoot实战——瑞吉外卖
数据库创建:
表功能:
address_book:地址表
category:菜品和套餐表
dish: 菜品表
dish_flavor: 菜品口味关系表
employee: 员工表
order_detail: 订单明细
orders:订单表
setmeal:套餐表
setmeal_dish:套餐菜品关系表
shopping_cart:购物车
user:用户表
项目创建不必多言
pom配置:这里其实版本号不一定是我的这个,各位可以自行在maven里导入适合自己的
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990<?xml version="1.0" encoding="UTF-8"?><project ...
微服务入门学习
微服务入门学习
部分资料来自于黑马程序员
1. 热门微服务技术对比
2. 简单实现微服务的代码
此处分别为用户服务和订单服务
订单服务的端口为8080,且调用cloud_order数据库
用户服务在8081,且数据库为cloud_user
加上简单的业务代码,这样就能实现简单的微服务。
访问user_service
访问order_service
3. 微服务远程调用问题描述:
由于微服务架构中,一个完整的项目被分成了很多可以独立工作的部分,但我们在实际调用这些模块的时候,可能并不只是调用其中一个,我们可能需要多个模块协同工作后的结果,比如上面举例的用户的订单模块,如果我们想要在查询订单的时候一块查询到用户信息,而订单模块又无法直接操作用户数据库,应该怎么办?
这就需要微服务的远程调用,即用模块调用模块,实现方法类似于用java代码发送http请求给目标模块
spring提供了可以实现这一功能的工具:RestTemplate
首先先在启动类里面注册RestTemplate
123456// 注册RestTemplate @Bean public RestTe ...
redis实战
Redis项目实战短信验证码发送验证码123456789101112131415161718192021222324252627282930313233343536 /** * 发送手机验证码 */ @PostMapping("code") public Result sendCode(@RequestParam("phone") String phone, HttpSession session) { // TODO 发送短信验证码并保存验证码// 验证手机号是否合法 boolean isPhoneInvalid = RegexUtils.isPhoneInvalid(phone); if(isPhoneInvalid){ return Result.fail("请输入正确手机号"); }// 获取code,并保存session String ...
微服务入门学习(二)
Elasticsearch分布式搜索介绍
部分资料来自与黑马程序员公开课程
何为Elasticsearchelasticsearch结合kibana、Logstash、Beats,也就是elastic stack(ELK)。被广泛应用在日志数据分析、实时监控等领域:
而elasticsearch是elastic stack的核心,负责存储、搜索、分析数据。
倒排索引倒排索引中有两个非常重要的概念:
文档(Document):用来搜索的数据,其中的每一条数据就是一个文档。例如一个网页、一个商品信息
词条(Term):对文档数据或用户搜索数据,利用某种算法分词,得到的具备含义的词语就是词条。例如:我是中国人,就可以分为:我、是、中国人、中国、国人这样的几个词条
创建倒排索引是对正向索引的一种特殊处理,流程如下:
将每一个文档的数据利用算法分词,得到一个个词条
创建表,每行数据包括词条、词条所在文档id、位置等信息
因为词条唯一性,可以给词条创建索引,例如hash表结构索引
如图:
倒排索引的搜索流程如下(以搜索”华为手机”为例):
1)用户输入条件"华为手机&qu ...
数据库内核开发
数据库内核开发数据库基本架构
关系数据库结构
Buffer POOL缓存机制
因为我们的数据库中的数据是放在磁盘里的,但我们每次读取都去读磁盘,显然这样效率就大寄特寄了,所以类似于cup与主存之间,我们也需要一个缓冲区来加快读写速率。
B+Tree
1.叶结点大小和存储单元大小一致,能起到预读数据效果
2.叶节点有链接关系,可以遍历
3.只有叶结点放数据
B+tree搜索过程:
比如搜索29,在磁盘块1中可以看出,29在p2所指区域
在p2区域,可以看出29小于36在p1区域
最后找到磁盘块7,搜索到29
B+树的删除过程
删除7
删除11
B+树插入过程
插入40
LSM-Tree架构
用户输入的数据会先存放在memorytable中,当memorytable中的数据达到一定阈值,memorytable就会变成一个Frozen~(只读),然后生成一个新的memorytable,把Forzen写入磁盘
Compaction
Compaction操作是将多个SSTable合成一个,能提高查询效率,但提高了能耗
Compaction三个概念:1.对写放大2.空间放 ...
java后端常用操作汇总
后端百宝箱随机生成验证码12// 调用hutool的工具,随机生成6位验证码 String code = RandomUtil.randomNumbers(6);
验证手机号,邮箱等是否合法的正则表达式12345678910111213141516/** * 手机号正则 */public static final String PHONE_REGEX = "^1([38][0-9]|4[579]|5[0-3,5-9]|6[6]|7[0135678]|9[89])\\d{8}$";/** * 邮箱正则 */public static final String EMAIL_REGEX = "^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$";/** * 密码正则。4~32位的字母、数字、下划线 */public static final String PASSWORD_REGEX = "^\\w{4,32}$&quo ...
建造者模式
关注微信公众号:程序驴,获取更多学习资料
何为建造者模式建造者模式一般用于构建一个由多个简单对象构成的复杂对象。比如一台完整的汽车对象,其中可能需要:
车体框架对象
车门对象
车窗对象
发动机对象
……
其实不同的汽车品牌,他用到的某个部件可能是来自不同的厂家,但是汽车的构造过程是大差不差的,也就是同样的构造模式可以创建不同的对象。如果构造汽车这一过程完全由人操控,在程序中体现就是你需要写很多的set方法(例如下面这样)
12345Car mycar = new Car(); mycar.setBody("钛合金进口车架"); mycar.setDoor("防弹车门"); mycar.setEngine("双瓦轮增压发动机")// ............
最终才能得到一种汽车,而建造者模式简化了这一过程,建造者模式对某一种特定的复杂对象提供了专门构造他的Builder方法,该Builder方法类似于将所有set方法进行了单独的封装,使得Builder方法最终可以直接提供出我们需要的那一种汽车,比如下面:
1 ...
策略模式
何为策略模式策略模式让一个类的内部算法或者行为可以在运行改变,从而适应多种环境下的调用。
举个例子:
市面上有一种可以更换不同刀头的螺丝刀,当我们在使用这种螺丝刀时,只需要根据螺帽的样式选择合适的刀口,就能直接使用,同样的,如果要替换螺丝刀的样式,比如从一字刀口变成梅花刀口,直接从备用刀头中选择梅花型的。
策略模式包含以下几个核心实现:
环境(Context):维护一个对策略对象的引用,负责将客户端请求委派给具体的策略对象执行。环境类可以通过依赖注入、简单工厂(工厂加策略)等方式来获取具体策略对象。
抽象策略(Abstract Strategy):定义了策略对象的公共接口或抽象类,规定了具体策略类必须实现的方法。
具体策略(Concrete Strategy):实现了抽象策略定义的接口或抽象类,包含了具体的算法实现。
策略模式通过将算法与使用算法的代码解耦,提供了一种动态选择不同算法的方法。客户端代码不需要知道具体的算法细节,而是通过调用环境类来使用所选择的策略。
实战案例策略模式通常用于有多个类似行为的算法逻辑场景,很常见的一种就是支付方式,当我们网购付款时可以选择微信支付, ...
单例模式
关注微信公众号:程序驴,获取更多学习资料
何为单例模式简单说,单例设计模式下的类在全局只能存在一个实例化对象,全局共同访问同一个实例。
老规矩,举个例子
单例模式通常是为了避免重复创建对象导致资源浪费。假如现在我有一台打印机,那我的舍友同学想打印的时候,就可以直接和我联系,我来提供打印机为他们打印,而不是每个想打印的同学都要买一台属于自己的打印机。这样就是没有利用现有的资源,明明利用一台打印机就能解决的问题,现在白白创建了很多台,这就是资源的浪费。
代码实现单例模式的使用场景十分简单,如果某个类的实例化对象在全局只需要有一个,如果存在多个会导致资源浪费,或者其本身逻辑就不允许存在多个实例(比如全局计时器),这就需要将这种类改造成单例模式。
具体案例就用我们之前在适配器模式中展示的StorageConfig为例
单例模式的几种实现形式懒汉式懒汉式很容易理解,它比较懒,只有在别人调用它时,他才会创建实例化对象,并在之后一直沿用这个对象,不会重复创建。
可以看到,懒汉式在返回实例化对象前会判断对象是否为空,如果为空说明是第一次访问,则需要创建对象,相反,如果不为空,则直接返回已经存 ...
设计模式之工厂模式
何为工厂模式工厂模式是一种创建型模式,工厂只对外暴露创建对象的接口,由外部调用者决定该创建哪个对象。这隐藏了每个功能类具体的实现逻辑,让外部可以更简单的调用。
举个例子:我想要买车,我到4s店和销售说我想要啥啥啥款车,销售就会带着你去看,如果money到位,就安排安排手续,这辆车就是你的了。在这个过程中,4s店就是工厂,而产品就是汽车,你不用去了解汽车是怎么组装的,你只需要报一个型号,4s店就会给你提供你需要的车。
在工厂模式中,每种服务更像是商品一样,摆放在工厂类中,供大家挑选,调用者只需要选取它,工厂就会在内部帮你创建一个该服务的实例,然后你就可以愉快地使用它了。
实战案例假如我现在要开发一个题库,题库中有选择题、判断题、填空题等,每种题目类型我们需要单独的一套操作接口。
常规做法是在业务代码里加狂加if,判断传入的题目是何种类型的,然后根据类型创建相应的对象,之后就是对题目的CRUD操作。
且不谈业务代码太复杂,耦合性高的问题,就是太多if-else既不美观,维护起来也是相当的难受的。
因此我们可以利用工厂模式改造这处代码。
代码实现目录结构
Enums题目种类的枚举,没什么 ...
适配器模式
何为适配器模式举一个很贴切的例子,我们国家的家用交流电,电压是220V的,但是在美国,他们的家用电压为110V,因此如果我们要想在国外也能达到国内一样的充电体验,我们可能需要购买一个适配器,来将110V电压转换为220V。
这个例子中适配器的作用就是将现有的条件(110V)做出转化(适配器),使其符合我们的需要(220V)
其实适配器模式更贴近实际的用法是把多种有差别(但功能差不多)的接口做统一化的输出,这样不管是之后向更改接口还是切换服务提供者,都不会影响到接口使用方的业务逻辑。
再举个小例子,适配器模式其实就像是一个只注重结果的人,利用适配器,他不在乎你怎么提供的,他只在乎你提供给他的结果是否和之前的一样。只要结果一致,那你作为提供者可以随便捣鼓。
实战案例在建站过程中,OSS服务是必不可少的一环,他可以作为图床,存放我们网站的图片资源,并返回图片的访问url,但是市面上有很多的OSS服务提供者,比如需要money的阿里云,腾讯云之类的,也有可以自己手搭的Minio,这些OSS服务提供的功能接口一致,但是接口的方法名,参数类型多有不同,如果在开发过程中更换服务提供者,那可就是牵一 ...