day51
django小白必会三板斧 # 启动django项目之后 如何添加更多的功能
如果要添加功能 就去urls.py和views.py
# diango自带重启功能
当识别到项目中代码有变化之后 隔段时间会自动重启 但是间隔时间较慢 建议手动重启来自查代码
# 与浏览器打交道的视图函数都应该有返回值
HttpResponse
主要用于返回字符串类型的数据
render
主要用于返回html文件 并且支持模版语法 还可以给index页面传值
redirect
主要用于重定向 括号内可以写其他网站的全称 也可以写自己网站的后缀
(如果要返回一个页面 让你重新返回另外一个页面)
还可以跳转到自己写的页面 (从index页面跳转到home)
登录功能 我们之所以可以在浏览器地址栏中输入不同的路由访问到不同的资源
是因为我们在后端框架中提前开设了相应的访问接口所以用户才能访问
言外之意就是没有开设借口 就无法访问
# 1.开设接口返回登录页面
# 2.需求:登录页面需要用到bootstrap并且还需要自己编写css和js
静态文件
# 3.页面需要获取前段用户数据并且传递给后端
from表单
action参数:控制数据的提交地址
method参数:控制请求的提交方式
# 4.访问登录页面
静页面全部显示资源不存在
http://127.0.0.1:8000/static/bootstrap-3.3.7-dist/css/bootstrap.min.css
原因:没有开设静态资源访问的接口
# 5.开设静态资源的访问接口
理论上应该自己去路由层开设接口资源 但是由于静态文件资源使用频率很高
只要是一个web项目都肯定需要 所以django为了避免开发者繁琐 提供了静态资源的配置文件
// 微信小程序一键授权登录(获取用户基本信息) LoginMpWx({ commit }, data) { return new Promise((resolve, reject) => { LoginApi.loginMpWx({ form: data }, { isPrompt: false }) .then(response => { const result = response.data loginSuccess(commit, result) resolve(response) }) .catch(reject) }) },
// 微信小程序一键授权登录(授权手机号) LoginMpWxMobile({ commit }, data) { return new Promise((resolve, reject) => { LoginApi.loginMpWxMobile({ form: data }, { isPrompt: false }) .then(response => { const result = response.data loginSuccess(commit, result) resolve(response) }) .catch(reject) }) },
Process和Thread
说起进程,就不得不说下程序。程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。 而进程则是执行程序的一次执行过程,它是一个动态的概念。是系统资源分配的单位 通常在一个进程中可以包含若干个线程,当然一个进程中至少有一个线程,不然没有存在的意义。线程是CPU调度和执行的的单位。 注意:很多多线程是模拟出来的,真正的多线程是指有多个cpu,即多核,如服务器。如果是模拟出来的多线程,即在一个cpu的情况下,在同一个时间点,cpu只能执行一个代码,因为切换的很快,所以就有同时执行的错觉。 核心概念:
线程就是独立的执行路径; 在程序运行时,即使没有自己创建线程,后台也会有多个线程,如主线程,gc线程;main()称之为主线程,为系统的入口,用于执行整个程序 在一个进程中,如果开辟了多个线程,线程的运行由调度器安排调度,调度器是与操作系统紧密相关的,先后顺序是不能人为干预的。 对同一份资源操作时,会存在资源抢夺的问题,需要加入并发控制;线程会带来额外的开销,如cpu调度时间,并发控制开销。 每个线程在自己的工作内存交互,内存控制不当会造成数据不一致
概述 背景 Apache Doris官方地址 https://doris.apache.org/
Apache Doris GitHub源码地址 https://github.com/apache/incubator-doris
Apache Doris是一个现代化的MPP分析型数据库产品。仅需亚秒级响应时间即可获得查询结果,有效地支持实时数据分析。Apache Doris的分布式架构非常简洁,易于运维,并且可以支持10PB以上的超大数据集。 Apache Doris可以满足多种数据分析需求,例如固定历史报表,实时数据分析,交互式数据分析和探索式数据分析等。令您的数据分析工作更加简单高效! Doris 最早是解决百度凤巢统计报表的专用系统,随着百度业务的飞速发展对系统进行了多次迭代,逐渐承担起百度内部业务的统计报表和多维分析需求。2013 年,百度把 Doris 进行了 MPP 框架的升级,并将新系统命名为 Palo ,2017 年以百度 Palo 的名字在 GitHub 上进行了开源,2018 年贡献给 Apache 基金会时,由于与国外数据库厂商重名,因此选择用回最初的名字,这就是 Apache Doris 的由来。 之后在美团, 小米, 字节跳动, 京东等互联网企业被适用于核心业务实时数据分析。Apache Doris 与 Clickhouse 都是 MPP 数据库领域的优秀产品,各自擅长的领域或适用的场景存在差异,所有用户可以基于技术认知和业务需求来抉择到底该选择哪一款产品,甚至在大多场景里两者是可以并存和相互补足的。 2020 年 2 月,百度 Doris 团队的个别同学离职创业,基于 Apache Doris 之前的版本做了自己的商业化闭源产品 DorisDB ,这就是 StarRocks 的前身。DorisDB升级为StarRocks,并全面开源。 定义 StarRocks官网地址 https://www.starrocks.com/zh-CN/index 目前最新版本为2.2.0
StarRocks官网文档地址 https://docs.starrocks.com/zh-cn/main/introduction/StarRocks_intro
#my_01.py print('这段代码来自my_01,他将会被执行!') if __name__ == '__main__': print('这段代码如果不是导入的将会直接执行') #my_02.pyimport my_01 if __name__ == '__main__': print('这段代码来自my_02.py') 执行my_test.py,结果如下:
执行my_test.py,结果如下:
小结:
1.if __name__ == '__main__' 作用是来表示本文件的,如果在本文件中执行代码,则代码会被直接执行,即使if语句成立
如果test_02中导入test_01模块,则会进行判断,test_02中的语句将会直接执行,而导入进来的test_01模块此时name不是main,所以不会被执行
2.一般是将测试代码放在if __name__ == '__main__' 语句里面
1.join的使用
如果使用join,优化器将自己选择驱动表;使用straight_join,左边的为驱动表。
NLJ(index nested loop join):从驱动表中读一行(全表扫描),按照join条件获取索引到被驱动表中取出一行(索引查找,如果是非主键索引还有一次回表),将俩行组成结果集。此时让大表作为被驱动较好,能使用上被驱动表的索引是关键。
注:全表扫描就是走主键索引
(simple nested loop join):被驱动表没有join条件中的索引,总扫描行数为M*N,量级太大。(实际上使用BNL)
Block Nested-Loop Join BNL(block nested loop join):被驱动表不能使用索引,将驱动表全表扫描出来放到join buffer,扫描被驱动表每一行和join buffer中所有行比较,返回结果。总扫描行数为M+N,比较次数还是M*N,比较是在内存的速度快。
问题是:join buffer放不下。此时分段放入buffer,循环k次以上流程。扫描行数为N+k*M,比较次数不变,其中k和N线性相关,因此小表作为驱动表更好。
注意:小表是指满足where条件的行数、总数据量更少的表。
2.MRR
非主键索引有序,主键索引随机->从非主键读出行数据放入read_rnd_buffer中,将buffer中的主键id按照递增排序,再去主键索引中查找完整的行记录。
3.join查询的优化
有了MRR,NLJ可以优化为BKA(batched key access):从驱动表中多拿几行出来,放入临时内存join_buffer中,按照被驱动表需要查询的索引有序为目标进行排序,顺序读出多行记录。
BNL的问题:驱动表多次扫描,同一行数据相隔超过1s再次被扫描到,被放入young区,使得正常查询的内存命中率低;前提是:驱动表的数据量小于old区域buffer的大小(3/8)。问题2:驱动表太大,一直往old区域的头处插入,同时不断从尾端淘汰行数据,导致正常查询的不能在old区待够1s。
可以在被驱动表上添加索引,使得BNL算法改良为BKA算法;如果索引代价不值得,使用临时表:将被驱动表(大量行)筛选后的数据(少量行)放入临时表,给临时表join条件中的字段加索引,让驱动表和临时表做join操作,就使用了BKA算法。
mysql本身没有实现,可以在业务端实现的方法:使用hash join。
4.临时表
临时表不是内存表,可以使用innodb或myisam等其他引擎,必须使用engine=memory才是内存表。
临时表只能被创建他的线程访问(所以线程结束后临时表自动删除),其他线程不可见,临时表可以和普通表同名,同名时候优先访问临时表(curd),show tables不显示临时表。
临时表的名字由进程id,线程id,序列号等组成,不会冲突。
每个线程都管理一个临时表的链表。
以上是手动创建的临时表,还有自动创建的内部临时表:例如使用union语句,会把其中一个查询放到临时表中缓存,因为需要做对比,所以后台自动创建了一个临时表。
5.内存表
数据和索引分开存放,索引是hash结构,不是有序的。因此全表扫描不走主键索引,直接扫描数据,不能保证有序,就是按照写入的顺序存放的。把内存表数据看做一个数组即可。
内存表也支持B树索引,可以范围查询。
内存表锁的粒度较大,只支持表级锁。和MDL不同,不是DDL操作也会锁住整张表。
bug:重启直接丢失数据,如果binlog再记录一条delete from t1,从备库传到主库,主库正常使用的内存表都被清空了。
6.自增主键
自增主键不是连续的。
对innodb引擎,在5.7及之前的版本,放在内存,每次重启扫描现有的最大值,+1作为自增值。在8.0及之后的版本,自增值记录在redo log 中,依靠redo log恢复。
实际使用:以语句中指定的和系统中维护的较大的值为新的自增值插入,如果语句中的大于系统中维护的,为保持之后的一致性,系统中维护的也要增大。可以设置系统维护的自增值每次增加的步长,例如在主备情况下可以设置为2,让一个始终为奇数一个始终为偶数避免冲突。
系统维护的自增值的修改操作早于DML操作,例如插入失败,维护的自增值不会回退了。为什么不回退呢?多事务并发场景,回退可能冲突,而判断不冲突的代价太大,索性不回退。或者自增值上的锁直到事务结束才解开,这样粒度太大了不值得。
statement格式的binlog日志只能原样记录语句,如果语句中没有显式指定自增值,在并发情况下,主备库之间通过bin log同步时候自增值可能会混乱。
#region 内存回收 [DllImport(kernel32.dll, EntryPoint = SetProcessWorkingSetSize)] public static extern int SetProcessWorkingSetSize(IntPtr process, int minSize, int maxSize); public static void ClearMemory() { GC.Collect(); GC.WaitForPendingFinalizers(); if (Environment.OSVersion.Platform == PlatformID.Win32NT) { Form1.SetProcessWorkingSetSize(System.Diagnostics.Process.GetCurrentProcess().Handle, -1, -1); } } #endregion
1.0 Java开发环境搭建 卸载JDK
删除Jdk的安装目录 删除JAVA_HOME 删除Path环境变量里面和JAVA_HOME相关的所有 cmd里面java - version查看时候删除成功 安装JDK
百度JDK8,找到下载地址 同意协议 下载电脑对应的版本 双击安装jdk 记住安装的路径 配置环境变量 我的电脑->右键->属性->高级系统设置->环境变量 新建系统变量JAVA_HOME,值为jdk安装的路径 配置Path变量,添加%JAVA_HOME%\bin和%JAVA_HOME%\jre\bin 测试JDK是否安装成功 打开cmd java -version
TodayDinner 假装努力,现实不陪你演戏 BUG 1. 这个是正确的maven的setting配置,仓库文件路径直接复制过来就行了。 2. cannot resolve plugin org.apache.maven.plugins:maven-surefire-plugin:2.12.4错误。 解决: 3. SQL语句中where查询两种情况: 条件查询 模糊搜索查询
1、查看数据库锁,诊断锁的来源及类型: select object_id,session_id,locked_mode from v$locked_object v$locked_object包含的是当前DB中被锁住的OBJECT,session_id 可以关联V$SESSION,object_id 可以关联 dba_objects。 locked_mode: 0:none 1:null 空 2:row-s 行共享(rs):共享表锁,sub share 3:row-x 行独占(rx):用于行的修改,sub exclusive 4:share 共享锁(s):阻止其他dml操作,share 5:s/row-x 共享行独占(srx):阻止其他事务操作,share/sub exclusive 6:exclusive 独占(x):独立访问使用,exclusive
select b.owner,b.object_name,b.object_type,l.session_id,l.locked_mode from v$locked_object l, dba_objects b where b.object_id=l.object_id 都字面意思,owner 拥有者、object_name 项目名称、 object_type 项目类型。
select lpad(' ',decode(l.xidusn ,0,3,0))||l.oracle_username user_name,o.owner,o.object_name,o.object_type,s.sid,s.serial# from v$locked_object l, dba_objects o, v$session s where l.object_id=o.object_id and l.session_id=s.sid order by o.object_id,xidusn desc; 查询谁锁的表及等待列表,第一行锁、其余为等待列表。
2、找出数据库的sid 和 serial#
据说v$locked_object 行级锁以上才有记录,v$lock记录的是所有的锁,包括系统锁,利用v$lock一定要加上object_name,不然查出来一堆。