问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

redis除了缓存还可以做什么

发布网友 发布时间:2022-04-26 04:15

我来回答

2个回答

懂视网 时间:2022-05-03 19:19

首先看应用场景:几年前,微信里许多投票系统。很多人都找好友或朋友圈找人拉票。当时,有一个比较大的乐园也做了这个投票活动,好像是超过一定票数就可以免费玩。我也被好友要求给他投票,一天好像可以投3票还是5票,具体的记不太清了。我当时进去该系统后,给朋友点了投票按钮,发现没有任何反应。我以为是我网络的问题,后来发现是程序的问题。我当时猜测,它应该是投票的人太多了,系统一时没抗住。

因为当时,我刚好在学redis。所以,我想可以通过redis的计数器来改善该功能。

这里,我们只统计用户总的投票数,而不考虑用户具体的投票情况,像A什么时候给B投票的记录我们不做考虑。这种情况如果考虑的话,就要使用其他的解决方案了(可以用消息队列)。

校验

首先,要对每个用户的投票数进行校验。用户每天都有3次投票机会,所以,我们可建立个键,将他的有效期设为明天凌晨。用户每投一票就加1等到了3票后,就提示今日次数已用完。

// 投票次数校验
function checkVote($uid)
{
 $key = "uid:$uid:cnt";
 $tomrTime = mktime(0,0,0, date('m'), date('d')+1, date('Y'));
 
 if (!$redis->exsits($key)) {
 $redis->set($key, 0, ['ex' => $tomrTime - time()]);
 return true;
 } else if ( ($cnt = $redis->get($key)) < 3 ) {
 return true;
 } else {
 return false;
 }
}

统计投票

次数校验通过后,就需要统计用户的得票数了。

// 得票数计数
// uid表示投票人id
// touid表示得票人id
function vote ($uid, $toUid)
{
 $key = "uid:$toUid:vote";
 
 // 投票数校验
 if (checkVote($uid)) {
 // 统计投票数及参选人得票数
 $redis->incr($key);
 $redis->incr("uid:$uid:cnt");
 
 return true;
 } else {
 return false;
 }
}

我自己的阿里云主机配置只有1核cpu1G内存的配置,每秒incr性能能达到10万多次,redis性能真恐怖。

# redis-benchmark -t incr -q
INCR: 105708.25 requests per second

Mysql异步更新用户得票数

最后,我们只需要做一个定时任务了,让mysql每隔一定时间就去同步用户的得票数。

方法是做一个死循环,每次循环都获取50个用户得票数,直到遍历完所有用户后,就退出循环,结束脚本。

$start = 0;
while (true) {
 // 每次循环取50个用户id
 $users = $DB->query("SELECT uid,votes FROM users LIMIT $start, 50");
 if (!$users) {
 exit();
 }
 $keys = [];
 foreach ($users as $userinfo) {
 $keys[] = "uid:{$userinfo['uid']}:vote";
 }
 $votes = $redis->mget($keys);
 foreach ($votes as $index => $vote) {
 if ($vote != $users[$index]['votes']) {
  $DB->query("UPDATE users SET votes = '$vote' WHERE uid='{$users[$index]['uid']}");
 }
 }
 $start += 50;
}

Redis的mget命令的是一次获取多个key的值。获取了redis里存放的redis得票数后,要先和Mysql里的得票数做比对。不一样的时候才去更新Mysql的数据。

热心网友 时间:2022-05-03 16:27

1、缓存仅仅是redis的一个小的方面
2、你要明白redis是非关系型内存数据库,他有着丰富的数据类型:string,list,hash,set,zset
3、有足够的money,你完全可以将redis作为主存
4、redis可以做的很多,比如:投票系统,用户登录session,购物车,网页缓存,日志系统,搜索引擎,消息队列。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
可以提前退出“三支一扶”计划吗 能提前退出“三支一扶”计划吗 绒沙金礼品制作工艺 什么叫绒沙金 榖皮巾的意思是什么 IPOD新版本安装会不会影响内存 我的是ipod 4 8G的,我下载了东西以后发现内存是占了,但是显示不出来东西... 为什么我的IPOD下载程序只用了4G却显示用了6.4G 间谍过家家阿尼亚表情包汇总(间谍过家家阿尼亚次子) 关于"化物语"中的女主 战场原黑仪(戦场ヶ原ひたぎ)的1440*900宽屏壁纸... 找个感人泪下的故事 吉米祛斑是真的还是假的 男人梦见长跑比赛得了一张铜牌什么意思? 电视上播的那些去斑广告是真的假的? 建行基金的手续费是多少? 建行买基金的手续费是多少 储水式热水器里的热水能到厨房吗 这两个用哪个做头像让人感觉更好呢? 建行购买基金的手续费是多少? 求uc浏览器下载手机版下载地址 作为投资者,在建行买基金手续费是多少? 手机浏览器下载 私人借款收据怎么写 玉米核是属于其他垃圾吗,还是厨余垃圾? 怎么用UG画履带 免费医疗国家 还借款收据怎么写? 用UG怎么画这种薄壁的产品 办理深圳沙井这个地段的营业执照延期需要什么资料?去哪里办理?急 私人飞机空姐如何管理 正规借钱收条怎么写 苹果macbook12英寸电脑发票丢了可以保修吗 在网上买的苹果电脑发票找不到了,还能不能维修 为什么平板电脑比手机便宜? 如何利用添加好友 为什么平板比手机便宜很多 为什么平板电脑比手机大但却比手机便宜 当地震来临时,怎么做才能赢得逃生机会? 为什么相同配置的平板电脑和手机,平板电脑会比手机快呀? 平板电脑和手机有什么区别? 在冬天为什么穿的越厚越保暖呢,这里有何科学道理? 此图出处。 8月1日起中国实施全民医疗教育免费是真的吗? 苹果要删除旧版本才能安装,可是删除了,它还是说没有删除(腾讯视频 在建行网上银行认购和申购及赎回基金的手续费各是多少 梦见自己在野外比赛跑步获取第一名,不知道应为什么而比赛跑步,梦境的人物有孙悟空,玉帝,牛魔王,其 uc浏览器下载手机版 uc浏览器7.4正式版 储水式热水器有快速的吗? 空姐 有前途吗? 哪些食物对耳朵有好处的?可以提高听力的?