小麦带你学服注册体系十一

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 解决方案

### 基于MySQL实现


这种实现方式是利用 mysql 唯一索引的特性。示意图如下:


具体流程步骤:


- 建立一张去重表,其中某个字段需要建立唯一索引

- 客户端去请求服务端,服务端会将这次请求的一些信息插入这张去重表中

- 因为表中某个字段带有唯一索引,如果插入成功,证明表中没有这次请求的信息,则执行后续的业务逻辑

- 如果插入失败,则代表已经执行过当前请求,直接返回




### 基于Redis实现


这种实现方式是基于 SETNX 命令实现的 SETNX key value:将 key 的值设为 value ,当且仅当 key 不存在。若给定的 key 已经存在,则 SETNX 不做任何动作。该命令在设置成功时返回 1,设置失败时返回 0。示意图如下:



具体流程步骤:


- 客户端先请求服务端,会拿到一个能代表这次请求业务的唯一字段

- 将该字段以 SETNX 的方式存入 redis 中,并根据业务设置相应的超时时间

- 如果设置成功,证明这是第一次请求,则执行后续的业务逻辑

- 如果设置失败,则代表已经执行过当前请求,直接返回




### 基于业务参数实现


**第一阶段**:只要客户端请求有唯一的请求编号,那么就能借用Redis做这个去重:只要这个唯一请求编号在Redis存在,证明处理过,那么就认为是重复的。


**第二阶段**:但很多的场景下,请求并不会带这样的唯一编号。先考虑简单的场景,假设请求参数只有一个字段reqParam,我们可以利用以下标识去判断这个请求是否重复:**用户ID:接口名:请求参数** 。


**第三阶段**:但我们的接口通常不是这么简单,参数通常是一个JSON。假设我们把请求参数(JSON)按KEY做升序排序,排序后拼成一个字符串作为KEY值,但这可能非常的长,所以可以考虑对这个字符串求一个MD5作为参数的摘要,以这个摘要去取代reqParam的位置。


```java

String KEY = "user_opt:U="+userId + "M=" + method + "P=" + reqParamMD5;

```


**第四阶段**:上面的问题其实已经是一个很不错的解决方案了,但是实际投入使用的时候可能发现有些问题:某些请求用户短时间内重复的点击了(例如1000毫秒发送了三次请求),但绕过了上面的去重判断(不同的KEY值)。原因是这些请求参数的字段里面,**是带时间字段的**,这个字段标记用户请求的时间,服务端可以借此丢弃掉一些老的请求(例如5秒前)。


**总结**


将业务参数(Query+Body)按KEY(排除时间字段和经纬度字段)做升序排序,排序后将按Query方式逐一拼接成参数字符串,然后将这个字符串进行MD5摘要计算,然后使用以下规则进行KEY值计算:


```java

String KEY = "前缀标识:U=" + <用户唯一标识> + "M=" + <接口唯一标识> + "P=" + <业务参数MD5签名>;

```


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
5月前
|
安全 区块链
区块链农场游戏系统开发运营版/玩法详情/规则方案/案例设计/项目源码
Developing a blockchain farm game system is an interesting and challenging task. Here is a design solution that can help you get started developing such a system
dapp预约抢单排单互助系统开发逻辑详细/功能说明/案例分析/方案规则/源码出售
Allow users to register accounts and verify their identities to ensure that the identities of participants are valid and authentic.
|
3月前
|
缓存 前端开发 测试技术
什么是七星创客系统丨七星创客系统开发规则玩法/设计方案/逻辑需求/案例项目/源码功能
七星创客系统开发指南是一个帮助开发人员理解并完成七星创客系统的开发任务的指南。以下是一个简要的开发指南需求:
|
5月前
|
新零售 小程序
认养农业互助模式系统开发|详情逻辑|案例设计
新零售是线上与线下结合,组合的价值主要是线下为线上引流
|
5月前
|
安全 BI 定位技术
同城校园外卖跑腿系统开发规则详细/需求步骤/案例设计/功能逻辑/源码版
同城校园外卖跑腿系统是为满足校园内用户对食品和商品的快速配送需求而设计的一种服务平台。
|
新零售 人工智能 供应链
七星创客/艾倍生/推三返一/系统开发方案项目/开发案例/规则玩法/源码程序
  所谓新零售即是个人、企业以互联网为依托,通过运用大数据、人工智能等先进技术手段,对商品的生产、流通与销售过程进行升级改造,进而重塑业态结构与生态圈,并对线上服务、线下体验以及现代物流进行深度融合的零售新模式。
|
JavaScript 区块链
区块链积分联盟模式系统开发源码案例参考
区块链积分联盟模式是一种利用区块链技术实现积分管理的新型模式。该模式通过将积分联盟与区块链技术相结合,实现了积分管理的去中心化和数据安全性。积分联盟是一个由中小企业或商家组成的组织,成员之间通过共享积分数据和权益来实现合作共赢。
|
运维 监控 微服务
|
缓存 NoSQL Dubbo
小麦带你学服注册体系二
含金量文章,你不得不看的好文章