请问php 在什么场景下 才用redis 而不用mysql ?

请问php 在什么场景下 才用redis 而不用mysql ?

阅读 4.1k
6 个回答

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 之间并不是二选一,通常是要配合使用的,关键还是要对自己的场景进行分析和权衡,看自己对读写性能以及数据持久化的要求是什么样的。

在处理高并发或者队列时我们会使用redis来做缓存,最终都会写入到mysql中,如果单独使用redis作为存储到话,每次系统启动都需要加载数据到内存,所以在不使用mysql的时候我们会使用ssdb来存储数据

if redis里有数据
    从redis取
else
    从mysql取
    将数据写入redis缓存
返回数据

当缓存用是最多人的 场景,还有计数器, 使用场景可以看看那5种数据类型 使用场景,写写案例,
比如集合 set (2个集合交集,并集) ,有序集合zset (集合根据某字段排序) ,hash (模拟数据库key val) , list (双向链表) 还可以当轻量级 队列

按照Redis的设计,是充当缓存使用的,但是,如果根据现在互联网的发展速度,也可以把redis理解成数据库,可以把所有数据储存在redis。
在一般项目,都是充当缓存使用,如下场景

  1. 热点数据缓存
  2. session储存
  3. 队列储存
  4. 计数储存
  5. 消息队列
  6. 配置数据储存等

当你的查询次数使得mysql有压力的时候,就需要用到redis来缓解mysql的压力了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题