Redis究竟是什么
Redis是一个开源的高性能键值存储系统,也被称为数据结构服务器。它不仅仅是一个传统意义上的数据库,而是一个功能强大且多用途的存储系统。
虽然Redis可以像数据库那样存储和检索数据,但它与传统关系型数据库(如MySQL)有很多区别:
-
数据模型:Redis主要使用键值对来存储数据,其中键是唯一标识符,值可以是字符串、哈希、列表、集合、有序集合等不同的数据结构。这使得Redis更加灵活,可以以不同的方式组织和访问数据。
-
内存数据库:Redis将数据存储在内存中,这使得它能够提供非常快速的读写性能。与之相比,许多关系型数据库使用磁盘进行持久化存储。尽管Redis支持将数据持久化到磁盘上,但其主要优势在于内存存储。
-
单线程架构:Redis采用单线程的事件驱动模型,这使得它能够处理高并发请求。它通过异步I/O和非阻塞操作来实现高性能。
-
数据库功能的扩展:除了基本的存储和检索操作,Redis还提供了许多附加功能,如发布/订阅、事务、Lua脚本、过期键管理等。这些功能使得Redis不仅可以用于缓存和临时数据存储,还可以用作消息队列、计数器、实时排行榜等应用场景。
我们可以将Redis看作是一个多用途的、高效的数据结构服务器,广泛应用于缓存、会话存储、实时分析、消息传递等领域。
Redis为什么能够做到这么快
(1)完全基于内存操作
(2)数据结构简单,对数据操作也相对简单
(3)Redis执行命令是单线程的,避免了上下文切换所带来的性能开销,也不用考虑锁的问题
(4)采用了非阻塞的IO多路复用技术,使用单线程来处理并发的连接;内部采用的epoll+自己实现的事件分离器
其实Redis并不是完全多线程的,在核心的网络模型中采用多线程用于处理并发连接,但是数据的操作都是单线程的。
Redis坚持单线程是因为Redis的性能瓶颈是网络延迟而不是CPU,因此多线程不会带来明显的性能提升。
Redis持久化机制
(1)快照持久化RDB
Redis默认的持久化机制,通过父进程fork一个子进程,子进程将Redis的数据快照写入一个临时文件,等待持久化完毕之后替换上一次的rdb文件。整个过程主进程不进行任何的IO操作。持久化策略可以通过save配置单位时间内执行多少次操作触发持久化。所以RDB的优点是保证Redis性能最大化,恢复数据速度较快,缺点是可能丢失两次快照之间的数据
(2)追加持久化AOF
以日志的形式记录每一次的写入和删除操作,策略有每秒同步、每次操作同步、不同步,优点是数据完整性高,缺点是运行效率低、恢复时间长
Redis如何实现过期的key的删除
采用了定期过期+惰性过期
定期删除:Redis每隔一段时间从那些设置了过期时间的key的集合里面,随机抽取一些key,查看是否过期,如果过期就将其删除。
惰性删除:Redis在key被访问的时候检查key是否过期(先返回此次的结果,然后立即删除),如果过期则删除
Redis数据类型及应用场景
String:可以用来缓存JSON信息,可以用incr命令实现自增或自减的计数器。
Hash:与String一样可以保存json信息
List:可以用来做消息队列,list的pop是原子性操作能一定程度上保证线程安全
Set:可以实现去重,比如一个用户只能参加一次活动
ZSet:有序的,可以实现排行榜