Redis从入门到放弃
培训视频地址
学习进度:第七课
Redis简介
Redis(Remote Dictionary Server),远程字典服务,底层采用C语言编写、支持网络、可基于内存亦可持久化的日志、NoSQL开源内存数据库,支持多种语言API。
主要用途:缓存
缓存分类:
(1)实时同步:要求缓存中的数据必须与DB中的数据保持一致,如何保证?只要DB中的数据发生变更,缓存中的数据立即消失。
(2)阶段性同步:其实没有必要与DB中保持一致,只要大差不差就行,如何实现?为缓存数据添加生存时长属性。
Redis特性:
(1)性能极高(读速度可以达到11w次/s,写的速度可以达到8w次/s)
(2)简单稳定:Redis源码很少,早期版本只有2w行左右,从3.0版本开始,增加了集群功能,代码变成了5w行左右。
(3)持久化,Redis内存中的数据可以持久化,其有两种方式,RDB和AOF。
(4)高可用集群,Redis提供了高可用的主从集群功能,可以确保系统的安全性。
(5)丰富的数据类型:String、List、Set、Zset、Hash等。还有BitMap、HyperLogLog、Geospatial类型。(BitMap:一般用于大数据量的二值性统计,HyperLogLog:用于数据量超大的日志做去重统计,Geospatial:地理空间,其主要用于地理位置相关的计算。)
(6)强大的功能:Redis提供了数据过期功能、简单事务功能,还支持lua脚本扩展功能。
(7)客户端语言广泛:Redis提供了简单的TCP通信协议,编程语言可以方便的接入Redis。
(8)支持ACL权限控制:Redis6引入ACL权限控制功能,可以为不同的用户定制不同的用户权限。(ACL,Access Control List,访问控制列表,是一种细粒度的权限控制策略,可以针对任意用户与组进行权限控制。目前大多数Unix系统和Linux2.6版本已经支持ACL了。Zookeeper早已支持ACL了。Unix与Linux系统默认使用的是UGO(User、Group、Other)权限控制策略,是一种粗粒度的权限控制策略。)
(9)支持多线程IO模型:Redis之前版本采用的是单线程模型,从6.0版本开始支持多线程模型。
Redis性能高的原因:
(1)Redis的所有操作都是在内存中发生的。
(2)Redis是用C语言开发的。
(3)Redis源码非常精细,集性能与优雅与一身。
Redis的IO模型:
单线程模型
优点:可维护性高,性能高。不存在并发读写情况,所以不存在执行顺序的不确定性,不存在线程切换开销,不存在死锁问题,不存在为数据安全而进行加锁/解锁开销。
缺点:性能会受影响,且单线程只能使用一个处理器,会造成处理器的浪费。
单线程模型采用了多路复用技术:
对于多路复用器的多路选择算法,常见的有三种,select模型(底层是数组),poll模型(底层是链表)、epoll模型。poll模型采用的是轮训算法,该算法对客户端的就绪处理是有延迟的。epoll模型采用的方式是回调方式,根据就绪事件发生后的处理方式不同,又可分为ET模型和LT模型。
混合模型:
从Redis4.0版本开始,Redis中就加入了多线程模型,处理客户端请求的任然是但线程模型,但对一些较为耗时的但又不影响客户端响应的操作,就有后台其他线程处理。例如:持久化、对AOF的rewrite,对失效链接的处理等。
多线程模型:
Redis 6.0版本,这才是真正意义上的多线程模型,因为其对客户端请求的处理采用的多线程模型。多线程IO模型中的“多线程”仅用于接受、解析客户端的请求,然后解析出的请求写到任务队列,而对具体任务的处理,仍由主线程处理。这样做使用户无需考虑线程安全问题,无需考虑事物控制。无需考虑LPUSH/LPOP等命令的执行顺序问题。
优点:其结合了单线程和多线程的优点,避开了他们的不足。
缺点:该模型没有明显不足,如果非要说不足的话就是,其并不是一个真正意义上的“多线程”,因为真正处理任务的是一个=主线程,所以其性能也是有一定影响的。
NoSQL(泛指非关系型数据库):
(1)键值存储数据库:就像Map一样的key-value对,典型代表就是Redis.
(2)列存储数据库:关系型数据库是典型的关系型数据库,其存在的问题是,按行存储的数据在物理层面占用的是连续存储空间,不适合海量数据存储。而按列存储则可实现分布式存储,适合海量数据存储,典型的代表是Hbase。
(3)文档数据库:其是NoSQL与关系型数据库的结合,最像关系型数据库的NoSQL,典型代表是MongoDB。
(4)图形数据库:用于存放一个节点关系的数据库,例如描述不同人间的关系,典型代表是Neo4J。