2020/04/14 add 数据库查询(mongoDB)
2020/04/17 add 数据库聚合函数
2020/04/17 add 关系型数据库和非关系型数据库
2020/04/19 add 数据库事务
2020/05/08 add mongoDB
2020/05/13 add 数据库删除
2020/05/20 add redis
在实际的应用中,是把它放在业务和 DB 中间进行使用
Redis (Remote Dictionary Server) is an open-source in-memory data structure project implementing a distributed, in-memory key-value database with optional durability.
Redis 作为一种远程缓存服务,可以帮助DB抗一些请求来做高性能的数据查询
Redis 数据类型
List: 按照插入的顺序排序的字符串链表。和数据结构中的普通链表一样,可以在其头部(left)和尾部(right)添加新的元素。在插入元素时,如果该键不存在,Redis将为该键创建一个新的链表。如果链表中所有的元素均被移除,那么该键也会从数据库中删除。
redis整个是一个单线程服务。启动后即陷入巨大的while循环,不停地处理文件事件和时间事件。
整个流程是这样的:
beforeSleep -> epollwait -> 处理请求 -> 定时事件 ->xx
建议: 减少大 key,减少耗时命令。
beforeSleep的执行频率一般比定时事件更频繁一些。主要做以下几件事:
redis是一个内存服务,会设定内容上限的。
逐出 - 当执行write但内存达到上限时,强制将一些key删除
特点:
建议:关注逐出qps,过高会影响正常请求处理
过期 - 当某个key到达了ttl(time to live)时间,认为该key已经失效
两种方式:
惰性删除 - 读、写操作前判断ttl,如过期则删除
定期删除 - 在redis定时事件中随机抽取部分key判断ttl
特点
并不一定是按设置时间准时地过期
定期删除的时候会判断过期比例,达到阈值才退出
建议:打散key的过期时间,避免大量key在同一时间点过期
redis虽然作为一个缓存存在,通常作为业务和DB之间的一个衔接,如果只保存在内存中,不进行持久化机器宕机之后就会造成数据的丢失。
ps: 内存和磁盘有什么样的区别??
持久化 - 将内存中的数据dump到磁盘文件
RDB持久化(一次性写入)
AOF持久化(总是在写入追加,因此这个文件会越来越大,因此也就有了AOF重写)
应用:利用AOF文件灾备
主从模式
全量同步
部分同步
优点:
优点:
缺点:
建议:利用pipeline代替mget,且控制一次请求的命令数量(建议50以内)(因为proxy做分发也会产生一定的压力)
注:
和pipeline的区别
一致性hash:
redis cluster(涉及缓存的业务尽量用这种集群方式):
什么是服务发现
逻辑删除记录,不会直接删除数据库中的数据,仅是通过某些手段屏蔽被逻辑删除的数据在前台的显示,不会释放物理空间,并且还可以从数据库中查得数据。
物理删除记录,即是会将数据库中的数据记录直接清除(也可以说是磁盘上的删除),会释放出物理空间,也将不能再从数据库中搜索到删去的数据记录;
一般来讲大部分公司都采用逻辑删除的方式:对数据记录用处极大
逻辑删除真的不是一个好的设计
mongodb中的__v字段
“__v” 是 “versionKey"的简写,当每一个文档由mongoose创建时就会自动添加,代表这该文档的版本,此属性可配置修改,默认为“__v”,
作用是可以在"save文档"时作为一个查询条件,避免在"取出数据"到"save数据"的这段时间内,数据被其他进程修改而导致冲突。
数据库事务
数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。
事务的ACID特性是由关系数据库系统(DBMS)来实现的,DBMS采用日志来保证事务的原子性、一致性和持久性。日志记录了事务对数据库所作的更新,如果某个事务在执行过程中发生错误,就可以根据日志撤销事务对数据库已做的更新,使得数据库同滚到执行事务前的初始状态。
对于事务的隔离性,DBMS是采用锁机制来实现的。当多个事务同时更新数据库中相同的数据时,只允许持有锁的事务能更新该数据,其他事务必须等待,直到前一个事务释放了锁,其他事务才有机会更新该数据。
工作原因,平常会比较多用mongoDB,而它实际区别于以前用过的譬如mysql oracle等
关系型数据库和非关系型数据库举例
常见的关系型数据库和非关系型数据及其区别
深入理解数据库当中的聚合函数
SQL中的聚合函数介绍
聚合函数对一组值执行计算并返回单一的值。
在数据库当中,函数分为两种:单行函数和多行函数,相应概念如下:
单行函数:每一行返回一个数值(如lower)
多行函数:多行返回一个数值(如count)
聚合函数:多行函数,即表中的多条记录返回至一个数值,通常用于分组的相关信息。
聚合函数的分类:(常用的5个)
我认为只要记住count为统计一列中值的个数就可以了,因为里面毕竟是distinct的用法。
{name:/xxx/} // 包含
{name:/^xxx/} // 以xxx开头
{name:/xxx^/} // 以xxx结尾
{name:/xxx/i} // 忽略大小写
db.collections.find({'name':{$in:['tommy'],['Ammy']}) // 查询名字叫Tommy 和 Ammy的人