InnoDB

Redis秒杀系统架构设计-微信抢红包

别等时光非礼了梦想. 提交于 2020-09-30 15:16:52
导读    前二天 我 写 了一篇, Redis高级项目实战 ( 点我直达 ), SpringBoot整合Redis附源码 ( 点我直达 ), 今天 我们来 做 一下 Redis秒杀 系统的设计。当然啦, Redis基础 知识 还不过关的 , 先去加强下自身内功 ,然后在回来看这篇, Redis基础知识 (点我直达 )。为啥写这个微信抢红包项目呢,公司0202年08月22日,公司周年庆,抢了100多红包🧧,O(∩_∩)O哈哈~ 微信抢红包 实现原理 业务流程分析 功能拆解 新建红包    在DB 、 Redis 分别 新增一条记录 抢红包( 并发 )    请求Redis , 红包剩余个数 , 大于0 才可以 拆 , 等会0 时,提示用户, 红包已抢完 拆红包( 并发 ) 用到技术   Redis 中数据类型的 String特性 的 原子递减 ( DECR key ) 和 减少指定值 ( DECRBY key decrement ) 业务 请求Redis ,当 剩余红包个数大于0 , 红包个数 原子 递减 ,随机 获取红包 计算金额 ,当最后一个红包时,最后一个红包金额=总金额-总已抢红包金额 更新数据库 查看红包记录    查询DB 即可 数据库表设计 红包流水表 CREATE TABLE `red_packet_info` ( `id` int ( 11 ) NOT NULL

Redis秒杀系统架构设计-微信抢红包

巧了我就是萌 提交于 2020-09-30 06:53:53
导读    前二天 我 写 了一篇, Redis高级项目实战 ( 点我直达 ), SpringBoot整合Redis附源码 ( 点我直达 ), 今天 我们来 做 一下 Redis秒杀 系统的设计。当然啦, Redis基础 知识 还不过关的 , 先去加强下自身内功 ,然后在回来看这篇, Redis基础知识 (点我直达 )。为啥写这个微信抢红包项目呢,公司0202年08月22日,公司周年庆,抢了100多红包🧧,O(∩_∩)O哈哈~ 微信抢红包 实现原理 业务流程分析 功能拆解 新建红包    在DB 、 Redis 分别 新增一条记录 抢红包( 并发 )    请求Redis , 红包剩余个数 , 大于0 才可以 拆 , 等会0 时,提示用户, 红包已抢完 拆红包( 并发 ) 用到技术   Redis 中数据类型的 String特性 的 原子递减 ( DECR key ) 和 减少指定值 ( DECRBY key decrement ) 业务 请求Redis ,当 剩余红包个数大于0 , 红包个数 原子 递减 ,随机 获取红包 计算金额 ,当最后一个红包时,最后一个红包金额=总金额-总已抢红包金额 更新数据库 查看红包记录    查询DB 即可 数据库表设计 红包流水表 CREATE TABLE `red_packet_info` ( `id` int ( 11 ) NOT NULL

狂刷四遍398道java最新MySQL笔记后,我三面阿里研发部,成功定级P7

爷,独闯天下 提交于 2020-09-30 04:30:59
最近疫情趋于平稳,也是金九银十好时节,出来面试的人也多了起来。我发现不少候选人,对数据库的认知还处在比较基础的阶段,以为会写 “增删改查”、做表关联 就足够了,那些工作中经常出现的问题,却支支吾吾答不上来,比如: ◆ count(*) 慢该如何解决? ◆ 对于千万级的大表,MySQL 要怎么优化? ◆ SQL 使用 Join 好,还是多次 Select 好? ◆ 1000 多万条数据,建了索引还是慢,该怎么办? 想来,我在用 MySQL 的过程中,遇到的问题也是五花八门, 从开发技巧到管理维护,从性能问题到安全问题。 第一个感受就是,MySQL 本身是个设计优良的系统,其中有很多巧妙的设计思路,比如 WAL 机制、索引的实现、缓存的处理方式等等 ,掌握好这些,能解决日常工作中的很多问题。 那会儿,也没少在网上找资料,虽说有所收获,但内容大多脱离真实的软件开发,看的时候各种明白,上手实操就原形毕露了。 太简短不全面,禁不住深挖,因此很多次都掉坑里,那么如何避坑呢? 刚好,通过最近的学习整理出一份《MySQL性能调优与架构笔记及面试题》,笔记里都有详细讲到,已打包好,文末有免费获取方式。 MySQL性能调优与架构笔记 一、基础篇 MySQL基本介绍 MySQL架构组成 MySQL存储引|擎简介 MySQL安全管理 MySQL备份与恢复 二、性能优化篇

使用SQL索引,为什么查询还是慢?

久未见 提交于 2020-09-27 16:51:21
作者:张飞洪 cnblogs.com/jackyfei/p/12122767.html 经常有同学问我,我的一个SQL语句使用了索引,为什么还是会进入到慢查询之中呢?今天我们就从这个问题开始来聊一聊索引和慢查询。 另外插入一个题外话,个人认为团队要合理的使用ORM,可以参考 ORM的权衡和抉择 。合理利用的是ORM在面向对象和写操作方面的优势,避免联合查询上可能产生的坑(当然如果你的Linq查询能力很强另当别论),因为ORM屏蔽了太多的DB底层的知识内容,对程序员不是件好事,对性能有极致追求,但是ORM理解不透彻的团队更加要谨慎。 https://www.cnblogs.com/jackyfei/p/orm.html 案例剖析  言归正传,为了实验,我创建了如下表: CREATE TABLE `T`( `id` int(11) NOT NULL, `a` int(11) DEFAUT NULL, PRIMARY KEY(`id`), KEY `a`(`a`) ) ENGINE=InnoDB; 该表有三个字段,其中用id是主键索引,a是普通索引。 首先SQL判断一个语句是不是慢查询语句,用的是语句的执行时间。他把语句执行时间跟long_query_time这个系统参数作比较,如果语句执行时间比它还大,就会把这个语句记录到慢查询日志里面,这个参数的默认值是10秒。当然在生产上

MySQL事务与隔离级别

孤街醉人 提交于 2020-09-27 07:12:03
--查看隔离级别 select @@global.tx_isolation, @@tx_isolation; --修改隔离级别 set [session | global] transaction isolation level [ read uncommitted | read committed | repeatable read | serializable] --设置全局隔离级别 set global transaction isolation level read committed; --设置当前会话隔离级别 set session transaction isolation level read committed; --开启事务 begin; start transaction; --禁用自动提交,每个SQL语句或者语句块所在的事务都需要显示"commit"才能提交事务 --autocommit = 1 这种模式会在每条语句执行完毕后把它作出的修改立刻提交给数据库并使之永久化. set autocommit = 0; --读锁或者写锁在事务提交时候释放 SELECT * FROM test WHERE id = 1 LOCK IN SHARE MODE //读锁 SELECT * FROM test WHERE id = 1 for update //写锁 快照读:

Effective GO

一曲冷凌霜 提交于 2020-09-27 02:58:21
最近有人推荐Effective Go,这本书算是给初学者看的,因为已经看多很多Go方面的书了,所以再看这本书,总体收获较小,文章地址:https://learnku.com/docs/effective-go/2020 讲述的知识里,有几点印象深刻一些,在这里分享出来 格式化 go fmt:https://www.jianshu.com/p/104b33439ac2 new和make区别 new:用来分配内存的内建函数, 但与其它语言中的同名函数不同,它不会 初始化 内存,只会将内存 置零 。 也就是说, new(T) 会为类型为 T 的新项分配已置零的内存空间, 并返回它的地址,也就是一个类型为 *T make:只用于创建切片、映射和信道,并返回类型为 T (而非 *T )的一个 已初始化 (而非 置零 )的值。 出现这种用差异的原因在于,这三种类型本质上为引用数据类型,它们在使用前必须初始化 数组和切片的关系 切片是对数组的引用 如果切片范围没有超过数组长度,则两者可以认为是完全相同的东西 如果切片范围超过数组长度,会自动创建一个新的底层数组,取消对原数组的引用,数组和切片便分隔开了 type type File struct/type Integer int:这是结构体,也是类型,实现了函数便是类 type IFile interface:这是接口

影响MySQL性能的环境变量详解

亡梦爱人 提交于 2020-09-26 08:20:06
本文目的: 本文旨在详细介绍影响MySQL性能的环境变量,让读者能够正确了解变量的含义,从而结合实际需求设置合理的值。 环境说明 : MySQL版本:8.0.20 (文章内容基本适用MySQL5.7) 版权说明: 本文为博主原创,转载请注明出处。 原文地址: https://blog.csdn.net/qq_38688267/article/details/108317510 文章目录 前言 查询环境变量 设置环境变量 重要变量介绍 全局变量 Innodb引擎变量 MyISAM引擎变量 补充说明 在DML语句中设置环境变量 join_buffer_size取值 排序优化相关设置 总结 前言 查询环境变量 -- 查看所有环境变量 show variables ; -- 模糊查询环境变量 show variables like '%size%' ; 设置环境变量 -- 会话级设置,只会影响当前会话 set session join_buffer_size = 1024 * 256 ; -- 全局设置 set global join_buffer_size = 1024 * 512 ; 重要变量介绍 全局变量 参数名 默认值 作用 说明 max_connections 151 允许的最大同时客户端连接数 这个根据业务需求和硬件条件设置,一般一两千即可,Linux系统最多支持10000。

MYSQL-外键约束(图文)

风流意气都作罢 提交于 2020-09-24 07:27:43
简介 外键的使用条件: 两个表必须是InnoDB表,MyISAM表暂时不支持外键 外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引 外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如int和tinyint可以,而int和char则不可以,且被关联字段必须保证唯一 四种外键约束方式 RESTRICT(约束):如果出现在删除时,意思是约束外键主键did记录(主表中的记录)不能直接删除,必须先删除被约束的表(从表)字段中dept_id所有这个外键主键值对应的记录,才能删除外键约束(主表中的记录),测试发现在navicat中不选择默认设置的就是这种 NO ACTION:在MySQL中等同于RESTRICT,原因如下:restrict是在修改或者删除之前去检查从表中是否有对应的数据,如果有,拒绝操作,而no action是来源标准的sql,在有些数据库中,会延迟检查,即在修改或者删除完以后去检查从表中是否有对应的数据,如果有,拒绝操作,但是在MySQL中,外键约束都会立即检查,所以两者等价 CASCADE:删除选择这个时,删除主表中的记录时,主表中的这个主键id关联的从表的这个id值所在的记录也会被删除。建议不选。 SET NULL :删除选择这个时,如果从表(被约束的字段所在的表中)被约束的字段的值设置为可以为空时