Redis 诞生于 2009 年,Redis 的作者 Salvatore Sanfilippo 所在的公司推出了一款基于 MySQL 的网站实时统计系统,出于对 MySQL 性能的失望,Salvatore Sanfilippo 决定自己开发一款数据库,它就是 Redis。Redis 开源后,短短几年时间,就收获了庞大的用户群体,到现在为止,Redis 依然十分活跃,现在的最新版本是 6.x,本专栏的一系列文章都是基于 6.x 版本。
什么是 Redis?
Redis 是 Remote Dictionary Server(远程字典服务器)的缩写,是一个开源的、高性能的、基于键值对的缓存与存储系统,通过提供多种键值数据类型来适应不同场景下的缓存与存储需求。Redis 的作者提出:Redis(与其他竞品相比)的一个重要目标就是让键值能够支持更多高级复杂的数据类型。
Redis 的 key 值只支持字符串格式,虽然你可以使用数字当作 key,但是它在 Redis 内部依然也是当作字符串的形式存储,而 Redis 支持多种数据类型的 value:
- 字符串类型,包括扩展类型 HyperLogLog 和 位图
- 哈希类型
- 列表类型
- 集合类型
- 有序集合类型,包括扩展类型地理坐标
- 流类型
借助这些数据类型,Redis 可以实现诸多高级功能,如消息队列、任务队列、延迟队列、优先级队列等。除此之外,Redis 还支持键值自动过期,所以 Redis 可以用来做缓存,同时 Redis 又支持持久化和外部模块扩展,使其在某些场景下可以作为主数据库使用。以下是一些常见的模块:
- RediSearch 模块提供了全文搜索功能
- RedisGraph 模块可以把 Redis 变成一个图数据库
- RedisJSON 为 Redis 增加了JSON 数据类型
- rediSQL 可以让 Redis 运行 SQL 语句。
另外,Redis 使用 C 语言开发,代码量只有几万行,这就降低了用户通过修改 Redis 源码来定制化需求的门槛。
网上一直都有关于 Redis 和 Memcached 优劣的讨论,在性能上 Redis 是单线程模型,而 Memcached 支持多线程,所以在多核服务器上后者的性能理论上相对更高一些。然而 Redis 的性能已经足够优异,在绝大部分场景中其性能不会成为瓶颈,Redis 的开发者在实现各项数据结构和特性的时候都经过了大量考量,在底层选用了很多非常高效的数据结构和算法,以此来确保每个操作都可以在尽可能短的时间内完成,并且尽可能地节省内存。所以在使用时更应该关心的是二者在功能上的区别。Redis 3.0 推出后,就代表 Memcached 的所有功能都是 Redis 的子集了,并且 Redis 对集群的支持更简单,而 Memcached 需要第三方集群工具的支持,所以使用 Redis 可能是一个更好的选择。
Redis 命名约定
Redis 对键的命名并没有强制的要求,但比较好的实践是用“对象类型:对象 ID:对象属性”来命名一个键,如使用键 user:1:friends 来存储 ID 为1的用户的好友列表。对于多个单词则推荐使用“.”分隔,比如博客 ID 为1的点击量可以用 post:1:page.view 来存储。