MySQL,Oracle数据库管理系统(都是关系型数据库)
Ocacle:大型数据库,收费,内存大,对事物完全支持,安全性更高。
MySQL:中小型数据库,开源,内存小,对事物默认不支持,在一些存储引擎中支持,如innodb
随着web的发展,访问量的上升,高访问容易打崩数据库,使用关系型数据库的web在性能上不够(磁盘I/O),在云计算,大数据盛行NOSQL,其高性能,可扩展性强,高可用性。
Redis:NOSQL数库(memCache,Cassadra,Mongo等),redis数据类型,五种自有类型(String,Hash,List,Set,SortedSet),一种自定义类型。
使用ANSI C编写的开源,包含多种数据结构,支持网络,基于内存,可选持久性的键值对存储数据库,应用场景:缓存系统(“热点数据”,”高频读”,”低频写”),计算器,消息队列系统,排行榜,社交网络和实时系统。
Redis特性:基于内存运行,性能高效,支持分布式,理论上可以无限扩展,key-value存储系统,开源的使用ANSI C语言编写,遵守BSD协议,支持网络,可基于内存亦可持久化的日志型,key-value数据库,并提供多种语言的API。
Redis特点:C/S通讯模型,单进程单线程模型,丰富的数据类型,持久化,高并发读写,支持lua脚本(轻量小型脚本语言,用标准编写并以源代码形式开放)。
Redis特性:事务,发布订阅(pub(发)/sub(收)),stream
Redis常见问题:击穿,雪崩
大量数据失效时间集中出现redis卡顿,严重会缓存雪崩。
Redis分布式锁:先setnx来争抢锁,抢到后再用expire给锁加一个过期时间防止锁忘记释放,setnx后expire前进程意外crash或重启维护,这个锁永远不会释放,使用set将上两者合二为一,寻找固定前缀开头的key,使用keys指令扫出指定模式key列表。
Redis单线程,redis做异步队列,一般用list结构作为队列,rpush/lpop,生产/消费消息,
当lpop没有消息时,要sleep一会再重试,也可不sleep使用blpop,没有消息会阻塞直到消息到来,pub/sub 是 1:N 也就是生产一次,消费多次,但是消费下线,生产消息就会丢失,redis使用SortedSet实现延时队列,拿时间戳作为score,消息内容作为key,调用zadd来生产消息,消费者用zrange by score指令获取N秒之前的数据轮询进行处理。
Redis持久化:1、RDB做镜像全量持久化;2、AOF做增量持久化
Redis同步:主从同步,从从同步
Redis集群:1、Redis Sentinal 高可用,在master宕机会自动将slave提升为master继续提供服务。2、Redis Cluster 扩展性,单个Redis内存不足,使用Cluster进行分片存储
Redis:key-value库
Redis:String数据类型实现包含sds.c(Simple Dynamic Strings)中,底层是C语言,redis定义sdshdr结构,保存字符串buf,保存free(剩余长度)以及len(字符长度)。
Redis这样做的好处:获取字符串长度复杂度O(1),不会造成缓冲区溢出,减少修改字符串带来的内存重分配次数,二进制安全,兼容部分C字符串函数。
Redis跳表:获取节点的rank排名,或者获取指定范围的rank的节点:①计算每层插入节点的前一个节点,以及该节点的rank;②找出后继节点;③创建新节点。