记录一些细碎的东西
- mysql in 查询:某个范围内的值连续的会走索引 ,不连续的不会走索引
- htmlspecialchar() 会转移特殊字符:& =>& “=>" ‘ => ' < => ≶ > =>>
- 今天被人问到mysql 的三大范式:
1. 第一范式: 每一列属性都是不可再分的属性值,确保每一列的原子性 2. 第二范式: 有主键,对记录的惟一性,要求记录有惟一标识,即实体的惟一性 3. 第三范式:非主键字段不能相互依赖,是对字段的冗余性,要求任何字段不能由其他字段派生出来,它要求字段没有冗余,即不存在传递依赖;(需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关)
- 工厂模式:一般类实例化都靠new,工厂类可以按需去实例化不同的对象,这样就避免了对原始类的依赖,实现了解耦。
- 什么是redis雪崩,什么是redis穿透,redis在项目中的使用场景
1. 缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。请求的数据在缓存大量不命中,导致请求走数据库。 2. 解决方案:由于请求的参数是不合法的(每次都请求不存在的参数),于是我们可以使用布隆过滤器(BloomFilter[#](https://www.jianshu.com/p/3e9282ca7080)))或者压缩filter提前拦截,不合法就不让这个请求到数据库层!当我们从数据库找不到的时候,我们也将这个空对象设置到缓存里边去。下次再请求的时候,就可以从缓存里边获取了。这种情况我们一般会将空对象设置一个较短的过期时间。 3. 如果缓存集中在一段时间内失效,发生大量的缓存穿透,所有的查询都落在数据库上,造成了缓存雪崩。 4. 解决方案: 1.在缓存的时候给过期时间加上一个随机值,这样就会大幅度的减少缓存在同一时间过期。让缓存失效的时间点尽量均匀。 2. .做二级缓存,或者双缓存策略。A1为原始缓存,A2为拷贝缓存,A1失效时,可以访问A2,A1缓存失效时间设置为短期,A2设置为长期。 5. redis的使用场景:1.广播 2.缓存 3. 消息队列 4. 乐观锁 5.redis 事务
- 如何保持缓存一致性:读的时候先读缓存,没有的话去数据库里读。写的话先写数据库,再删除缓存,如果写数据库失败了,直接返回重试,如果数据库修改成功了,缓存删除失败(设置失效时间),可以加入队列尝试再次删除,可以先返回一个旧值。
- http 认证有几种方式:#
1.表单认证 (进入站点主页前,需要在登陆页面输入用户名和密码,这种更专业的叫法为表单认证) 2.ssl客户端认证 3.digest认证 4.basic认证 (访问API时,浏览器会自动弹出一个对话框去输入用户名/密码)
- redis 锁
一、分布式锁的几个特点: 1. 互斥性:在任意时刻,只有一个客户端可以获得锁; 2. 避免死锁:客户端最终一定可以获得锁,即使锁住某个资源的客户端在释放锁之前崩溃或者网络不可达 3. 容错性:只要锁服务集群中的大部分节点存活,Client 就可以进行加锁解锁操作。 4. 解铃还须系铃人。加锁和解锁必须是同一个客户端,客户端自己不能把别人加的锁给解了。 5.redis 分布式锁的实现[#](https://www.cnblogs.com/syhx/p/9753433.html)
- redis 持久化:
当两种方式同时开启时,数据恢复Redis会优先选择AOF恢复1、save 同步存储,bgsave异步存储,会fork一个子进程,将内存中的数据写入RDB文件中,,持久化的过程结束了,再用这个临时文件替换上次的快照文件,然后子进程退出,内存释放。 2、 AOF:Redis会将每一个收到的写命令都通过Write函数追加到文件最后,类似于MySQL的binlog。当Redis重启是会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。
3、 BGREWRITEAOF:执行一个 AOF文件 重写操作。重写会创建一个当前 AOF 文件的体积优化版本。即使 BGREWRITEAOF 执行失败,也不会有任何数据丢失,因为旧的 AOF 文件在 BGREWRITEAOF 成功之前不会被修改。重写操作只会在没有其他持久化工作在后台执行时被触发。从 Redis 2.4 开始, AOF 重写由 Redis 自行触发, BGREWRITEAOF 仅仅用于手动触发重写操作。
- php的知识点:
1.php中各进制的表示: 1. 8进制0开头 2. 2进制0b开头 3. 16进制0x开头 2.PHP 变量规则: 1.变量以$符号开头,其后是变量的名称 2.变量名称必须以字母或下划线开头 3.变量名称不能以数字开头 4.变量名称只能包含字母数字字符和下划线(A-z、0-9 以及 _) 5.变量名称对大小写敏感(y 与 $Y 是两个不同的变量) 3.foreach循环并不能改变数组元素的值,如果要改变数组元素的值,需要使用引用类型 4.preg_match() 定义和用法 1.preg_match() 函数用于进行正则表达式匹配,成功返回 1 ,否则返回 0 。 2.preg_match() 匹配成功一次后就会停止匹配,如果要实现全部结果的匹配,则需使用preg_match_all()函数。 5. 双引号和单引号的区别 1.双引号解释变量,单引号不解释变量 2.双引号里插入单引号,其中单引号里如果有变量的话,变量解释 3.双引号的变量名后面必须要有一个非数字、字母、下划线的特殊字符,或者用讲变量括起来,否则会将变量名后面的部分当做一个整体,引起语法错误 4.能使单引号字符尽量使用单引号,单引号的效率比双引号要高(因为双引号要先遍历一遍,判断里面有没有变量,然后再进行操作,而单引号则不需要判断) 6. 请描述出两点以上 XHTML 和 和 HTML 最显著的区别 1. XHTML 必须强制指定文档类型 DocType,HTML 不需要 2. XHTML 所有标签必须闭合,HTML 比较随意 3. XHTML 严格区分大小写,所有标签的元素和属性的名字都必须使用小写 4. XHTML 要求所有的标记都必须要有一个相应的结束标记 5. XHTML 规定所有属性都必须有一个值,没有值的就重复本身 7. int(M) M指示最大显示宽度,当你不足M位时,会帮你不全,当你超过M位时,就没有任何的影响 8. 不使用cookie向客户端发送一个cookie。通过在URL后加一个SID参数来传递 SESSIONID的值。 9. self 和 __CLASS__,都是对当前类的静态引用,取决于定义当前方法所在的类。也就是说,self 写在哪个类里面, 它引用的就是谁。 10. $this 指向的是实际调用时的对象,也就是说,实际运行过程中,谁调用了类的属性或方法,$this 指向的就是哪个对象。但 $this 不能访问类的静态属性和常量,且 $this 不能存在于静态方法中 11. static 关键字除了可以声明类的静态成员(属性和方法)外,还有一个非常重要的作用就是后期静态绑定。 12. parent,是对当前类的父类的静态引用。 13. self 可以用于访问类的静态属性、静态方法和常量,但 self 指向的是当前定义所在的类,这是 self 的限制。 14. $this 指向的对象所属的类和 static 指向的类相同。 15. static 可以用于静态或非静态方法中,也可以访问类的静态属性、静态方法、常量和非静态方法,但不能访问非静态属性。 16. 静态调用时,static 指向的是实际调用时的类;非静态调用时,static 指向的是实际调用时的对象所属的类。 [#](https://www.liangzl.com/get-article-detail-122503.html) 17. static 后期静态绑定的工作原理是存储了上一个非转发调用(non-forwarding call)的类名
mysql 的共享锁和排它锁
共享锁又称为读锁,简称S锁,顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。select … lock in share mode
排他锁又称为写锁,简称X锁,顾名思义,排他锁就是不能与其他所并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据就行读取和修改。排他锁指的是一个事务在一行数据加上排他锁后,其他事务不能再在其上加其他的锁。select …for update
mysql事务
InnoDB行锁是通过给索引上的索引项加锁来实现的,因此InnoDB这种行锁实现特点意味着:只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁!
linux 性能调优:
一、硬件优化。主要是对硬件选型,例如CPU、内存、磁盘(ACID独立磁盘冗余阵列)、带宽、网卡等。
二、操作系统优化。主要包含了操作系统的系统参数、内核参数、进程参数、文件系统、磁盘IO等。
三、应用程序优化。主要包含对应用软件,例如:apache、nginx、redis、Mysql、keepalived、kafka等。
分布式中如何解决session一致性问题?
- 基于nginx的ip_hash来做负载均衡,基于ip_hash的计算,同一个ip的请求会始终落在同一个服务器上。
缺点:但是如果这台机器挂掉了,那这些IP就不能访问了,会造成单点故障。 - 服务器session复制,服务器创建好session之后,会通过广播方式把seesion发送到其他服务器上。
缺点:当服务器比较多的时候,内存以及带宽开销比较高,非常不划算 - session 集中统一管理,及将session 服务器独立出来,分为有状态的session服务器和无状态的api服务器,每次请求先走session服务器。
缺点:实现起来相对复杂,但是可扩展能力强,高可用,适用于大型分布式环境。 - 客户端存储法:一个用户只存储自己的数据,及存到cookie之中。
缺点:不安全,客户端存储session容易被泄露、篡改、窃取,session存储的数据大小受cookie限制
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: