数据存储之Redis|青训营

80 阅读6分钟

Redis是什么

Redis(Remote Dictionary Server)是一种开源的内存数据存储系统,通常被称为缓存数据库。Redis 是一款功能强大、高性能的数据存储系统,尤其适用于需要快速数据访问和高并发的应用场景。

它支持多种数据结构,包括字符串(Strings)、哈希(Hashes)、列表(Lists)、集合(Sets)、有序集合(Sorted Sets)等。

为什么需要Redis

1、缓存:Redis 可以作为应用程序的缓存层,将经常被访问的数据存储在内存中,以加快数据的读取速度。缓存可以减轻数据库负载,提高应用程序的响应速度。

2、数据存储:Redis 可以用作持久性数据存储,将数据存储在内存中,但也可以将数据写入磁盘,以便在重启后恢复数据。这使得 Redis 在需要快速读写的场景下非常有用,如计数器、实时统计等。

3、分布式锁:Redis 提供了分布式锁机制,可以帮助应用程序在分布式环境中实现并发控制,防止多个客户端同时修改共享资源。

4、实时消息传递:Redis 支持发布-订阅(Pub/Sub)模式,可以用于实时消息传递、事件通知等场景。客户端可以订阅特定的频道,当有消息发布到该频道时,订阅者会收到通知。

5、数据缓存:除了作为普通缓存外,Redis 还支持更复杂的数据结构,如有序集合,这使得它在排行榜、社交网络的关注和粉丝等应用中非常有用。

6、地理空间数据:Redis 支持地理空间数据和地理位置查询,可以用于构建位置相关的应用,如附近的人、地理标记等。

7、会话存储:在 Web 应用中,Redis 可以用来存储会话数据,提供高性能和可扩展的会话管理。

Redis的基本工作原理

1、内存存储:Redis 将数据存储在内存中,这使得数据的读取和写入操作非常快速。由于内存的读写速度远高于磁盘或固态硬盘,Redis 能够实现高性能的数据存储和访问。

2、持久化:尽管 Redis 是内存数据库,但它提供了持久化机制,允许将数据写入磁盘,以便在服务器重启后恢复数据。Redis 支持两种持久化方式:RDB(Redis DataBase)和 AOF(Append-Only File)。

  • RDB:RDB 是快照持久化,它定期将数据库的数据快照保存到磁盘中,以二进制文件的形式存储。这样在需要恢复数据时,可以加载最近的快照文件。

截屏2023-08-16 00.44.05.png

  • AOF:AOF 是日志持久化,它记录了每个写操作的日志,以文本文件的形式保存。在恢复数据时,可以通过重新执行日志中的写操作来恢复数据。

截屏2023-08-16 00.43.48.png

3、数据结构:Redis 支持多种数据结构,如字符串、哈希、列表、集合、有序集合等。这些数据结构允许开发者在存储数据时选择最适合的结构,以满足不同的需求。

4、缓存:Redis 常用于作为应用程序的缓存层。当有请求需要访问数据时,首先查询 Redis 缓存,如果缓存中存在数据,则直接返回;如果缓存中不存在,再从后端数据源(如数据库)获取数据,并将数据存储在缓存中,以供下次访问时使用。

5、事件通知:Redis 支持发布-订阅(Pub/Sub)模式,允许客户端订阅特定的频道,当有消息发布到频道时,订阅者会收到通知。这使得 Redis 可以用于实现实时消息传递、事件通知等功能。

Redis应用案例

1、连续签到

掘金每日连续签到,用户每日有一次签到的机会,如果断签,连续签到计数将归0。

连续签到的定义:每天必须在23:59:59前签到。

Key: cc_uid_1165894833417101

value: 252

expireAt: 后天的0点

2、消息通知

用list作为消息队列。

使用场景:消息通知。例如当文章更新时,将更新后的文章推送到ES,用户就能搜索到最新的文章数据。

3、计数

一个用户有多项计数需求,可通过hash结构存储。

4、排行榜

积分变化时,排名要实时变更。结合dict后,可实现通过key操作跳表的功能。

ZINCRBY myzset 2 "Alex"

ZSCORE myzset "Alex"

5、限流

要求1秒内放行的请求为N,超过N则禁止访问。

Key: comment_freq_limit_1671356046

对这个Key调用incr,超过限制N则禁止访问;1671356046 是当前时间戳。

6、分布式锁

并发场景,要求一次只能有一个协程执行。

执行完成后,其它等待中的协程才能执行。

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

  • Redis是单线程执行命令

  • setnx只有未设置过才能执行成功

学习总结

这也是我第一次我系统的了解到Redis,它是一款引人入胜的高性能数据存储系统,为我的技术知识库增添了新的光彩。

在学习 Redis 过程中,我深切体会到了它作为一款内存数据库的优势。内存存储使得数据的读写速度非常快,这在需要高速数据访问的应用场景中无疑大有裨益。缓存作为 Redis 的一个重要应用领域,让我意识到它不仅可以减轻数据库负载,还可以显著提升应用程序的性能,特别是对于频繁读取的数据。

另一个令人印象深刻的方面是 Redis 的多样数据结构和灵活性。通过支持多种数据结构,如字符串、哈希、列表、集合和有序集合,Redis 在满足不同场景需求时展现出了出色的适应性。例如,有序集合可以用于排行榜,哈希可以存储对象属性等。这让我感受到 Redis 并不仅仅是简单的键值存储,更是一个强大的数据处理工具。

持久化是 Redis 另一个值得称道的特性,它可以将数据保存到磁盘,以避免数据丢失。我学到了 Redis 提供的两种持久化方式:RDB 和 AOF。这种可靠的数据持久化机制使得 Redis 不仅适用于缓存场景,还可以在需要长期存储数据的情况下发挥作用。

最后,我对 Redis 在实时消息传递和发布-订阅模式方面的应用深感兴趣。Redis 作为实时消息传递的解决方案,可以用于构建即时通讯应用、事件通知系统等。这为我打开了一个全新的应用领域,引发了我的进一步探索欲望。

总而言之,这次学习Redis的课程是一次充满收获的旅程。我不仅对其在内存存储、缓存、数据结构和持久化方面有了更深入的了解,还体会到了它在实际应用中的强大威力。Redis的学习不仅丰富了我的技术背景,还开拓了我的思维,激发了我对数据存储和应用优化的兴趣。我也期待着将 Redis 的知识运用到实际项目中,创造更出色的应用体验。