(1).#{} ${}的区别
一.类型不一样
(1)#{}:参数占位符,即预编译
(2)${} :字符串替换符,即SQL拼接
二.防注入问题
(1)#{}:很大程度上能防止sql 注入
(2)${}:不能防止sql 注入
三.执行过程
(1)#{}:编译好SQL后语句再去取值
(2)${}:取值以后再去编译SQL语句
一般能用#的就别用$
(2).数据库事物
一、数据库的隔离级别:
1.读未提交(Read uncommitted); 在提交前别人可以读数据
2.读已提交(Read committed); 提交之后的数据才可以读
3.可重复读(Repeatable read),数据库默认开启;
4.串行化(Serializable )
原子性 一致性 隔离性 持久性
二、如果不考虑隔离性,会发生什么事呢?
(1).脏读:
脏读是指一个事务在处理数据的过程中,读取到另一个未提交事务的数据。
(2).不可重复读:
不可重复读是指对于数据库中的某个数据,一个事务范围内的多次查询却返回了不同的结果,这是由于在查询过程中,数据被另外一个事务修改并提交了。
(3).幻读
幻读是事务非独立执行时发生的一种现象。例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。
三、四种隔离级别解决了上述问题
1.读未提交(Read uncommitted):这种事务隔离级别下,select语句不加锁。
此时,可能读取到不一致的数据,即“读脏 ”。这是并发最高,一致性最差的隔离级别。
2.读已提交(Read committed):可避免 脏读 的发生。在互联网大数据量,高并发量的场景下,几乎 不会使用 上述两种隔离级别。
3.可重复读(Repeatable read):MySql默认隔离级别。可避免 脏读 、不可重复读 的发生。
4.串行化(Serializable ):可避免 脏读、不可重复读、幻读 的发生。
REDIS用在经常要被访问的页面上,比如首页,或者是不常更换的数据上.
(3)redis的五种数据类型
redis无论什么数据类型,在数据库中都是以key-value形式保存,并且所有的key(键)都是字符串,所以讨论基础数据结构都是讨论的value值的数据类型
主要包括常见的5种数据类型,分别是:String、List、Set、Zset、Hash。
String字符串 可以是字符串、整数或浮点数 对整个字符串或字符串的一部分进行操作;对整数或浮点数进行自增或自减操作;
List列表 一个链表,链表上的每个节点都包含一个字符串 对链表的两端进行push和pop操作,读取单个或多个元素;根据值查找或删除元素;
Set集合 包含字符串的无序集合 字符串的集合,包含基础的方法有看是否存在添加、获取、删除;还包含计算交集、并集、差集等
Hash散列 包含键值对的无序散列表 包含方法有添加、获取、删除单个元素
Zset有序集合 和散列一样,用于存储键值对 字符串成员与浮点数分数之间的有序映射;元素的排列顺序由分数的大小决定;包含方法有添加、获取、删除单个元素以及根据分值范围或成员来获取元素
(4)redis为什么是单线程的?
redis6.0之前的网络i/o和读写存储是单线程的
redis6.0之后 网络请求采用多线程 读写存储依然是单线程
持久化,集群数据同步是额外的线程完成的
(5)为什么那么快?
1、命令执行基于内存操作,一条命令在内存操作的时间是几十纳秒
2.命令执行是单线程操作