初识Redis
初识Redis
- 初识Redis
- 什么是Redis
- Redis的一些特性(优点)
- 为什么要使用Redis
- 为啥Redis快?
- 用途
- Redis不能做的事情
初识Redis
什么是Redis
Redis(Remote Dictionary Server)是一个在内存中存储数据的中间件。用于作为数据库,也可以作为数据缓存,在分布式系统中能够大展拳脚。Redis和MYSQL一样也是一个 客户端-服务器 结构的程序。
Redis的一些特性(优点)
- 在内存中存储数据:Redis 将数据存储在内存中,这使得数据的读写速度非常快。相比传统的基于磁盘的数据库(如关系型数据库MYSQL),内存的读写速度可以达到纳秒级别,大大提高了数据访问效率。
- 高效的事件循环机制:Redis 采用单线程的事件循环模型,并结合 I/O 多路复用技术。这意味着它可以高效地处理多个客户端连接,同时避免了多线程带来的上下文切换开销。
- 多样化的数据类型支持:Redis 支持多种数据结构,包括字符串、哈希、列表、集合和有序集合。这些数据结构可以满足不同的应用场景需求。例如,哈希类型适合存储对象的多个属性,像用户信息(姓名、年龄、性别等)。
- 主从复制机制:Redis 支持主从复制,一个主节点的数据可以自动同步到多个从节点。这种架构可以用于数据备份和读写分离。在主节点出现故障时,可以快速将从节点提升为新的主节点,保证系统的可用性。
- 自动清理过期数据:Redis 可以为键设置过期时间,并且有定期删除和惰性删除两种过期策略。定期删除会按照一定的时间间隔检查并删除部分过期键,惰性删除则是在访问键时检查并删除过期键。这种灵活的过期策略可以有效地利用内存资源,避免存储过多无用的数据。
- 持久化:Redis把数据存储在内存上的,内存的数据是“易失”的(进程退出、系统重启时)。Redis会把数据存储在硬盘上,内存为主,硬盘为辅(相当于内存的数据备份了一下)。如何Redis重启了,就会在重启时加载硬盘中的备份数据,使Redis的内存恢复到重启前的状态。
为什么要使用Redis
因为它——快!!!
在高负载的网站中必须考虑性能问题,由于内存的读写速度远远快于硬盘,因此Redis的性能相对于其他基于硬盘存储的数据库(如MySQL)有明显的优势。
为啥Redis快?
-
Redis 的数据存储在内存中,相比访问硬盘的数据库,速度要快得多。(当然,是相对于MySQL这样的关系型数据库更快,但是如果是直接和内存中的操作变量相比,就没有优势了,甚至更慢了)
-
Redis 的核心功能主要是对内存中的数据结构进行相对简单的操作。(把数据分为冷数据和热数据,热点数据肯定是少数,只把热点数据交给Redis)
-
从网络角度来看,Redis 采用了 IO 多路复用的方式(如 epoll)。
-
Redis使用的是单线程模型(虽然更高版本的Redis引入了多线程),这样的单线程模型,减少了不必要的线程之间的竞争开销。
这里存在一个问题:多线程通常被认为有诸多好处,那为何 Redis 却采用单线程模型呢?
多线程能够提高效率的前提在于处理 CPU 密集型任务时,通过使用多个线程可以充分利用 CPU 的多核资源。
然而,Redis 的核心任务主要是对内存中的数据结构进行操作,这类任务并不会占用大量 CPU 资源。##
用途
1.Real-time data store(数据库)
当把 Redis 当作数据库时,多数情况下,从数据存储的层面来看,首先考量的往往是存储规模的 “大”。不过,仍有一些场景,最为看重的是 “快”。
如果要把所有需检索的数据都存放在内存中,一般会借助类似 Redis 这样的内存数据库来达成。当然,运用这样的内存数据库存储大量数据,需要相当多的硬件资源,成本颇高。
而且,当 Redis 作为数据库时,存储的是完整的数据量,这里的数据是不能轻易丢失的。
2.Caching&Session stotage(缓存和会话存储)
MySQL 作为数据库。使用 MySQL 存储数据时速度较慢,因此将热点数据提取出来,存储在 Redis 中。Redis 存储的是部分数据,而全量数据以 MySQL 为主。即使 Redis 中的数据全部丢失,仍然可以从 MySQL 重新加载回来。在这种情况下,Redis 是作为缓存来使用的。
Redis作为会话存储的应用场景是:
session存储了用户数据,以Cookie作为载体,之前session是存储在应用服务器上的,在浏览器上只存储了一个用户的身份标识sessionid。在这种情况下,负载均衡的时候可能把同一个用户的请求打到另一个机器上,另一个机器上没有存储这个用户的数据,这样用户不得不重新登录。用户体验非常不好。
这个时候,就可以把会话数据单独拎出来,放到一组独立的机器上存储(Redis),这样即使负载均衡的时候把同一个用户的请求打到另一个机器上也不怕,因为都是从Redis里面取用户数据。
3.Streaming&messaging(流&消息传递)
Redis 可以充当消息队列(服务器),基于此能够实现网络版本的生产者 - 消费者模型。在分布式系统中,服务器与服务器之间有时也需要用到生产者 - 消费者模型。业界中有许多知名的消息队列,如 RabbitMQ、Kafka、RocketMQ 等,它们在功能上通常比 Redis 更强大。不过,Redis 也提供了消息队列的功能。如果在当前场景下,对消息队列的功能依赖程度不高,并且不想引入额外的依赖项,那么 Redis 可以作为一种选择。
Redis不能做的事情
存储大规模的数据
主要原因在于内存相对有限,而进行扩容又会产生成本。Redis 的持久化机制在应对大规模数据时同样会遭遇挑战。此外,如果存储大规模的数据,还会致使性能降低。