Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >记一次代码优化实践之Redis集合的妙用

记一次代码优化实践之Redis集合的妙用

原创
作者头像
99
发布于 2023-12-15 08:09:08
发布于 2023-12-15 08:09:08
2112
举报
文章被收录于专栏:攻城狮攻城狮

需求:

在用户积分兑换成功后,在页面二次访问时提示已兑换,避免重复扣除积分和重复兑换等情况。

有同学讲了,这个玩意用个计数器不就解决了吗?

说的好,如果不是问题大于方法,确实我也只需要在每次用户进页面的时候,Redis中存上唯一ID,后面再进来判断一下是否兑换过即可。

同时适用于:用户提交答卷之后,异地同时提交另一份造成覆盖等异常情况;其他适用情况,请大家集思广益。

添加数据(定时触发)

代码语言:php
AI代码解释
复制
<?php
$redis = new \Redis();
$add_count = 0;
$data = Db::query("SELECT `phone`,`site_id` FROM `demo_table` WHERE `creat_time`  >= UNIX_TIMESTAMP() - 60 * 2");// 此处仅展示原始sql语句,实际使用时请注意安全性
foreach ($data as $key => $value) {
    $phone = $value['phone'];// 用户标识
    $site_id = $value['site_id'];// 站点标识
    $website = 'site_id:'.$site_id;
    $num = $redis->sadd($website, $phone);
    $add_count += $num;// 记录添加数量
}
$count = count($data);// 总数据条数
echo "本次添加{$add_count}/{$count}\n";
?>

在这里,我们首先通过查询MySQL数据库里面的手机号(用户标识,可以换成你自己的标识)、站点ID(对应的活动/网址/文章的标识,基于你自己的场景替换)的当前时间2分钟内的数据;在基于数组的循环,将其放到Redis的集合中(同时判断当前是否添加成功);完成后再统计本次总共的数据条数。

校验数据(实际使用)

代码语言:php
AI代码解释
复制
<?php
$redis = new \Redis();
$site_unique = $redis->sismember('site_id:'. $site_id, $phone);
if ($site_unique !== false) {
    return false; // 已兑换
}

在这里,我们在入口处使用的时候,直接基于前面Redis中的集合数据进行过滤,如果存在集合中,则说明已经存在(基于你自己的实际场景进行设计);所以这里我们可以直接返回false。

添加数据(优化版)

代码语言:php
AI代码解释
复制
<?php
$redis = new \Redis();
$add_count = 0;
$data = Db::query("SELECT `phone`,`site_id` FROM `demo_table` WHERE `creat_time`  >= UNIX_TIMESTAMP() - 60 * 2");// 此处仅展示原始 sql 语句, 实际使用时请注意安全性
$redis->multi(); // 开启 Redis 事务
foreach ($data as $key => $value) {
    $phone = $value['phone'];// 用户标识
    $site_id = $value['site_id'];// 站点标识
    $website = 'site_id:'.$site_id;
    $num = $redis->sadd($website, $phone);
    $add_count += $num;// 记录添加数量
}
$redis->exec(); // 提交 Redis 事务
$count = count($data);// 总数据条数
echo "本次添加{$add_count}/{$count}\n";

上面的优化版,是基于AI代码辅助工具(编辑器插件)生成的,由于本人对Redis管道深耕有限,上述Redis事务代码未实际使用,请谨慎尝试。

总结

通过本次优化,学习/复习到了redis集合的相关知识,同时了解到了Redis的管道即事务操作。

我正在参与2023腾讯技术创作特训营第四期有奖征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
2 条评论
热度
最新
可以、不过怎么还在用php啊。这
可以、不过怎么还在用php啊。这
11点赞举报
凑合用😅
凑合用😅
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
Redis 介绍
watch 指令作用 实质:WATCH 只会在数据被其他客户端抢先修改了的情况下通知执行命令的这个客户端(通过 WatchError 异常)但不会阻止其他客户端对数据的修改
IT茂茂
2020/03/05
6430
Redis 介绍
PHP安装、使用Redis,学习笔记。
Redis相关知识:https://www.runoob.com/redis/redis-tutorial.html
房东的狗丶
2023/02/17
4430
【黄啊码】一篇文章带你掌握redis的数据结构(redis教程)
Redis和Memcached最大的区别,Redis 除啦支持数据持久化之外,还支持更多的数据类型而不仅仅是简单key-value结构的数据记录。Redis还支持对这些数据类型做更多的服务端操作,从而也能减少网路的IO次数与数据体积,这里也比Memcached要方便与高效,只针对这一点啊,想喷的左上角群喷。
黄啊码
2022/01/10
3890
面试官问我redis的string应用场景,我是这么回答的!
大家好,我是阿沐!对于redis大家是最熟悉不过了,作为缓存界的使用率一直遥遥领先。基本上整个互联网无论大小公司使用redis占绝大部分,那么很多人使用它,那就是只是使用它,对于它的使用场景并没有去理会太多(能用就行),这篇文章来讲讲redis的基础数据结构string。
我是阿沐
2021/05/27
1.4K0
面试官问我redis的string应用场景,我是这么回答的!
Redis详解
    1.Redis 是一个基于内存的高性能 key-value 数据库。是完全开源免费的,用C语言编写的,遵守BSD协议
忧愁的chafry
2022/10/30
1.3K0
Redis详解
常用五大数据类型
命令大小写都可以,如果你只想单纯看 API,不想看例子,请移到最下面的 指令总结。
用户9615083
2022/12/25
9050
常用五大数据类型
Redis
格式:pfadd < element> [element …] 添加指定元素到 HyperLogLog 中
shaoshaossm
2022/12/27
3690
Redis
Redis 概览
KEYS h[ae]llo 匹配 hello 和 hallo ,但不匹配 hillo 。
三产
2021/01/12
6130
面试系列-4 hash应用场景分析实践
作为一年开发经验的毕业生,在上一个章节跟面试官聊了聊redis的基础数据结构列表类型,我们凭借日常知识积累跟面试官展开了相爱相杀场景以及面试期间内心的活动状况。通过结合项目在实际场景中的运用案例和知识点的细节,稳稳的对答如流。
我是阿沐
2021/05/31
7020
面试系列-4 hash应用场景分析实践
Redis 【常识与进阶】
Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。
IT茂茂
2020/04/02
5510
Redis 【常识与进阶】
怎么用 Redis 快速实现一个延迟队列?
在后端服务中,经常有这样一种场景,写数据库操作在异步队列中执行,且这个异步队列是多进程运行的,这时如果对同一资源进行写库操作,很有可能产生数据被覆盖等问题,于是就需要业务层在更新数据库之前进行加锁,这样保证在更改同一资源时,没有其他更新操作干涉,保证数据一致性。
用户1278550
2020/11/02
7680
Redis笔记(六):Java中使用Redis
下载地址: http://central.maven.org/maven2/redis/clients/jedis/2.9.0/jedis-2.9.0.jar
朝雨忆轻尘
2019/06/19
5910
自动化超参数优化最强神器:Optuna
你是否曾经觉得模型有太多的超参数而感到厌烦吗?要从某一个演算法得到好的解必须要调整超参数,所谓的超参数就是控制训练模型的一组神秘数字,例如学习速率就是一种超参数。你永远不能事先知道 0~1 之间哪一个数字是最适合的,唯一的方法就是试错(trial and error)。那万一模型有多个超参数可以控制,岂不是就有成千上万种组合要慢慢尝试吗?
数据STUDIO
2022/05/24
18.9K1
自动化超参数优化最强神器:Optuna
8.Redis数据库客户端操作实践及入坑出坑
前置知识学习补充 Redis数据库基础入门介绍与安装 - https://blog.weiyigeek.top/2019/4-17-49.html
全栈工程师修炼指南
2022/09/28
1.9K0
8.Redis数据库客户端操作实践及入坑出坑
Redis入门
redis是基于内存来储存非关系型数据的键值对数据库。支持数据的持久化(重启加载)与多数据类型(Stirng、Hash、Set、List 、Zset)
晚上没宵夜
2020/04/13
8170
从此Redis是路人
序言:Redis(Remote DIctionary Server)作为一个开源/C实现/高性能/基于内存的key-value存储系统,相信做Java的小伙伴都不会陌生。Redis常用于缓存、分布式锁、队列(或有序集合)等场景,追求技术的小伙伴们肯定不只满足于Redis的使用上,肯定也想了解Redis背后的设计思想及对应的开发实践,话不多少,上车吧~
luoxn28
2019/11/06
5330
Redis系列之Redis基础安装与基础知识
在任意位置输入redis-server即可前台启动,但会阻塞整个会话窗口,不建议这种启动方式
天下之猴
2024/09/20
1880
Redis系列之Redis基础安装与基础知识
Redis Stream 实践
stream 是一个日志形式的存储结构,可以往里追加数据,每条数据都会生成一个时间戳ID,stream 也有便捷的读取数据的模型。
dys
2018/08/01
1.3K0
Redis必知必会
这是用来查看某个key的数据类型,这里的类型即指的是上面诸如 String,hash,set....。而不能查看他们对应源码实现上所用的数据编码。可以通过下面的命令查看:
堆栈哲学
2022/11/24
1K0
Redis必知必会
降低Redis内存占用
  Redis为列表、集合、散列、有序集合提供了一组配置选项,这些选项可以让redis以更节约的方式存储较短的结构。
那一叶随风
2018/08/22
4.1K0
降低Redis内存占用
相关推荐
Redis 介绍
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档