博客链接:Cs XJH’s Blog
简介
Redis属于Nosql数据库,即非关系型数据库,以key-value形式将数据缓存到服务器内存中,线程安全且支持高并发。其他Nosql数据库还有MongoDB,MemCache等
大家或许会有疑问,为什么要使用非关系型数据库?
因为基于内存的数据库对数据的存取速度远快于基于硬盘的存取速度,也就是说,io操作会严重影响数据的存取速度
另外,还有其他工具可以实行缓存,那么它们与Redis的区别是什么?
其中,JVM缓存框架就属于这一类工具,有EhCache,Cacheonix等。
从数据存取角度上来说,JVM缓存框架的数据存取速度要比Redis快;但从大数据缓存同步角度上,Redis要优于JVM缓存框架,因为Redis可以实现数据分布式共享。
主要应用场景
- 缓存Token
- 缓存短信验证码code
- 缓存查询数据
- 实现计数器
- 分布式锁
- 延迟操作
线程模型
Redis是单线程的,底层采用NIO的多路复用机制,即一个线程维护多个不同客户端的io操作。
NIO多路复用原理:通过一个selector选择器来捕获客户端的连接,换句话说,selector就是充当着一个注册中心的功能。
windows操作系统中的selector通过轮询客户端连接来读取数据,时间复杂度为O(n)。不仅效率低,而且存在空轮询的情况。其次,轮询的数据也有一定限制,难以支持上万的TCP连接。基于这个问题,所以Redis官方并没有推出windows版的安装包。
而Linux操作系统采用epoll实现事件驱动回调来实现selector,事件驱动回调即当客户端连接后有数据传输时,产生一个回调来接收数据。这样的话,就不需要通过轮询来接收数据,时间复杂度优化到O(1),并且不存在空轮询的情况。
另外,NIO多路复用不单独在Redis中才使用,在Tomcat9和Nginx都使用了该技术。
数据类型
- string类型
常用于存储key-value数据 - list类型
队列 - set类型
集合,key不能重复,常用于集合间的交,并,差等操作 - hash类型
即<key, <key, value>>
类型,常用于存储对象 - sorted set类型
常用于存储排行榜等数据
持久化
- rdb
以类似N秒内至少有M次数据集改动时,保存一次所有数据快照,实现持久化 - aof
按时间或指令改动频率,对新改动的数据以追加的方式持久化到文件