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 是快照持久化,它定期将数据库的数据快照保存到磁盘中,以二进制文件的形式存储。这样在需要恢复数据时,可以加载最近的快照文件。
- AOF:AOF 是日志持久化,它记录了每个写操作的日志,以文本文件的形式保存。在恢复数据时,可以通过重新执行日志中的写操作来恢复数据。
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 的知识运用到实际项目中,创造更出色的应用体验。