- 博客(36)
- 收藏
- 关注
转载 拼团商城小程序开发
最近开发了一套微信小程序电商平台前后端分离,包含分销,拼团,抽奖,红包,等功能,整个系统架构非常简单,适合小型团队或者个人开发者二次开发,适用于各行业类。此程序是一款拼团商城小程序,主要有商品分类、拼团or单独购买、支付、优惠券、物流、收藏、消息通知等功能,所有元件均可复用,既可作为移动端原型设计模板,也可作为同行业实战原型功能逻辑参考。代码如下:拼团结果处理拼团成功:修改拼团状态:当有用户参与拼团且成功付款后,查询当前拼团已满足人数,则更新sms_group_member(拼
2022-06-18 20:40:39
1727
2
转载 订单系统的设计
本文主要讲述了在传统电商企业中,订单系统应承载的角色,就订单系统所包含的主要功能模块梳理了设计思路,并对订单系统未来的发展做了一些思考。在搭建企业订单系统之前,需要先梳理企业整体业务系统之间的关系和订单系统上下游关系,只有划分清业务系统边界,才能确定订单系统的职责与功能,进而保证各系统之间高效简洁的工作。(1)对外系统:所有给企业外部用户使用的系统都在这一层,包括官网、普通用户使用的C端,还包括给商户使用的商家后台和在各个销售渠道进行分销的系统,比如与银行信用卡中心合作、微信合作在合作商的平台露出本企业的产
2022-06-13 11:35:38
646
转载 泛型中的 T、E、K、V,还记得嘛?
前言 泛型带来的好处 泛型中通配符 常用的 T,E,K,V,? ?无界通配符 上界通配符 < ? extends E> 下界通配符 < ? super E> ?和 T 的区别 Class<T>和Class<?>区别 小结 前言Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制...
2022-05-23 23:21:06
206
原创 Redis下载及安装
1.下载最新版Releases · microsoftarchive/redis · GitHub2.点击安装,打钩pash环境变量,之后一路next,finish安装完成3.打开安装目录,编辑redis.windows.conf设置密码搜索requirepass,在下面增加一行requirepass 1234564.看下管理服务,redis是否启动状态5.看下服务是否可用测试一下redis能否正常工作。用命令进入redis安装路径,输入redis-cli并回车.
2022-03-07 23:13:22
974
原创 面试:Redis为什么这么快?
官方数据QPS(每秒请求数量)可达到10万1.完全基于内存不论读写都是在内存中完成,吊打磁盘读写,直接由CPU控制和内存对接。2.单线程模型 网络IO(6以后也使用多线程)和键值对指令读写是由一个线程来执行。 持久化,数据同步,异步删除是用其他线程执行的 为什么不使用多线程来充分利用cpu 1.多线程需要不停的并发读写,这是特别消耗资源的 2.如果并发读写的话...
2022-03-06 17:51:42
699
原创 Mysql基础架构原理
一.Mysql基础架构1.1一条sql是怎么执行的,要经过哪些步骤? 大体来说可以分为,server层和存储引擎连接器:连接器负责和客户端进行连接,先通过TCP握手建立连接,建立完连接之后就要验证用用户名和密码进行鉴权,建立成功之后太久没有动静,就会自动断开连接,由wait_timeout控制,默认8小时。查询缓存: 拿到一条sql执行,mysql会先查询缓存看之前是否已经执行过该sql,之前执行过的sql会以k-v形式存储在内存中,通...
2021-12-19 20:21:39
393
原创 06 _ 全局锁和表锁 :给表加个字段怎么有这么多阻碍?
今天我要跟你聊聊MySQL的锁。数据库锁设计的初衷是处理并发问题。作为多用户共享的资源,当出现并发访问的时候,数据库需要合理地控制资源的访问规则。而锁就是用来实现这些访问规则的重要数据结构。根据加锁的范围,MySQL里面的锁大致可以分成全局锁、表级锁和行锁三类。今天这篇文章,我会和你分享全局锁和表级锁。而关于行锁的内容,我会留着在下一篇文章中再和你详细介绍。这里需要说明的是,锁的设计比较复杂,这两篇文章不会涉及锁的具体实现细节,主要介绍的是碰到锁时的现象和其背后的原理。全局锁顾名思义,全局锁就是对整个数据.
2021-12-14 12:09:29
167
原创 05 _ 深入浅出索引(下)
在上一篇文章中,我和你介绍了InnoDB索引的数据结构模型,今天我们再继续聊聊跟MySQL索引有关的概念。在开始这篇文章之前,我们先来看一下这个问题:在下面这个表T中,如果我执行 select * from T where k between 3 and 5,需要执行几次树的搜索操作,会扫描多少行?下面是这个表的初始化语句。mysql> create table T (ID int primary key,k int NOT NULL DEFAULT 0, s varchar(16) NOT .
2021-12-14 12:08:37
155
原创 04 _ 深入浅出索引(上)
提到数据库索引,我想你并不陌生,在日常工作中会经常接触到。比如某一个SQL查询比较慢,分析完原因之后,你可能就会说“给某个字段加个索引吧”之类的解决方案。但到底什么是索引,索引又是如何工作的呢?今天就让我们一起来聊聊这个话题吧。数据库索引的内容比较多,我分成了上下两篇文章。索引是数据库系统里面最重要的概念之一,所以我希望你能够耐心看完。在后面的实战文章中,我也会经常引用这两篇文章中提到的知识点,加深你对数据库索引的理解。一句话简单来说,索引的出现其实就是为了提高数据查询的效率,就像书的目录一样。一本500.
2021-12-14 12:08:04
154
原创 03 _ 事务隔离:为什么你改了我还看不见?
提到事务,你肯定不陌生,和数据库打交道的时候,我们总是会用到事务。最经典的例子就是转账,你要给朋友小王转100块钱,而此时你的银行卡只有100块钱。转账过程具体到程序里会有一系列的操作,比如查询余额、做加减法、更新余额等,这些操作必须保证是一体的,不然等程序查完之后,还没做减法之前,你这100块钱,完全可以借着这个时间差再查一次,然后再给另外一个朋友转账,如果银行这么整,不就乱了么?这时就要用到“事务”这个概念了。简单来说,事务就是要保证一组数据库操作,要么全部成功,要么全部失败。在MySQL中,事务支持.
2021-12-14 12:07:28
111
原创 02 _ 日志系统:一条SQL更新语句是如何执行的?
前面我们系统了解了一个查询语句的执行流程,并介绍了执行过程中涉及的处理模块。相信你还记得,一条查询语句的执行过程一般是经过连接器、分析器、优化器、执行器等功能模块,最后到达存储引擎。那么,一条更新语句的执行流程又是怎样的呢?之前你可能经常听DBA同事说,MySQL可以恢复到半个月内任意一秒的状态,惊叹的同时,你是不是心中也会不免会好奇,这是怎样做到的呢?我们还是从一个表的一条更新语句说起,下面是这个表的创建语句,这个表有一个主键ID和一个整型字段c:mysql> create table T(ID .
2021-12-14 12:06:19
163
原创 01 _ 基础架构:一条SQL查询语句是如何执行的?
这是专栏的第一篇文章,我想来跟你聊聊MySQL的基础架构。我们经常说,看一个事儿千万不要直接陷入细节里,你应该先鸟瞰其全貌,这样能够帮助你从高维度理解问题。同样,对于MySQL的学习也是这样。平时我们使用数据库,看到的通常都是一个整体。比如,你有个最简单的表,表里只有一个ID字段,在执行下面这个查询语句时:mysql> select * from T where ID=10;我们看到的只是输入一条语句,返回一个结果,却不知道这条语句在MySQL内部的执行过程。所以今天我想和你一起把MySQL拆解一.
2021-12-14 12:05:12
189
原创 10 _ Java线程(中):创建多少线程才是合适的?
在Java领域,实现并发程序的主要手段就是多线程,使用多线程还是比较简单的,但是使用多少个线程却是个困难的问题。工作中,经常有人问,“各种线程池的线程数量调整成多少是合适的?”或者“Tomcat的线程数、Jdbc连接池的连接数是多少?”等等。那我们应该如何设置合适的线程数呢?要解决这个问题,首先要分析以下两个问题:为什么要使用多线程?多线程的应用场景有哪些?为什么要使用多线程?使用多线程,本质上就是提升程序性能。不过此刻谈到的性能,可能在你脑海里还是比较笼统的,基本上就是快、快、快,这种无法度量的感.
2021-11-30 21:13:02
1603
原创 09 _ Java线程(上):Java线程的生命周期
在Java领域,实现并发程序的主要手段就是多线程。线程是操作系统里的一个概念,虽然各种不同的开发语言如Java、C#等都对其进行了封装,但是万变不离操作系统。Java语言里的线程本质上就是操作系统的线程,它们是一一对应的。在操作系统层面,线程也有“生老病死”,专业的说法叫有生命周期。对于有生命周期的事物,要学好它,思路非常简单,只要能搞懂生命周期中各个节点的状态转换机制就可以了。虽然不同的开发语言对于操作系统线程进行了不同的封装,但是对于线程的生命周期这部分,基本上是雷同的。所以,我们可以先来了解一下通用.
2021-11-30 21:12:31
169
原创 08 _ 管程:并发编程的万能钥匙
并发编程这个技术领域已经发展了半个世纪了,相关的理论和技术纷繁复杂。那有没有一种核心技术可以很方便地解决我们的并发问题呢?这个问题如果让我选择,我一定会选择管程技术。Java语言在1.5之前,提供的唯一的并发原语就是管程,而且1.5之后提供的SDK并发包,也是以管程技术为基础的。除此之外,C/C++、C#等高级语言也都支持管程。可以这么说,管程就是一把解决并发问题的万能钥匙。什么是管程不知道你是否曾思考过这个问题:为什么Java在1.5之前仅仅提供了synchronized关键字及wait()、notif.
2021-11-30 21:11:46
205
原创 07 _ 安全性、活跃性以及性能问题
通过前面六篇文章,我们开启了一个简单的并发旅程,相信现在你对并发编程需要注意的问题已经有了更深入的理解,这是一个很大的进步,正所谓只有发现问题,才能解决问题。但是前面六篇文章的知识点可能还是有点分散,所以是时候将其总结一下了。并发编程中我们需要注意的问题有很多,很庆幸前人已经帮我们总结过了,主要有三个方面,分别是:安全性问题、活跃性问题和性能问题。下面我就来一一介绍这些问题。安全性问题相信你一定听说过类似这样的描述:这个方法不是线程安全的,这个类不是线程安全的,等等。那什么是线程安全呢?其实本质上就是正确.
2021-11-30 21:11:15
165
原创 06 _ 用“等待-通知”机制优化循环等待
由上一篇文章你应该已经知道,在破坏占用且等待条件的时候,如果转出账本和转入账本不满足同时在文件架上这个条件,就用死循环的方式来循环等待,核心代码如下:// 一次性申请转出账户和转入账户,直到成功while(!actr.apply(this, target)) ;如果apply()操作耗时非常短,而且并发冲突量也不大时,这个方案还挺不错的,因为这种场景下,循环上几次或者几十次就能一次性获取转出账户和转入账户了。但是如果apply()操作耗时长,或者并发冲突量大的时候,循环等待这种方案就不适用了,因为.
2021-11-30 21:10:36
170
原创 05 _ 一不小心就死锁了,怎么办?
在上一篇文章中,我们用Account.class作为互斥锁,来解决银行业务里面的转账问题,虽然这个方案不存在并发问题,但是所有账户的转账操作都是串行的,例如账户A 转账户B、账户C 转账户D这两个转账操作现实世界里是可以并行的,但是在这个方案里却被串行化了,这样的话,性能太差。试想互联网支付盛行的当下,8亿网民每人每天一笔交易,每天就是8亿笔交易;每笔交易都对应着一次转账操作,8亿笔交易就是8亿次转账操作,也就是说平均到每秒就是近1万次转账操作,若所有的转账操作都串行,性能完全不能接受。那下面我们就尝试着.
2021-11-30 21:10:05
142
原创 04 _ 互斥锁(下):如何用一把锁保护多个资源?
在上一篇文章中,我们提到受保护资源和锁之间合理的关联关系应该是N:1的关系,也就是说可以用一把锁来保护多个资源,但是不能用多把锁来保护一个资源,并且结合文中示例,我们也重点强调了“不能用多把锁来保护一个资源”这个问题。而至于如何保护多个资源,我们今天就来聊聊。当我们要保护多个资源时,首先要区分这些资源是否存在关联关系。保护没有关联关系的多个资源在现实世界里,球场的座位和电影院的座位就是没有关联关系的,这种场景非常容易解决,那就是球赛有球赛的门票,电影院有电影院的门票,各自管理各自的。同样这对应到编程领域,.
2021-11-30 21:09:30
285
原创 03 _ 互斥锁(上):解决原子性问题
在第一篇文章中我们提到,一个或者多个操作在CPU执行的过程中不被中断的特性,称为“原子性”。理解这个特性有助于你分析并发编程Bug出现的原因,例如利用它可以分析出long型变量在32位机器上读写可能出现的诡异Bug,明明已经把变量成功写入内存,重新读出来却不是自己写入的。那原子性问题到底该如何解决呢?你已经知道,原子性问题的源头是线程切换,如果能够禁用线程切换那不就能解决这个问题了吗?而操作系统做线程切换是依赖CPU中断的,所以禁止CPU发生中断就能够禁止线程切换。在早期单核CPU时代,这个方案的确是可行.
2021-11-30 21:08:27
165
原创 02 _ Java内存模型:看Java如何解决可见性和有序性问题
上一期我们讲到在并发场景中,因可见性、原子性、有序性导致的问题常常会违背我们的直觉,从而成为并发编程的Bug之源。这三者在编程领域属于共性问题,所有的编程语言都会遇到,Java在诞生之初就支持多线程,自然也有针对这三者的技术方案,而且在编程语言领域处于领先地位。理解Java解决并发问题的解决方案,对于理解其他语言的解决方案有触类旁通的效果。那我们就先来聊聊如何解决其中的可见性和有序性导致的问题,这也就引出来了今天的主角——Java内存模型。Java内存模型这个概念,在职场的很多面试中都会考核到,是一个热门.
2021-11-29 00:06:57
156
原创 01 _ 可见性、原子性和有序性问题:并发编程Bug的源头
如果你细心观察的话,你会发现,不管是哪一门编程语言,并发类的知识都是在高级篇里。换句话说,这块知识点其实对于程序员来说,是比较进阶的知识。我自己这么多年学习过来,也确实觉得并发是比较难的,因为它会涉及到很多的底层知识,比如若你对操作系统相关的知识一无所知的话,那去理解一些原理就会费些力气。这是我们整个专栏的第一篇文章,我说这些话的意思是如果你在中间遇到自己没想通的问题,可以去查阅资料,也可以在评论区找我,以保证你能够跟上学习进度。你我都知道,编写正确的并发程序是一件极困难的事情,并发程序的Bug往往会诡异.
2021-11-29 00:06:07
160
原创 MySQL的基础架构
这是专栏的第一篇文章,我想来跟你聊聊MySQL的基础架构。我们经常说,看一个事儿千万不要直接陷入细节里,你应该先鸟瞰其全貌,这样能够帮助你从高维度理解问题。同样,对于MySQL的学习也是这样。平时我们使用数据库,看到的通常都是一个整体。比如,你有个最简单的表,表里只有一个ID字段,在执行下面这个查询语句时:mysql> select * from T where ID=10;我们看到的只是输入一条语句,返回一个结果,却不知道这条语句在MySQL内部的执行过程。所以今天我想和你一起把MySQL拆解一.
2021-11-28 18:02:27
186
原创 5W1H分析法
(1)Why——为什么干这件事?(目的);(2)What——怎么回事?(对象);(3)Where——在什么地方执行?(地点);(4)When——什么时间执行?什么时间完成?(时间);(5)Who——由谁执行?(人员);(6)How——怎样执行?采取哪些有效措施?(方法). https://www.zhihu.com/question/35917760/answer/1260215231...
2021-08-10 22:38:21
1526
原创 MVCC基本原理
什么是MVCC? 多版本控制器事务 ACID 隔离级别 读未提交 读已提交 可重复使用 (mysql默认隔离级别) 串行化...
2021-07-08 20:13:24
221
1
原创 Mysql相关知识点
Mysql工作这么久,感觉自己对mysql没有一个系统的学习过程,客针对自己对mysql的理解和搜集一些资料,把零散的知识点整理出来,供大家参考和学习。1.mysql的执行过程我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:全新的界面设计 ,将会带来全新的写作体验;在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;增加了 图片拖拽 功能,你可以将本地的图片直接拖
2021-06-09 23:30:12
186
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人