由于我是新人开发者,这篇文章的仅是我对于本人学习的一个记录,如果您已了解或对本人的想法有一定的看法,可以告知我!非常感谢!!!
由于我非专业科班学生,只是对该内容十分感兴趣,有些地方用语或许不专业,见谅!
大致思路
用户请求接口→→接口判断该数据是否在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数据库丢完才返回,但是大半夜我也不想考虑太多了,以后想到再记录吧。