Redis 的角色是“缓存”,MySQL 的角色是具备 ACID 特性的“关系型数据库”。
“缓存”存在的意义是提高读写性能(内存操作),但所存储的数据相对不是那么重要,可忍受丢失,而 MySQL 存在的意义是持久化储存数据,所以 Redis 的读写能力要远高于 MySQL,而对持久化的要求并不高。
如果把 MySQL 类比为电脑“硬盘”,那 Redis 就可以类比为电脑“内存”。所以它们的使用场景是不一样的,假如 MySQL 的读写能力能和 Redis 媲美,那确实就不再需要 Redis 了。
Redis 支持对存储的数据设置过期时间,过期后自动删除,所以对于存储临时数据是个很好的选择。
举几个例子:
存储用户授权 token
对持久化要求不高,即使全部丢失,最坏的情况也就是所有用户全部要求重新登录一次,没那么糟。但每个需要登录的页面都要验证用户 token,所以对读取性能要求高,可选择 Redis。并且用户 token 一般要有一个过期时间,Redis 刚好内建支持了。
存储订单数据
对持久化要求高,如果丢失一个订单,客户爸爸一定会把电话打到爆,一般订单的读写也不会那么频繁,也不需要那么极致的读写性能,所以可直接选择 MySQL。
存储产品数据
对持久化要求高,不能忍受丢失,同时也是高频读的数据,所以对读性能要求也高,所以就需要 MySQL 和 Redis 一起用。先把商品数据放 MySQL 存储一份,作为 the source of truth,然后再放 Redis 里“缓存”一份,如果 Redis 数据丢失,可以再通过读取 MySQL 来重建缓存。伪代码如下:
function get_product($id) {
// 先看看 Redis 里有没有缓存的 product (商品) 信息
$product = get_product_from_redis($id);
if (!$product) {
// 如果缓存中没有该商品信息,就从 MySQL 读出来,再缓存到 Redis
$product = get_product_from_mysql($id);
cache_product_to_redis($id, $product);
}
return $product;
}
MySQL 和 Redis 之间并不是二选一,通常是要配合使用的,关键还是要对自己的场景进行分析和权衡,看自己对读写性能以及数据持久化的要求是什么样的。