如何实现Redis和Mysql处理高迸发场景(Thinkphp8)

由于我是新人开发者,这篇文章的仅是我对于本人学习的一个记录,如果您已了解或对本人的想法有一定的看法,可以告知我!非常感谢!!!

由于我非专业科班学生,只是对该内容十分感兴趣,有些地方用语或许不专业,见谅!

大致思路

用户请求接口→→接口判断该数据是否在Redis数据库中→→读写Redis数据库→→返回数据到用户
                             ↓
         读Mysql数据库→存在的话回滚到Redis数据库并设置缓存
                             ↓
    不存在给这个标识记录一个空值,并写到Redis(防止数据库被击穿)

下方我将用一个发帖论坛的接口功能,做一个示例,并且仅针对Redis和Mysql数据库的缓存机制代码

一、当用户发帖时

Redis::setex('post:xxx', 3 * 86400, $data);
// 存储数据并设置 3 天过期时间
// xxx就是帖子ID
// $data里面存储的是帖子的具体内容,用json文本存储着发帖人、发帖内容、发帖时间、发帖图片等内容

二、当用户读帖子时

若 Redis 中数据已过期,读并返回 MySQL 的数据(并重新写到Redis当中去,不存在也写)。

三、当用户编辑帖子时

更新 Redis 数据时,自动重置过期时间,保持活跃数据常驻缓存。

四、定时任务

我了解到Redis按正常来说并不能持久化存储信息(其实可以,但是最好还是用Mysql存储吧)。因此做一个定时任务的接口,将即将过期的数据写入到Mysql当中去

$posts = Redis::scan('post:*'); //获取所有字段长这个样子的

foreach ($posts as $key) {
    $timestamp = Redis::hget($key, 'last_updated');

    if (time() - $timestamp > 2 * 86000) { //现在的时间减去last_updated字段中记录的时间戳,已经超过俩天了
        $data = Redis::hgetall($key);
        //条件成立,这个快过期了,我取出来然后往Mysql写,往mysql写的代码我没有写,就只写个注释得了
        Redis::del($key); //可以删掉了,不咋用了,放到Mysql里面冷藏吧
    }
}

其实在这里基本上思路就通了,然后突然想到,如果我要获取帖子列表怎么办!!!好像Redis不能Select,甚至我一开始没考虑ID从哪里来,咋办?然后我再思考了九九八十一秒之后,想到了“或许写入不重要,重要的是读改”,因此思路就是,在发帖的时候写入到Mysql中去,利用Mysql自增id生成,这样的话,id就有了,我再单独存一个特殊的Redis字段用于存储最新id,这样的话,需要多少,我直接用最新的id去减这个数字就可以了!

但是似乎效率会受到影响,因为本身我就是希望用Redis存储热数据,但是发帖我还是直接往Mysql数据库丢完才返回,但是大半夜我也不想考虑太多了,以后想到再记录吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值