一、基础
1、表的三范式:
第一范式:列属性不可再分(例如 用户表中常有姓名和电话,如果直接用了一个字段叫 ‘用户信息’,里面存 姓名加电话,这种就不符合一范式,因为属性里还可以再分;再比如收货地址应该单独分‘省市区’,而不是放在一起;又比如班级和学院应该单独分开而不是放同一个字段;等等这些例子)
第二范式:满足了 一范式,并且表中是联合主键,则其他非主键字段需依赖于联合主键而不能只依赖于主键中的某一个字段,即不能出现部分函数依赖(比如表中 课程&学号 共同确定成绩是 ok的,但表里还有 ‘课程学分’ 字段,它其实只需要 ‘课程’ 自己就可以确定,不需要 ‘学号’,这个就不满足 二范式了)(注:如果没有联合主键,二范式就没问题了)
第三范式:满足了 二范式,并且表中非主键字段都得直接依赖主键,而不能是间接,即不能出现 传递依赖(例如表中 ‘学号’ 来确定 ‘班级’是 ok的,但是如果表里还有 ‘班级地址’,它是通过 学号确定班级,班级再确定 班级地址的,这样产生了传递依赖,就不满足 三范式了 )
2、mysql 语法顺序 & 执行顺序:
SELECT
FROM
LEFT JOIN ON
WHERE
GROUP BY
HAVING
ORDER BY
LIMIT
范例:
SELECT user.name
FROM user
LEFT JOIN order ON user.id = order.uid
WHERE order.price > 100
GROUP BY user.name
HAVING count(1) > 4
ORDER BY user.name
LIMIT 0,10
整个语句顺序:
FROM(将最近的两张表,进行笛卡尔积)---VT1
ON(将VT1按照它的条件进行过滤,对笛卡尔积进行筛选)---VT2
LEFT JOIN(以左表为基准,对筛选后的笛卡尔积记录处理)---VT3
WHERE(过滤VT3中的记录)--VT4...VTn
GROUP BY(对VT4的记录进行分组)---VT5
HAVING(对VT5中的记录进行过滤)---VT6
SELECT(对VT6中的记录,选取指定的列)--VT7
DISTINCT(如果还有这个字段,则会进行去重)--VT8
ORDER BY(对VT8的记录进行排序)--游标
LIMIT(对排序之后的值进行分页)
注意:如果 JOIN了多个表,那么重复 ON 和 JOIN步骤
WHERE 后面条件的顺序:
mysql 是从左到右
oracle 是从右到左
3、mysql 体系架构
Connectors:客户端连接
Management Serveices & Utilities:管理服务和工具
Connection Pool:连接池,重用客户端连接
SQL Interface:SQL 接口,接收 SQL命令
Parser:解析器,解析 SQL语句并进行 词法 & 语法分析,最后构造成 解析树
Optimizer:优化器,对解析好的 SQL语句进行优化,解析树转换为 查询计划(经过 选取 - 投影 - 联接 )
Cache和Buffer:查询缓存,对 SQL语句进行 hash作为 key,查询结果为 value
Storage Engines:存储引擎接口,给上层服务 调用(它是基于表的,就是表可以单独设置 引擎类型,而不是数据库的)
File System:文件系统,最终数据都是存储到 硬盘文件里
4、mysql 执行流程
服务器通过用户名/密码或者SSL证书进行认证,认证后验证操作权限
查询缓存,如有则返回,没有则进行后面的解析、优化、执行
mysql解析器根据查询sql 经过词法分析、语法分析构造解析树,并按照语法规则验证语句正确性(关键字或者顺序等),然后预处理器进一步校验(表名、字段名等正确性)
查询优化器找到最优执行计划把解析树转化为查询计划(经过选取、投影、联接)
执行计划调用查询执行引擎,查询引擎通过API接口查询数据
查到数据,返回,并存入缓存
5、mysql 存储引擎
InnoDB(5.5.8 之后默认)
MyISAM
6、文件
1、参数文件:
windows:my.ini
linux:my.cnf
2、数据文件:(SHOW VARIABLES LIKE ‘%datadir%’)
InnoDB:.frm 表定义文件、.ibd 独立表空间文件、.ibdata 共享表空间文件
MyISAM:.frm 表定义文件、.myd 数据文件、.myi 索引文件
3、日志文件:
错误 err log:记录错误信息,参数 log_error配置的路径
二进制 binlog:记录了 DDL & DML 的语句,可用来恢复数据,配置 log_bin才能开启,mysql Server层负责而不是存储引擎负责,用来恢复/复制/审查,查看要借助工具 mysqlbinlog,InnoDB的事务未提交前二进制日志写到 binlog_cache_size大小的缓存中,提交后直接就写入二进制文件
事务日志 redo & undo:redo log用于 事务提交和回滚,存储引擎负责,ib_logfile0/ib_logfile1,每个文件默认 8M,写完1再2再1循环,undo放 .ibdata 文件
通用日志 general query log:CRUD 都记录,默认不开启,参数 general_log_file配置的路径
慢查询 slow query log:记录执行超过设定时间 long_query_time的 SQL,配置 slow_query_log=ON 开启,修改 log_output参数为 TABLE,则输出到mysql库下 slow_log表
中继日志:主从复制时, 从机 slave 会用到
7、存储结构
(1)无索引:遍历双向链表,找到对应的页,再从页中遍历单向链表找到数据
(2)有索引:二分查找找到对应的页,若是 辅助索引,则先找到索引对应的主键,用主键去 主键索引 拿数据,若是 主键索引 就直接拿数据
存储机制:日志文件是用 顺序IO 存储,数据文件采用 随机IO存储
8、数据类型
http://c.biancheng.net/view/7175.html
https://www.cnblogs.com/hzcya1995/p/13309479.html
注:数值中字段长度和类型取值范围无关,字段长度只是指明可能显示的最大长度,数据小于指定长度则用空格填充,大于指定长度如果没超过取值范围也是可以正常使用的。
9、常用内置函数
https://blog.csdn.net/hellokandy/article/details/82964077
二、索引
1、简介:索引是一种数据结构,为了加快数据库 查询效率而产生,它是基于 存储引擎的,不同引擎实现索引方式不同,它也占用空间
2、InnoDB & MyISAM 的索引:都是基于 B+Tree实现(B+Tree只有叶子节点存数据, BTree是叶子和非叶子都存数据)
3、分类-存储维度:
聚集索引:按照唯一标识构造B+树,叶子存放行数据(如没主键,则用 唯一索引作为 聚集索引,如还没唯一索引,则 mysql 生成一个隐式的主键),innodb的唯一标识用聚簇索引因为它数据放在一起,但普通索引因为需要先通过普通索引找到叶子节点中的 聚簇索引key,再回表查数据因此它是非聚簇索引。
非聚集索引:叶子存放 数据地址,再通过 数据地址去拿真正的行数据,MyIsam就是非聚簇索引因为需要先通过索引再用 数据地址去找数据
4、分类-使用维度:
主键索引:非空,唯一
唯一索引:可空,唯一
普通索引:可空,不唯一
组合索引:多个列组成
全文索引:MyISAM引擎上才能使用,只能在CHAR,VARCHAR,TEXT类型字段上使用全文索引
5、最左前缀原则:索引匹配根据建立的顺序,从左到右匹配,一旦断层/范围查询后面就用不到索引,组合索引中使用(参考 https://www.cnblogs.com/ljl150/p/12934071.html)
组合索引 (name,age,sex)
where name='' and age='' and sex='' --可全部用到索引
where name='' and sex='' and age='' --可全部用到索引(因为优化器会调整顺序)
where name='' and sex='' --只有 name用到索引
where age='' and sex='' --没有用到索引
where name='' and address='' and age='' --只有 name用到索引
where name='' and age != '' and sex='' --只有 name用到索引,但如果建立的是 (name,sex,age)那么 sex也能用,因为优化器会优化
存储在 B+Tree里是 (1,1,1),(1,1,2),(1,2,1),(1,2,2),(2,1,1),它是先按第一个排序如 1到2,然后在第一个排好的基础上再对第二个排序
6、索引覆盖 & 回表 & ICP下推:
索引覆盖:查询的列都包含在 索引中(此时 extra中显示是 Using Index )
回表查询:先用 非主键索引拿到 主键索引的值,再通过 主键索引 查其他列的数据,多少条记录就回表几次
索引下推ICP:某些被索引的列,由原来的 MysqlServer 层判断下推到 引擎层去判断,然后再返回 Server层,加快效率,因为 Server和引擎交互次数也是费时间的(5.6开始有的,Extra的值为Using index condition );比如 (name,age)的组合索引在 5.6之前是先用 name去存储引擎查到数据然后返回给 server层进行数据过滤,但 5.6开始就是利用 name,age两个值都放到存储引擎查询数据再返回 server层。
7、索引失效:
不符合 最左原则
索引上用了范围查询/不等号/判空/计算(如 age=age+1)
like 时 % 号在前面
索引字符串没加 引号
索引用了 or
8、创建原则:
(1)需要索引:
主键自动是 索引
频繁查询的字段应该建 索引
多表 关联,关联字段应该建 索引
排序字段可有索引(因为索引用了 B+Tree,B+Tree是有顺序的)
统计或者分组的字段该有索引
(2)不需要索引
表记录少(因为索引也占用空间)
经常要 增删改
重复性较高的字段
查询字段使用 频率不高
9、索引原理:
(1)排好序的数据结构,不用全表扫描
(2)局部性原理 & 磁盘预读:磁盘IO是非常高昂的操作,计算机操作系统做了一些优化,当一次IO时,不光把当前磁盘地址的数据,而是把相邻的数据也都读取到内存缓冲区内,以 页为单位一般为4k或8k。
(3)选用 B+Tree:叶子节点才存数据,非叶子不存数据
三、执行计划 Explain
1、简介:查看 select 执行计划,分析执行过程(测试这个时记得数据库保持一定量的数据,如果只有一两条有时候优化器反而直接用全表扫描更快,会导致现象不是预期的)
2、参数:(参考 https://segmentfault.com/a/1190000008131735)
id: SELECT 查询的标识符. 每个 SELECT 都会自动分配一个唯一的标识符
select_type: SELECT 查询的类型(1、SIMPLE 表示此查询不包含 UNION 查询或子查询,2、 PRIMARY 表示此查询是最外层的查询,3、 SUBQUERY 子查询中的第一个 SELECT,4、 DEPENDENT SUBQUERY 子查询依赖于外层查询的结果 )
table: 查询的表
partitions: 匹配的分区
type: join 类型(ALL < index < range ~ index_merge < ref < eq_ref < const < system
)
possible_keys: 此次查询中可能选用的索引
key: 此次查询中确切使用到的索引.
ref: 哪个字段或常数与 key 一起被使用
rows: 显示此查询一共扫描了多少行. 这个是一个估计值.
filtered: 表示此查询条件所过滤的数据的百分比
extra: 额外的信息
3、show profiles
四、事务 & MVCC
1、事务基础可看:https://blog.csdn.net/qq_20475615/article/details/93713519
2、redo Log :InnoDB引擎中的重做日志,采用了 预写日志 的策略,数据写到 buffer pool之后,也把 redo日志写到 redolog Buffer(记录索引页、数据页、undolog页),事务提交后,再写到 redo日志文件 (可通过配置修改事务提交和 redo日志落盘机制),成功写入 redo日志,则认为 事务提交成功 ,如果宕机可通过该日志恢复保证数据可靠性。存储引擎负责,ib_logfile0/ib_logfile1,写完1再2再1循环 ,因为日志是 顺序IO 存储 ,数据文件采用 随机IO存储,所以 redo log 比较快。等到 buffer pool中的数据落盘之后,则会清除 redolog日志 。
3、undo Log:存储在共享表空间 .ibada文件 中的回滚段中,每次事务更新都会新增一条事务 undo日志记录,里面有回滚指针记录上一条id值,可用来做回滚。
4、InnoDB 之 MVCC(依赖于 undolog 和 read view)
快照读:普通查询,不加锁,读的是历史版本,在 undolog中。
当前读:增删改,加 写锁,读的是最新版本。
一致性非锁定读:通过 MVCC,如果读的行在 删改,不需要等锁释放,而是直接去 undo读最新可见快照,也就是历史版本。
一致性锁定读:某些情况需要对读加锁保证一致性,可通过 for update加写锁 或者 lock in share mode加读锁。
适用: 两种隔离级别,read_commited 时快照都是最新一份快照,而 repeatbale read则是读第一次查时的那一份。
实现: 它是通过在每行记录后面增加两个隐藏列来进行版本控制(其实还多一个 row_id表示行唯一标识,不过事务我们用到另外两个字段而已),存了两个版本号;新增或者更新时就把事务号作为 当前版本号,删除或更新的旧记录的事务号就作为 删除版本号。如果恢复数据,是需要根据 undolog 一条条往回找,因为每行记录只记录了上一行的历史事务号,即 事务链表。
5、事务实现原理分析
原子性:undolog,undolog用于回滚
持久性:redolog + force log at commit,redolog 用于恢复、force log at commit保证事务提交后 redolog已落盘。
隔离性:MVCC + 锁
一致性:依赖 原子+持久+隔离 来完成
redolog & undolog关联: undolog其实一开始也是在 redolog 里存了一份。一般 commit事务后redolog会刷盘,redolog每秒也会刷盘,如果在 commit前 redolog已经刷盘(即 redologl里的undolog刷盘),那么奔溃重启后就可以去 redolog里找对应的 undolog来回滚数据;但是 commit前如果 redolog还没刷盘,那重启后就只能去存在 .ibdata里找历史的 undolog日志;最后是 commit后的情况,redolog完成即使奔溃后面重启直接 redolog重做新记录即可,不需要恢复数据。
Innodb 中,即使查询语句,其实也是放在一个事务中。
五、锁
1、分类-粒度:
表锁:对整个表加锁,开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低
行锁:对一行数据加锁,开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高
元数据锁 MDL:对表做 增删改查时加 MDL读锁,即不能修改表结构;对 表结构做变更加 MDL写锁,即不能增删改
2、表锁分类-功能:(看锁状态:show status like 'table%'; )
意向共享/IS锁:lock table read
意向排他/IX锁:lock table write
3、行锁分类-功能:(看锁状态:show status like 'innodb_row_lock%'; )
共享/S/读锁:lock in share mode,加了之后其他事务能加 共享锁 但不能加 排他锁,但只读是正常的
排他/X/写锁:for update,加了之后其他事务 共享锁 和 排他锁 都不能加,但只读是正常的 (DML会自动加上 排他锁 )
4、行锁分类-范围:
Record Lock记录锁:锁一条记录,使用主键/唯一索引 锁定时产生
Gap Lock间隙锁 :如果用到锁的地方用了 非唯一索引,则会锁定前后记录之间的范围(比如 (id,age) ->(1,3),(3,6),(8,10),如果我 where 用了 age=6,则会把 id 1~8 且 age 3~10 的记录锁住,这里必须是 id 和 age 同时落在范围才算,当然如果是 前后没有记录,则是锁 无穷小/大);或者 唯一索引使用了范围条件,则会锁定范围条件内的数据(比如 主键 where id>1 and id < 5,锁定了范围 1~5之后,插入 id 为 3 或 4 的记录都需要等待)
Next-Key 临键锁:记录+间隙锁,它只有在事务隔离级别为 可重复读 生效(左开右闭)
注:间隙锁是在 可重复度 级别下才会有的
5、死锁:多个事务各自拿了部分资源,都等待对方释放锁
6、InnoDB 锁原理:对索引项加锁,如果一个索引都命不中,则升级为 表锁
7、两阶段锁:同个事务中只能一直加锁,直到最后事务提交或回滚解锁,而不能在事务中边加锁边解锁
8、加锁类型:https://mp.weixin.qq.com/s/qgC3G7tWZfblxSrALKmWgQ
行锁对 索引 加锁,如果执行锁的语句,where 后没有一个用到索引,在 RR级别下则会升级为 表锁
六、性能优化
使用自增主键,不要用 uuid(uuid是散列存储,可能造成原有的页分裂)
合理创建索引
可以合理反规范化
select 少用 * ,count(*),where 里不用 1=1
创建组合索引,用 exists 而不是 in
七、主从复制 & 读写分离
1、主从可看:https://blog.csdn.net/qq_20475615/article/details/98887912
2、读写分离:
八、分库分表
1、mycat:
2、sharding JDBC:https://blog.csdn.net/qq_20475615/article/details/99693224
九、备份
十、参数配置
十一、扩展
1、InnoDB
(1)data page & index page:数据脏页 &索引页,增删改时 缓存的数据和磁盘数据不一致,所以它是脏页
(2)insert buffer page:插入缓冲页
(3)adaptive hash index:自适应 hash,对访问频率高的 热点页建立 哈希索引,提高查询效率
(4)lock info:锁信息,行/表锁信息
(5)data dictionary:数据字典,元数据信息如表结构、数据库/表名、表字段、视图、索引、存储过程、触发器等
(6)redo log buffer:重做日志缓存,
(7)double write:双写,对 缓冲池中的数据进行落盘的时候,数据写到 共享表空间 和 独立表空间 两份,防止写入磁盘奔溃时可以找回。
(8)check point:检查点
(9)局部性原理
(10)查看表结构数据
SELECT
TABLE_NAME as '表名',
COLUMN_NAME as '字段名',
COLUMN_TYPE as '数据类型',
DATA_TYPE as '数据类型',
(case when CHARACTER_MAXIMUM_LENGTH is not null then CHARACTER_MAXIMUM_LENGTH when NUMERIC_PRECISION is not null then NUMERIC_PRECISION else '' end) as '长度',
CHARACTER_MAXIMUM_LENGTH,
NUMERIC_PRECISION,
(case when COLUMN_KEY = 'PRI' then '主键' else '' end) as '主键/外键',
IS_NULLABLE as '是否为空',
COLUMN_COMMENT as '备注'
FROM
information_schema.COLUMNS
WHERE
TABLE_SCHEMA = ''
SELECT TABLE_NAME,GROUP_CONCAT(COLUMN_COMMENT SEPARATOR ",") FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'ny_dev' group by TABLE_NAME
2、索引为什么不是 哈希表 或者是 其他树?
(1)哈希表:memory中有哈希索引,innodb有自适应哈希
a、哈希冲突可能导致数据散列不均匀,产生很多线性查询导致效率不高
b、范围查询效率不高
c、存储时需要加载所有哈希表到内存,内存耗费大
(2)BST:二叉搜索树
a、如果是递增时,就会变成链表
(3)AVL:二叉平衡树
a、插入的时候需要旋转树,性能较差
(4)Red/Black Tree:红黑树
a、每个节点只能存一个数据,数据多就导致树太深
(5)BTree:B树
a、每个节点能存储多个数据(Innodb每次读取 16K的数据)
3、log buffer刷盘设置
2、逻辑优先级
(1)and 比 or优先级高:如下 select * from user u where u.id = '' or u.id='' and u.type=3,即使前后两个记录都不满足 type=3,但是只有后面的记录会被过滤,因为先执行了后者的 and
你可能感兴趣的:(SSM,mysql,java,sql,数据库)
Netty是怎么实现Java NIO多路复用的?(源码)
åå
中间件 JavaIO Netty java nio 后端
目录NIO多路复用实现事件循环是什么?核心源码(1)调用NioEventLoopGroup默认构造器(2)指定SelectorProvider(3)创建`Selector`(4)创建单线程和队列(5)单线程处理就绪IO事件最近想再巩固一下NIO等多路复用的实现思路,本文通过Netty源码来进一步总结NIO多路复用的运用。先上一组简单的NIO多路复用实现,NIO多路复用实现服务端通过selector
oracle盲注技巧,sql盲注的深入讲解
韩军安
oracle盲注技巧
SQL注入大家都知道,很多新人都是从这里入门的,虽然注入语句倒背如流,可是其原理估计很少有人了解。稍微了解一下的也仅仅只是知道SQL注入语句只是一种为了使我们获取信息的一种畸形语句。Ps(很多人不知道SQl注入与SQL盲注的区别,现在我告诉你,没有区别。)首先我先讲讲微软对SQL注入的定义。(1)脚本注入式的攻击(2)恶意用户输入用来影响被执行的SQL脚本相信大家都看的懂。另外,我看到很多新手都在
在 Windows 上,如果忘记了 MySQL 密码 重置密码
web14786210723
面试 学习路线 阿里巴巴 windows mysql 数据库
在Windows上,如果忘记了MySQL密码,可以通过以下方法重置密码:方法1:以跳过权限验证模式启动MySQL并重置密码停止MySQL服务:打开命令提示符或PowerShell,输入以下命令停止MySQL服务:netstopmysql如果服务名称不为mysql,可以通过服务管理器(services.msc)查看MySQL服务的实际名称并停止服务。以跳过权限验证的模式启动MySQL:打开命令提示符
django数据迁移失败,数据库未创建 No changes detected
随心但不率性
django python 后端
接手一个django新项目,启动服务前首先需要做数据迁移python3manage.pymakemigrationspython3manage.pymigrate如果执行上述命令后需要的数据表未创建,且报Nochangesdetected可以检查下每个app目录下是否有migrations目录,若没有,则需要新建,且在该目录下创建文件__init__.py该文件可以为空migrations/__i
flutter 中使用什么本地数据存储
草明
Flutter flutter
在Flutter中,你可以使用多种本地数据存储方式来保存和管理应用程序的数据。以下是一些常用的本地数据存储方式:1.SharedPreferences:shared_preferences包是Flutter的一个插件,用于在应用程序的持久化存储中存储小量的键值对数据。这对于存储用户偏好设置和应用程序配置等数据非常有用。2.SQLite:SQLite是一个轻量级的关系型数据库引擎,可以嵌入到Flut
蓝桥杯试题:DFS回溯
KuunNNn
深度优先 蓝桥杯 算法 java
一、题目要求输入一个数组n,输出1到n的全排列二、代码展示importjava.util.*;publicclassikun{staticList>list=newArrayListres=newArrayListx:list){for(inty:x){System.out.print(y+"");}System.out.println();}}publicstaticvoiddfs(intn,i
【面试】Java 中的 BIO、NIO 和 AIO:区别、使用及实例
刘小炮吖i
Java后端开发面试题 Java java 面试
在Java的I/O编程领域,BIO、NIO和AIO是三种重要的I/O模型,它们各自有着独特的特点和适用场景。理解这三种模型的区别,对于编写高效、高性能的Java网络应用程序至关重要。一、区别对比项BIO(BlockIO)NIO(NewIO)AIO(AsynchronousI/O)JDK版本所有版本JDK1.4及之后JDK1.7及之后异步/阻塞同步阻塞。一个连接一个线程。线程发起IO请求,不管内核是
Django数据迁移
jay丿
django 数据库 sqlite
在Django中,数据迁移是一个核心功能,它允许你通过定义模型(Models)来自动生成数据库表,并且能够随着模型的变化更新数据库结构。下面是对上述命令的详细解释和扩写,以及一些额外的注意事项和技巧。1.检查应用下的模型是否存在异常在执行任何迁移之前,确保你的模型没有语法错误或逻辑问题是很重要的。你可以使用以下命令来检查特定应用下的模型:pythonmanage.pycheckappNameapp
开源项目austin学习day01
努力向前ing
开源项目austin学习 学习 开源
尝试本地运行项目,遇到如下几个报错:1.om.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException:Couldnotcreateconnectiontodatabaseserver.Attemptedreconnect3times.Givingup.问题:jdbc版本与数据库版本不匹配解决方案:更改配置中的jdbc版本使与
面试题-秒杀系统的设计
java路飞
面试复习 java 面试 秒杀系统
文章目录什么是秒杀经典秒杀问题1.如何防止超卖?2.如何防止恶意请求?3.如何提高系统的并发能力?4.如何保证数据的一致性?你如何设计一个秒杀系统1.系统架构设计2.数据库设计3.秒杀流程设计4.安全性设计总结什么是秒杀秒杀是一种特殊的电商营销活动,通常指在一个短暂时间内,以极低的价格售卖限量商品的一种销售模式。秒杀活动通常会吸引大量用户参与,因此需要系统具备高并发、高可用和高性能等特点。在秒杀活
JavaAdv01——字节流和字符流
搬码红绿灯
开发语言 java
一、核心概念解析1.字节流(ByteStreams)字节流家族:输入流:InputStream(抽象类)FileInputStreamByteArrayInputStreamBufferedInputStream输出流:OutputStreamFileOutputStreamByteArrayOutputStreamBufferedOutputStream特点:以8位字节(byte)为单位(1字节
Python 与Java 开发人形机器人远程控制APP
Geeker-2025
python java
开发一款人行开发机器人远程控制App是一个复杂且高度技术性的项目。该项目涉及多个技术领域,包括前端开发、后端开发、物联网(IoT)通信、实时数据处理、数据加密、安全性保障等。使用Python和Java联合开发可以充分利用每种语言的优势,构建一个高性能、可扩展且功能丰富的应用。以下是一个高层次的设计概述,涵盖主要的技术栈和功能模块,并提供使用Python和Java联合开发的示例。##技术栈概述###
说下 Oracle 的导入导出有几种方式,有何区别?思维导图 代码示例(java 架构)
用心去追梦
oracle java 架构
在Oracle数据库中,导入(Import)和导出(Export)数据是日常维护和迁移任务中的重要操作。Oracle提供了多种工具来完成这些任务,每种工具都有其特点和适用场景。以下是几种常见的导入导出方式及其区别。Oracle导入导出方式DataPump(expdp/impdp):这是Oracle10g及之后版本推荐使用的高效工具。传统Export/Import(exp/imp):适用于早期版本的
类似于 FastAdmin的快速后台开发框架都有哪些
zhangfeng1133
php
类似于FastAdmin,能够根据数据表直接生成程序、语言包和界面的框架,确实存在一些其他的选项。以下是一些推荐:ThinkPHP框架的扩展与工具:除了FastAdmin,ThinkPHP作为一个流行的PHP框架,有很多扩展和工具可以帮助你实现根据数据表自动生成代码的功能。你可以查找一些基于ThinkPHP的CRUD生成器或者代码生成器,它们通常能够根据你的数据库表结构快速生成对应的控制器、模型、
Java爬虫——jsoup
xxxmine
java 爬虫 开发语言
JSoup是一个用于处理HTML的Java库,它提供了一个非常方便类似于使用DOM,CSS和jquery的方法的API来提取和操作数据。Jsoup能做什么?从URL、文件或字符串中抓取和解析HTML(爬虫)使用DOM遍历或CSS选择器查找和提取数据操作HTML元素、属性和文本根据安全列表清理用户提交的内容,以防止XSS攻击输出整洁的网页Jsoup相关概念Document:文档对象。每份HTML页面
【Django REF】Django REF 常用知识点汇总
小C学安全
Python django sqlite 数据库
1.序列化器(Serializers)1.1自定义字段1.1.1、直接继承**serializers.Field**并重写关键方法通过继承serializers.Field类,并重写to_representation和to_internal_value方法来实现自定义序列化逻辑。to_representation用于控制从Python对象到原始数据类型的转换(例如,在返回给客户端之前将数据库中的d
Java 反射(Reflection)的原理和应用
盖盖衍上_染染熊_代码集
java基础 java python 开发语言
反射(Reflection)是Java语言的一项强大功能,它允许程序在运行时动态地获取类的信息,并且可以操作这些信息,如创建对象、调用方法、访问字段等。反射机制的核心在于Java的类加载机制和动态类型检查,使得程序在运行时可以灵活操作对象和类的结构。1.什么是反射?反射是Java语言提供的一种机制,允许程序在运行时动态地获取类的信息(如类名、构造方法、字段、方法等),并可以对这些信息进行操作。例如
java面试题:Elasticsearch面试突击【2022年最新】
91科技
常见JAVA面试题 elasticsearch java
目录1、为什么要使用Elasticsearch?(或回答什么是ES?)2、elasticsearch的倒排索引是什么?3、倒排索引的搜索过程是什么样的?4、elasticsearch索引数据多了怎么办,如何调优,部署5、elasticsearch是如何实现master选举的6.详细描述一下Elasticsearch索引文档的过程7、如何对Elasticsearch进行性能优化?1、为什么要使用El
基于SSM框架的校园订餐小程序设计与实现
源码空间站11
课程设计 点餐系统 微信小程序 小程序开发 毕业设计
内容概要:该文章介绍了使用SSM(Spring+SpringMVC+MyBatis)框架及Java开发语言和MySQL数据库,设计并实现了一款名为“校园订餐”的小程序。文中从系统需求出发,阐述了系统背景意义与国内外研究现状发展趋势,明确了需求并分析了系统可行性。随后详细讲解了系统的功能模块、数据库设计方案、微信小程序前端和后台管理的具体实现过程,包括登录注册、餐厅信息管理、美食信息管理和订单管理等
【SpringBoot】+【Vue】集成AOP系统日志
爱因斯坦乐
spring vue.js java aop 交互
新建logs表添加aop依赖org.springframework.bootspring-boot-starter-aop新建获取ip地址工具类importjavax.servlet.http.HttpServletRequest;/***功能:IpUtils*获取ip地址工具类*作者:爱因斯坦乐*/publicclassIpUtils{publicstaticStringgetIpAddr(Ht
数据库设计报告
爱因斯坦乐
数据库
一、概述本数据库设计用于支持「晨光宅配」小程序的业务需求,涵盖用户、商家、配送员、订单、评价等核心模块。设计目标是保证数据一致性、查询性能和高可用性。二、逻辑模型1.实体关系图(ERD)```mermaiderDiagramuser||--o{address:"1:N"user||--o{subscription:"1:N"user||--o{order:"1:N"user||--o{review
【新手入门】SQL注入之数据库数据读取
见青..
sql 数据库 web安全 前端
数据库数据读取获取当前数据库名、用户名、版本等信息'unionselectuser(),version()--+获取mysql所有库名'unionselect1,group_concat(schema_name)frominformation_schema.schemata+--+获取所有字段数据比如获取users表的所有数据指令:'unionselect1,group_concat(id,0x7
【新手入门】SQL注入之防御代码的绕过、数据库数据读取
见青..
sql 数据库 web安全 前端
一、前端防御代码绕过有些输入数据的地方(如登陆页面),当输入的数据不太合适时,直接就有提示,并且不符合要求的话,就不能点击提交按钮,即不能和后台进行交互,像这种行为就都属于前端代码的限制。绕过前端代码最好的方式就是先输入一个符合格式要求的数据,然后抓包--处理--放包。所以前端代码限制的绕过很简单,但碰到js加密和混淆技术(代码语句顺序打乱)时,前端代码绕过也是比较有难度的。二、后端防御代码绕过<
快速入门 FastAdmin 的开发环境搭建
奥顺互联_老张
php教程 php 缓存 mysql
快速入门FastAdmin的开发环境搭建FastAdmin是一个基于ThinkPHP和Bootstrap的后台管理框架,专为快速开发而设计。本文将为您详细介绍如何搭建FastAdmin的开发环境,包括所需的环境配置、安装步骤以及简单的示例代码。1.环境要求在开始之前,请确保您的开发环境满足以下要求:PHP7.2及以上版本ComposerMySQL5.6及以上版本Nginx或ApacheGit(可选
Java I/O 详解:从基础到高级
wertuiop_
java python 开发语言
文章目录前言一、JavaI/O的核心概念1.流(Stream)2.字节流vs字符流二、JavaI/O的核心类1.字节流文件读写缓冲流2.字符流文件读写缓冲流三、JavaNIO(非阻塞I/O)四、JavaI/O的最佳实践总结前言JavaI/O(输入/输出)是Java编程中处理数据流的核心部分。无论是读写文件、网络通信,还是处理用户输入,JavaI/O都提供了强大的支持。本文将带你全面了解JavaI/
23种设计模式-备忘录(Memento)设计模式
萨达大
软考中级-软件设计师 设计模式 备忘录模式 行为型设计模式 软考 软件设计师 C++ JAVA
文章目录一.什么是备忘录设计模式?二.备忘录模式的特点三.备忘录模式的结构四.备忘录模式的优缺点五.备忘录模式的C++实现六.备忘录模式的Java实现七.总结类图:备忘录设计模式类图一.什么是备忘录设计模式? 备忘录设计模式(MementoPattern)是一种行为型设计模式,用于在不暴露对象实现细节的前提下,捕获并保存对象在某一时刻的状态,以便之后可以将其恢复到之前的状态。该模式的主要目标是保存
深入解析Java阻塞I/O的底层机制:中断与进程切换
千里码!
后端技术 java java IO java 开发语言
深入解析Java阻塞I/O的底层机制:中断与进程切换编程相关书籍分享:https://blog.csdn.net/weixin_47763579/article/details/145855793DeepSeek使用技巧pdf资料分享:https://blog.csdn.net/weixin_47763579/article/details/145884039引言Java的阻塞I/O(BIO)看似
Java NIO零拷贝揭秘:DMA如何颠覆传统I/O性能
千里码!
后端技术 java IO java java nio spring
JavaNIO零拷贝揭秘:DMA如何颠覆传统I/O性能编程相关书籍分享:https://blog.csdn.net/weixin_47763579/article/details/145855793DeepSeek使用技巧pdf资料分享:https://blog.csdn.net/weixin_47763579/article/details/145884039引言在高性能网络编程中,JavaNI
ElasticSearch是如何实现分布式的?
weixin_30517001
大数据 java 面试
面试题es的分布式架构原理能说一下么(es是如何实现分布式的啊)?面试官心理分析在搜索这块,lucene是最流行的搜索库。几年前业内一般都问,你了解lucene吗?你知道倒排索引的原理吗?现在早已经out了,因为现在很多项目都是直接用基于lucene的分布式搜索引擎——ElasticSearch,简称为es。而现在分布式搜索基本已经成为大部分互联网行业的Java系统的标配,其中尤为流行的就是es,
【Java 后端】Restful API 接口
非 白
Java网络 java restful 开发语言
RestfulAPI接口REST:RepresentationalStateTransfer,表现层(前端的视图页面和后端的控制层)资源状态转移。一种软件架构的风格(格式)RESTful是目前最流行的互联网软件架构,如果一个架构符合REST原则,则称它为RESTful架构。REST风格提倡URL地址使用统一的风格设计,从前到后各个单词使用斜杠分开,不使用问号键值对方式携带请求参数,而是将要发送给服
Nginx负载均衡
510888780
nginx 应用服务器
Nginx负载均衡一些基础知识:
nginx 的 upstream目前支持 4 种方式的分配
1)、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
2)、weight
指定轮询几率,weight和访问比率成正比
RedHat 6.4 安装 rabbitmq
bylijinnan
erlang rabbitmq redhat
在 linux 下安装软件就是折腾,首先是测试机不能上外网要找运维开通,开通后发现测试机的 yum 不能使用于是又要配置 yum 源,最后安装 rabbitmq 时也尝试了两种方法最后才安装成功
机器版本:
[root@redhat1 rabbitmq]# lsb_release
LSB Version: :base-4.0-amd64:base-4.0-noarch:core
FilenameUtils工具类
eksliang
FilenameUtils common-io
转载请出自出处:http://eksliang.iteye.com/blog/2217081 一、概述
这是一个Java操作文件的常用库,是Apache对java的IO包的封装,这里面有两个非常核心的类FilenameUtils跟FileUtils,其中FilenameUtils是对文件名操作的封装;FileUtils是文件封装,开发中对文件的操作,几乎都可以在这个框架里面找到。 非常的好用。
xml文件解析SAX
不懂事的小屁孩
xml
xml文件解析:xml文件解析有四种方式,
1.DOM生成和解析XML文档(SAX是基于事件流的解析)
2.SAX生成和解析XML文档(基于XML文档树结构的解析)
3.DOM4J生成和解析XML文档
4.JDOM生成和解析XML
本文章用第一种方法进行解析,使用android常用的DefaultHandler
import org.xml.sax.Attributes;
通过定时任务执行mysql的定期删除和新建分区,此处是按日分区
酷的飞上天空
mysql
使用python脚本作为命令脚本,linux的定时任务来每天定时执行
#!/usr/bin/python
# -*- coding: utf8 -*-
import pymysql
import datetime
import calendar
#要分区的表
table_name = 'my_table'
#连接数据库的信息
host,user,passwd,db =
如何搭建数据湖架构?听听专家的意见
蓝儿唯美
架构
Edo Interactive在几年前遇到一个大问题:公司使用交易数据来帮助零售商和餐馆进行个性化促销,但其数据仓库没有足够时间去处理所有的信用卡和借记卡交易数据
“我们要花费27小时来处理每日的数据量,”Edo主管基础设施和信息系统的高级副总裁Tim Garnto说道:“所以在2013年,我们放弃了现有的基于PostgreSQL的关系型数据库系统,使用了Hadoop集群作为公司的数
spring学习——控制反转与依赖注入
a-john
spring
控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心。 控制反转一般分为两种类型,依赖注入(Dependency Injection,简称DI)和依赖查找(Dependency Lookup)。依赖注入应用比较广泛。
用spool+unixshell生成文本文件的方法
aijuans
xshell
例如我们把scott.dept表生成文本文件的语句写成dept.sql,内容如下:
set pages 50000;
set lines 200;
set trims on;
set heading off;
spool /oracle_backup/log/test/dept.lst;
select deptno||','||dname||','||loc
1、基础--名词解析(OOA/OOD/OOP)
asia007
学习基础知识
OOA:Object-Oriented Analysis(面向对象分析方法)
是在一个系统的开发过程中进行了系统业务调查以后,按照面向对象的思想来分析问题。OOA与结构化分析有较大的区别。OOA所强调的是在系统调查资料的基础上,针对OO方法所需要的素材进行的归类分析和整理,而不是对管理业务现状和方法的分析。
OOA(面向对象的分析)模型由5个层次(主题层、对象类层、结构层、属性层和服务层)
浅谈java转成json编码格式技术
百合不是茶
json编码 java转成json编码
json编码;是一个轻量级的数据存储和传输的语言
在java中需要引入json相关的包,引包方式在工程的lib下就可以了
JSON与JAVA数据的转换(JSON 即 JavaScript Object Natation,它是一种轻量级的数据交换格式,非
常适合于服务器与 JavaScript 之间的数据的交
web.xml之Spring配置(基于Spring+Struts+Ibatis)
bijian1013
java web.xml SSI spring配置
指定Spring配置文件位置
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/spring-dao-bean.xml,/WEB-INF/spring-resources.xml,
/WEB-INF/
Installing SonarQube(Fail to download libraries from server)
sunjing
Install Sonar
1. Download and unzip the SonarQube distribution
2. Starting the Web Server
The default port is "9000" and the context path is "/". These values can be changed in &l
【MongoDB学习笔记十一】Mongo副本集基本的增删查
bit1129
mongodb
一、创建复本集
假设mongod,mongo已经配置在系统路径变量上,启动三个命令行窗口,分别执行如下命令:
mongod --port 27017 --dbpath data1 --replSet rs0
mongod --port 27018 --dbpath data2 --replSet rs0
mongod --port 27019 -
Anychart图表系列二之执行Flash和HTML5渲染
白糖_
Flash
今天介绍Anychart的Flash和HTML5渲染功能
HTML5
Anychart从6.0第一个版本起,已经逐渐开始支持各种图的HTML5渲染效果了,也就是说即使你没有安装Flash插件,只要浏览器支持HTML5,也能看到Anychart的图形(不过这些是需要做一些配置的)。
这里要提醒下大家,Anychart6.0版本对HTML5的支持还不算很成熟,目前还处于
Laravel版本更新异常4.2.8-> 4.2.9 Declaration of ... CompilerEngine ... should be compa
bozch
laravel
昨天在为了把laravel升级到最新的版本,突然之间就出现了如下错误:
ErrorException thrown with message "Declaration of Illuminate\View\Engines\CompilerEngine::handleViewException() should be compatible with Illuminate\View\Eng
编程之美-NIM游戏分析-石头总数为奇数时如何保证先动手者必胜
bylijinnan
编程之美
import java.util.Arrays;
import java.util.Random;
public class Nim {
/**编程之美 NIM游戏分析
问题:
有N块石头和两个玩家A和B,玩家A先将石头随机分成若干堆,然后按照BABA...的顺序不断轮流取石头,
能将剩下的石头一次取光的玩家获胜,每次取石头时,每个玩家只能从若干堆石头中任选一堆,
lunce创建索引及简单查询
chengxuyuancsdn
查询 创建索引 lunce
import java.io.File;
import java.io.IOException;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Docume
[IT与投资]坚持独立自主的研究核心技术
comsci
it
和别人合作开发某项产品....如果互相之间的技术水平不同,那么这种合作很难进行,一般都会成为强者控制弱者的方法和手段.....
所以弱者,在遇到技术难题的时候,最好不要一开始就去寻求强者的帮助,因为在我们这颗星球上,生物都有一种控制其
flashback transaction闪回事务查询
daizj
oracle sql 闪回事务
闪回事务查询有别于闪回查询的特点有以下3个:
(1)其正常工作不但需要利用撤销数据,还需要事先启用最小补充日志。
(2)返回的结果不是以前的“旧”数据,而是能够将当前数据修改为以前的样子的撤销SQL(Undo SQL)语句。
(3)集中地在名为flashback_transaction_query表上查询,而不是在各个表上通过“as of”或“vers
Java I/O之FilenameFilter类列举出指定路径下某个扩展名的文件
游其是你
FilenameFilter
这是一个FilenameFilter类用法的例子,实现的列举出“c:\\folder“路径下所有以“.jpg”扩展名的文件。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
C语言学习五函数,函数的前置声明以及如何在软件开发中合理的设计函数来解决实际问题
dcj3sjt126com
c
# include <stdio.h>
int f(void) //括号中的void表示该函数不能接受数据,int表示返回的类型为int类型
{
return 10; //向主调函数返回10
}
void g(void) //函数名前面的void表示该函数没有返回值
{
//return 10; //error 与第8行行首的void相矛盾
}
in
今天在测试环境使用yum安装,遇到一个问题: Error: Cannot retrieve metalink for repository: epel. Pl
dcj3sjt126com
centos
今天在测试环境使用yum安装,遇到一个问题:
Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again
处理很简单,修改文件“/etc/yum.repos.d/epel.repo”, 将baseurl的注释取消, mirrorlist注释掉。即可。
&n
单例模式
shuizhaosi888
单例模式
单例模式 懒汉式
public class RunMain {
/**
* 私有构造
*/
private RunMain() {
}
/**
* 内部类,用于占位,只有
*/
private static class SingletonRunMain {
priv
Spring Security(09)——Filter
234390216
Spring Security
Filter
目录
1.1 Filter顺序
1.2 添加Filter到FilterChain
1.3 DelegatingFilterProxy
1.4 FilterChainProxy
1.5
公司项目NODEJS实践0.1
逐行分析JS源代码
mongodb nginx ubuntu nodejs
一、前言
前端如何独立用nodeJs实现一个简单的注册、登录功能,是不是只用nodejs+sql就可以了?其实是可以实现,但离实际应用还有距离,那要怎么做才是实际可用的。
网上有很多nod
java.lang.Math
liuhaibo_ljf
java Math lang
System.out.println(Math.PI);
System.out.println(Math.abs(1.2));
System.out.println(Math.abs(1.2));
System.out.println(Math.abs(1));
System.out.println(Math.abs(111111111));
System.out.println(Mat
linux下时间同步
nonobaba
ntp
今天在linux下做hbase集群的时候,发现hmaster启动成功了,但是用hbase命令进入shell的时候报了一个错误 PleaseHoldException: Master is initializing,查看了日志,大致意思是说master和slave时间不同步,没办法,只好找一种手动同步一下,后来发现一共部署了10来台机器,手动同步偏差又比较大,所以还是从网上找现成的解决方
ZooKeeper3.4.6的集群部署
roadrunners
zookeeper 集群 部署
ZooKeeper是Apache的一个开源项目,在分布式服务中应用比较广泛。它主要用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步、集群管理、配置文件管理、同步锁、队列等。这里主要讲集群中ZooKeeper的部署。
1、准备工作
我们准备3台机器做ZooKeeper集群,分别在3台机器上创建ZooKeeper需要的目录。
数据存储目录
Java高效读取大文件
tomcat_oracle
java
读取文件行的标准方式是在内存中读取,Guava 和Apache Commons IO都提供了如下所示快速读取文件行的方法: Files.readLines(new File(path), Charsets.UTF_8); FileUtils.readLines(new File(path)); 这种方法带来的问题是文件的所有行都被存放在内存中,当文件足够大时很快就会导致
微信支付api返回的xml转换为Map的方法
xu3508620
xml map 微信api
举例如下:
<xml>
<return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
<appid><