Redis 生成独特的纯数字代码

小夏 科技 更新 2024-02-20

要求说明

在开发优惠券系统或票务系统时,往往需要生成纯数字代码,优惠券代码要求:12位纯数字,不规则,不重复。

下面我提供一个想法,使用 Redis 的列表数据类型,lpop+rpush 来维护 10,000 个代码的队列。

队列数据结构

保持10,000个优惠券代码的数量,可根据项目实际情况进行调整。

array

客户

Redis 的 LPOP 方法取出指定数量的优惠券代码。

如果队列中的优惠券代码数量不足,则有回退计划,不足的部分用随机数填充。

知识点:LPOP是原子性的,在高并发场景下,即使多个用户同时拿到优惠券码,也会按照优先级顺序一一执行,这样保证每个用户拿出的优惠券码不会重复。

@从队列中取出指定数量的券码。

参数$num优惠券代码的数量。

返回数组 返回一个优惠券代码数组。

function getcode($num)

如果队列中没有足够的优惠券代码,则将随机生成不足的部分。

if(count($codearr)

return $codearr;

维护队列优惠券代码的数量有一个脚本会定期检查队列并找出消耗了多少优惠券代码,因此它会将多个优惠券代码推送到其中。

新生成的随机数优惠券代码应与数据库进行比对,如果优惠券代码已经存在,则应将其丢弃并重新生成。

知识点:rpush 也是原子的,当 rpush 数据时,尽量一次插入多个优惠券码,以减少用户的排队时间。

*例。

codedata=$redis->lrange($key,0,-1);取出优惠券代码队列中的所有数据。

codedata=!is_array($codedata)?[codedata;

len=count($codedata);

diff=10000-$len;失踪了多少。

validarr=;有效的验证码。

if($diff>0)

filterarr="'".$code."'";

validarr=$code;

if(count($filterarr)==0)

了解优惠券代码是否已被使用。

usedarr=;

filter_str=implode(",",$filterarr);

sql="select distinct `code` from `user_code` where `code` in ()";

tmpdata=db::query($sql);

foreach($tmpdata as $k=>$v)

unset($tmpdata);

validarr=array_diff($validarr,$usedarr);减去数据库中已使用的内容。

if(count($validarr)

项目清单

笔者所在公司的票务系统,使用这个优惠券代码方案,已经稳定运行多年,年数据上千万。

相似文章

    Redis中的Leader Follower架构如何保证数据的一致性和可靠性?

    Redis 高可用性中的主从架构是数据复制和故障转移的常见架构模式。在此体系结构中,一个节点充当领导者,负责接收和处理写入,而其他节点充当追随者,负责从领导者节点复制数据。这种架构确保了数据的一致性和可靠性。主从架构是一种主从复制方式,通过向多个节点复制数据,提高系统的可用性和可靠性。在 Redis...

    RocksDB 和 Redis 有什么区别?

    Redis 是一种开源的内存数据存储,被数百万开发人员用作数据库 缓存 流式处理引擎和消息传递 Redis 在需要低延迟和高吞吐量的实时应用程序中很受欢迎。它还常用于缓存数据库查询 复杂计算 API 调用和会话状态。RocksDB 是一个开源的可嵌入的持久化键值存储,用于快速存储。RocksDB 使...

    Redis 数据类型为地理空间

    地理空间。朋友的定位。附近有人,出租车距离计算?这个函数可以计算地理位置的信息,两地之间的距离,以及几英里半径内的人数。getadd 命令。getadd 添加地理位置。规则 不能直接添加两个级别。我们一般 城市数据,直接通过j a程序 一次性进口!有效经度从 度到 度。有效结合从 度至 度度。当坐标...

    深入了解 Go 的基本原理,并在实践中重写 Redis 中间件

    夏种植科 超兴吉特com 一 引言。随着互联网技术的不断发展,Redis作为高性能内存数据库,在众多应用场景中扮演着越来越重要的角色。为了更好地满足实际需求,我们需要重新开发Redis,以实现更高效 更灵活的中间件。本文将通过深入探讨 GO 的基本原理,介绍如何重写 Redis 中间件。.GO语言基...

    Redis 数据库组织(必需)。

    什么是 Redis?Redis是基于C语言开发的开源数据库,与传统数据库不同,Redis数据存储在内存 in memory database 中,读写速度非常快,在缓存方向上应用广泛。此外,Redis 还存储 KV 键值对数据。为了满足不同业务领域的需求,Redis内置了数据类型实现。此外,Redi...