深入理解Redis:7个基础问题及其解决方案,助你掌握分布式缓存技术
后端项目中的分布式缓存技术通常使用 Redis。Redis 不仅能作为缓存,还可以用作分布式锁、延时队列和限流等多种场景。本文将分享 7 个 Redis 的基础性问题,涉及基本知识,适合自测。
Redis简介
Redis(REmote DIctionary Server)是一个基于 C 语言开发的开源 NoSQL 数据库,采用 BSD 许可。与传统数据库不同,Redis 将数据存储在内存中(支持持久化),这使得其读写速度极快。在分布式缓存中,Redis 被广泛应用,并且其存储结构为 KV 键值对。
为了适应不同的业务需求,Redis 内置多种数据类型(如 String、Hash、Sorted Set、Bitmap、HyperLogLog、GEO)。此外,Redis 还支持事务、持久化、Lua 脚本以及多种开箱即用的集群方案(如 Redis Sentinel、Redis Cluster)。
Redis 数据类型概览
Redis 没有外部依赖,主要在 Linux 和 OS X 上进行开发和测试,建议在 Linux 环境中进行生产部署。个人学习者可以选择在本地安装 Redis,或者通过 Redis 官方提供的在线环境进行体验。
try-redis
全球众多网站都在使用 Redis,您可以访问 techstacks.io 获取使用 Redis 的热门站点列表。
Redis的高性能原因
Redis 之所以能够实现卓越的性能,主要归功于以下三点:
- 内存存储:Redis 基于内存,内存的读取速度比磁盘快数千倍;
- 高效的事件处理模型:Redis 基于 Reactor 模式设计,采用单线程事件循环和 IO 多路复用;
- 优化的数据类型:Redis 内置多种经过优化的数据结构,性能极为出色。
下图总结了 Redis 的高性能原因,来源于 Why is Redis so fast?。
分布式缓存的技术选型
在分布式缓存领域,历史悠久且使用普遍的技术包括 Memcached 和 Redis。然而,现今几乎所有项目都选择使用 Redis 替代 Memcached。
Memcached 曾是分布式缓存的主流,随着 Redis 的发展,越来越多的开发者意识到 Redis 提供了更强大的功能。尽管有些公司开源了类似于 Redis 的高性能 KV 存储数据库(如腾讯的 Tendis),但从其 GitHub 提交记录看,Tendis 开源版本已几乎没有更新,且使用者较少,因此并不推荐使用。
当前业内较为认可的 Redis 替代品有:
- Dragonfly:一种为现代应用程序负载需求构建的内存数据库,完全兼容 Redis 和 Memcached 的 API,迁移时无需修改任何代码,号称全球最快的内存数据库。
- KeyDB:Redis 的一个高性能分支,专注于多线程、内存效率和高吞吐量。
尽管如此,个人建议仍应优先选择 Redis,毕竟经过多年的生产考验,其生态系统成熟且资料丰富。
Redis与Memcached的比较
目前许多公司使用 Redis 作为缓存方案,Redis 的不断增强使其逐渐取代 Memcached。了解这两者的区别和相似之处有助于在技术选型时做出明智的决策。
相同点:
- 都是基于内存的数据库,通常用于缓存;
- 都具备数据过期策略;
- 两者性能均非常高。
区别:
- Redis 支持更丰富的数据类型(如 list、set、zset、hash 等),而 Memcached 仅支持简单的 k/v 类型。
- Redis 支持数据持久化,可以将内存数据保存到磁盘,重启后继续使用,而 Memcached 则将所有数据保存在内存中。
- Redis 提供灾难恢复机制,能够将缓存数据持久化,增强数据保护。
- Redis 在内存用尽后可以将不常用数据转储到磁盘,而 Memcached 将直接抛出异常。
- Redis 原生支持集群模式,而 Memcached 需要依赖客户端来实现数据分片。
- Redis 使用单线程模型,支持多路 IO 复用,而 Memcached 采用多线程的非阻塞 IO 复用模型。
- Redis 支持发布订阅模型、Lua 脚本、事务等功能,Memcached 则不具备这些功能,且支持的编程语言更少。
- Memcached 采用惰性删除策略,Redis 则结合了惰性删除和定期删除策略。
综上所述,选择 Redis 作为项目的分布式缓存似乎更为合理。
使用Redis的理由
使用 Redis 或缓存的主要原因可以从“高性能”和“高并发”两个方面来看。
1. 高性能
用户首次访问数据库时,速度较慢,因为需要从硬盘读取数据。如果用户访问的是高频数据且不常改变,那么我们可以将这些数据存储在缓存中。
2. 高并发
通常,像 MySQL 这样的数据库每秒的查询次数(QPS)大约为 1 万,但使用 Redis 缓存后,QPS 可以轻松突破 10 万,甚至在单机情况下达到 30 万以上。
QPS(Query Per Second):每秒服务器可执行的查询次数。
因此,直接操作缓存所承受的数据库请求数量远超过直接访问数据库的能力,转移一部分数据到缓存中,可以有效提高系统的整体并发能力。
常见的缓存读写策略
有关常见的缓存读写策略的详细介绍,可以参考我的另一篇文章:3 种常用的缓存读写策略详解。
什么是Redis Module及其用途?
从 Redis 4.0 版本开始,支持通过模块扩展其功能,以满足特定需求。这些模块以动态链接库(so 文件)形式加载到 Redis 中,提供了一种灵活的动态扩展实现方式,值得学习和借鉴。
开发者可以基于 Redis 定制自己的模块,例如实现搜索引擎功能、自定义分布式锁和限流等。官方推荐的模块包括:
- RediSearch:搜索引擎模块。
- RedisJSON:处理 JSON 数据的模块。
- RedisGraph:图形数据库模块。
- RedisTimeSeries:处理时间序列数据的模块。
- RedisBloom:实现布隆过滤器的模块。
- RedisAI:执行深度学习/机器学习模型并管理其数据的模块。
- RedisCell:实现分布式限流的模块。
有关 Redis 模块的详细信息,请参考官方文档:Redis Modules。
参考资料
[1]Redis: https://redis.io/
[2]在线 Redis 环境: https://try.redis.io/
[3]techstacks.io: https://techstacks.io/
[4]使用 Redis 的热门站点列表: https://techstacks.io/tech/redis
[5]Why is Redis so fast?: https://twitter.com/alexxubyte/status/1498703822528544770
[6]Tendis: https://github.com/Tencent/Tendis
[7]RocksDB: https://github.com/facebook/rocksdb
[8]Dragonfly: https://github.com/dragonflydb/dragonfly
[9]KeyDB: https://github.com/Snapchat/KeyDB