redis为什么快
redis是单线程的,为什么还快?
1.redis是基于内存的,内存的读写速度非常快;
2.redis是单线程的,省去了很多上下文切换线程的时间;
3.redis使用多路复用技术,可以处理并发的连接;
redis持久化
一种是RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(通俗讲是将Reids在内存中的数据库记录定时dump到磁盘上的RDB持久化)。将服务器包含的所有数据库数据以二进制文件的形式保存到硬盘里面
另一种是AOF 持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集(通俗讲是将Reids的操作日志以追加的方式写入文件)。存储的是命令,而不是真实数据
RDB和AOF持久化对比
RDB持久化 | AOF持久化 |
---|---|
全量备份,一次保存整个数据库 | 增量备份,一次保存一个修改数据库的命令 |
保存的间隔较长 | 保存的间隔默认为一秒钟 |
数据还原速度快 | 数据还原速度一般,冗余命令多,还原速度慢 |
执行SAVE命令时会阻塞服务器,但手动或者自动触发的BGSAVE不会阻塞服务器 | 无论是平时还是进行AOF重写时,都不会阻塞服务器 |
mysql的索引
- 普通(MUL)
普通索引 :字段值无约束,KEY标志为 MUL
- 唯一索引(UNI)
唯一索引(unique) :字段值不允许重复,但可为 NULL,KEY标志为 UNI
- 主键索引(PRI)
一个表中只能有一个主键字段, 主键字段不允许重复,且不能为NULL,KEY标志为PRI。通常设置记录编号字段id,能唯一锁定一条记录
mysql引擎
InnoDB
1、支持行级锁,仅对指定的记录进行加锁,这样其它进程还是可以对同一个表中的其它记录进行操作。
2、支持外键、事务、事务回滚
3、表字段和索引同存储在一个文件中
1、表名.frm :表结构
2、表名.ibd : 表记录及索引文件
MyISAM
1、支持表级锁,在锁定期间,其它进程无法对该表进行写操作。如果你是写锁,则其它进程则读也不允许
2、表字段和索引分开存储
1、表名.frm :表结构
2、表名.MYI : 索引文件(my index)
3、表名.MYD : 表记录(my data)
- 如何选择存储引擎
1、执行查操作多的表用 MyISAM(使用InnoDB浪费资源)
2、执行写操作多的表用 InnoDB
CREATE TABLE tb_stu(
id int(11) NOT NULL AUTO_INCREMENT,
name varchar(30) DEFAULT NULL,
sex varchar(2) DEFAULT NULL,
PRIMARY KEY (id)
)ENGINE=MyISAM;
闭包
作用:保留外部函数的栈桢,供内部函数使用
三要素:
1.必须有一个内嵌函数
2.内嵌函数必须引用外部函数中的变量
3.外部函数返回值必须是内嵌函数
可以实现python的装饰器
内存管理
1.引用计数
每个对象记录被对象绑定的数量,当为0时被销毁
缺点:列表循环引用:两个列表即使都是垃圾也不会被销毁,因为引用计数为1
2.标记清除
扫描全部内存,标记没用的数
缺点:全盘扫描消耗资源过大
3.分代回收(年轻代,中年代,老年代)
新创建的对象,会在年轻代分配空间
本带空间存满后,进行升代(标记清除)
继续在本空间开头存储数据
老年代被清除的几率不是很高。