Redis[1] (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 是 Redis 开发和测试最多的两个操作系统,官方推荐生产环境使用 Linux 部署 Redis。
个人学习的话,你可以自己本机安装 Redis 或者通过 Redis 官网提供的在线 Redis 环境[2](少部分命令无法使用)来实际体验 Redis。
try-redis
全世界有非常多的网站使用到了 Redis ,techstacks.io[3] 专门维护了一个使用 Redis 的热门站点列表[4] ,感兴趣的话可以看看。
Redis 内部做了非常多的性能优化,比较重要的有下面 3 点:
下面这张图片总结的挺不错的,分享一下,出自 Why is Redis so fast?[5] 。
分布式缓存的话,比较老牌同时也是使用的比较多的还是 Memcached 和 Redis。不过,现在基本没有看过还有项目使用 Memcached 来做缓存,都是直接用 Redis。
Memcached 是分布式缓存最开始兴起的那会,比较常用的。后来,随着 Redis 的发展,大家慢慢都转而使用更加强大的 Redis 了。
有一些大厂也开源了类似于 Redis 的分布式高性能 KV 存储数据库,例如,腾讯开源的 Tendis[6] 。Tendis 基于知名开源项目 RocksDB[7] 作为存储引擎 ,100% 兼容 Redis 协议和 Redis4.0 所有数据模型。关于 Redis 和 Tendis 的对比,腾讯官方曾经发过一篇文章:Redis vs Tendis:冷热混合存储版架构揭秘 ,可以简单参考一下。
不过,从 Tendis 这个项目的 Github 提交记录可以看出,Tendis 开源版几乎已经没有被维护更新了,加上其关注度并不高,使用的公司也比较少。因此,不建议你使用 Tendis 来实现分布式缓存。
目前,比较业界认可的 Redis 替代品还是下面这两个开源分布式缓存(都是通过碰瓷 Redis 火的):
不过,个人还是建议分布式缓存首选 Redis ,毕竟经过这么多年的生产考研,生态也这么优秀,资料也很全面。
现在公司一般都是用 Redis 来实现缓存,而且 Redis 自身也越来越强大了!不过,了解 Redis 和 Memcached 的区别和共同点,有助于我们在做相应的技术选型的时候,能够做到有理有据!
共同点:
区别:
相信看了上面的对比之后,我们已经没有什么理由可以选择使用 Memcached 来作为自己项目的分布式缓存了。
下面我们主要从“高性能”和“高并发”这两点来回答这个问题。
1、高性能
假如用户第一次访问数据库中的某些数据的话,这个过程是比较慢,毕竟是从硬盘中读取的。但是,如果说,用户访问的数据属于高频数据并且不会经常改变的话,那么我们就可以很放心地将该用户访问的数据存在缓存中。
这样有什么好处呢? 那就是保证用户下一次再访问这些数据的时候就可以直接从缓存中获取了。操作缓存就是直接操作内存,所以速度相当快。
2、高并发
一般像 MySQL 这类的数据库的 QPS 大概都在 1w 左右(4 核 8g) ,但是使用 Redis 缓存之后很容易达到 10w+,甚至最高能达到 30w+(就单机 Redis 的情况,Redis 集群的话会更高)。
QPS(Query Per Second):服务器每秒可以执行的查询次数;
由此可见,直接操作缓存能够承受的数据库请求数量是远远大于直接访问数据库的,所以我们可以考虑把数据库中的部分数据转移到缓存中去,这样用户的一部分请求会直接到缓存这里而不用经过数据库。进而,我们也就提高了系统整体的并发。
关于常见的缓存读写策略的详细介绍,可以看我写的这篇文章:3 种常用的缓存读写策略详解[10] 。
Redis 从 4.0 版本开始,支持通过 Module 来扩展其功能以满足特殊的需求。这些 Module 以动态链接库(so 文件)的形式被加载到 Redis 中,这是一种非常灵活的动态扩展功能的实现方式,值得借鉴学习!
我们每个人都可以基于 Redis 去定制化开发自己的 Module,比如实现搜索引擎功能、自定义分布式锁和分布式限流。
目前,被 Redis 官方推荐的 Module 有:
关于 Redis 模块的详细介绍,可以查看官方文档:https://redis.io/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
[10]
3 种常用的缓存读写策略详解: https://javaguide.cn/database/redis/3-commonly-used-cache-read-and-write-strategies.html
[11]
RediSearch: https://github.com/RediSearch/RediSearch
[12]
RedisJSON: https://github.com/RedisJSON/RedisJSON
[13]
RedisGraph: https://github.com/RedisGraph/RedisGraph
[14]
RedisTimeSeries: https://github.com/RedisTimeSeries/RedisTimeSeries
[15]
RedisBloom: https://github.com/RedisBloom/RedisBloom
[16]
RedisAI: https://github.com/RedisAI/RedisAI
[17]
RedisCell: https://github.com/brandur/redis-cell