Redis简介| 青训营

113 阅读5分钟

一、Redis的简介

1.1 为什么需要Redis

  1. 快速的读写性能:Redis主要将数据存储在内存中,因此具有非常快速的读写性能。相比于传统的基于磁盘的数据库,Redis能够更快地读取和写入数据,适用于那些对响应时间和吞吐量有较高要求的应用。
  2. 内置的数据结构:Redis支持多种灵活的数据结构,如字符串、哈希、列表、集合、有序集合等。这些数据结构使得Redis可以更加方便地存储和处理各种类型的数据,并提供了丰富的数据操作命令,方便开发人员进行数据处理和计算。
  3. 缓存功能:Redis被广泛用作缓存层,可以将常用的数据缓存在内存中,从而加速数据访问。通过将频繁访问的数据缓存在Redis中,可以大大减轻后端数据库的负载,提高整体系统的性能和响应能力。
  4. 发布/订阅功能:Redis支持发布/订阅模式,可以实现消息的发布和订阅机制。这使得Redis可以作为消息队列或实时通信系统的基础,为应用程序提供高效的消息传递机制。
  5. 数据持久化:除了将数据存储在内存中,Redis还提供了数据持久化的机制,可以将数据定期写入磁盘,以防止数据丢失。这使得Redis即使在重启或断电后也能保持数据的可靠性和一致性。

总之,Redis具有高性能、灵活的数据结构、缓存功能、发布/订阅功能和数据持久化等特点,使其成为构建高速、可扩展和可靠的应用程序的理想选择。无论是作为数据库的替代品、缓存解决方案还是实时消息传递系统,Redis都提供了强大的功能和工具来满足各种应用需求。

image.png

1.2 Redis的基本工作原理

在数据存储方面,Redis将数据存储在内存中,这使得它具有快速的读写能力。数据可以是各种不同的数据结构,如字符串、哈希、列表、集合和有序集合。我们都知道,数据从内存中读写,而数据保存到硬盘上防止重启数据丢失,对于不同的数据来说,增量数据保存到AOF文件,全量数据RDB文件。

另外,Redis的有单线程来处理所有命令,尽管Redis采用单线程处理所有操作命令,但它通过异步I/O、事件驱动和高效的内存访问,实现了出色的性能和并发处理能力。此外,Redis还支持多个客户端同时连接和并发执行,通过事件循环机制,能够高效地处理大量的请求 image.png

二、 Redis的应用案列

2.1 连续签到

掘金网站有每日连续签到系统,用户每日有一次签到的机会,如果断签,连续签到计数将归0。所以连续签到的定义:每天必须在23:59:59前签到。 image.png 需要用到的数据结构是String数据结构,它可以存储字符串、数字、二进制等数据,并且在使用时通常和expire配合使用,应用的场景主要有:存储计数、Session。 image.png

2.2 消息通知

消息通知这一应用主要应用了list作为消息队列,它的使用场景包括:文章或者作者的消息通知。例如当文章更新时,将更新后的文章推送到ES,用户就能搜索到最新的文章数据。为了达成条件,我们可以使用List数据结构Quicklist,Quicklist由一个双向链表和listpack实现。Quicklist是一种在内存中实现的双向链表,它可以将多个元素组织成一个列表,并支持在列表两端进行快速插入和删除操作。

image.png

2.3 计数功能

每个用户有多项计数需求,可通过hash结构存储来实现。我们可以把hash结构分为两类。

rehash: rehash操作是将ht[0]中的数据,全部迁移到ht[1]中。数据量小的场景下,直接将数据从ht[0]拷贝到ht[1]速度是较快的。数据量大的场景,例如存有上百万的KV时,迁移过程将会明显阻塞用户请求。

渐进式rehash:为避免出现这种情况,使用了rehash方案。基本原理就是,每次用户访问时都会迁移少量数据。将整个迁移过程,平摊到所有的访问用户的请求过程中。

image.png

2.4 排行榜

对于每个掘金用户均有对应的积分,当网上的积分变化时,排名要实时进行变更。并且在结合dict后,可实现通过key操作跳表的功能。

image.png

2.5 限流

网站限流的基本概念指的是要求1秒内放行的请求为N,超过N则禁止访问。 Key: comment freq_ limit 1671356046 对这个Key调用incr,超过限制N则禁止访问1671356046是当前时间戳。

image.png

2.6 分布式锁

并发场景,要求一次只能有一个协程执行。只有在执行完成后,其它等待中的协程才能执行。

可以使用redis的setnx实现,利用了两个特性:

● Redis是单线程执行命令

● setnx只有未设置过才能执行成功 image.png