lget

重复提交,你是如何处理的?

浪尽此生 提交于 2020-08-10 16:34:35
今天早上,新来的同事小王突然问我:“周哥,什么是幂等性啊?”。然后我就跟他解释了一番,幂等性就是说无论你执行几次请求,其结果是一样的。说到了幂等就不得不说重复提交了,你连续点击提交按钮,理论上来说这是同一条数据,数据库应该只能存入一条,而实际上存放了多条,这就违反了幂等性。因此我们就需要做一些处理,来保证连续点击提交按钮后,数据库只能存入一条数据。 防止重复提交的方式很多,这里我就说一下我认为比较好用的一种。 自定义注解+Aop实现 我们通过获取用户ip及访问的接口来判断他是否重复提交,假如这个ip在一段时间内容多次访问这个接口,我们则认为是重复提交,我们将重复提交的请求直接处理即可,不让访问目标接口。 自定义注解 @Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface NoRepeatSubmit { /** * 默认1s钟以内算重复提交 * @return */ long timeout() default 1; } Aop处理逻辑 我们将ip+接口地址作为key,随机生成UUID作为value,存入redis。每次请求进来,根据key查询redis,如果存在则说明是重复提交,抛出异常,如果不存在,则是正常提交,将key存入redis。

PHP-redis中文文档(相关)

前提是你 提交于 2020-05-04 05:28:56
phpredis是php的一个扩展,效率是相当高有链表排序功能,对创建内存级的模块业务关系 很有用;以下是redis官方提供的命令使用技巧: 下载地址如下: https://github.com/owlient/phpredis(支持redis 2.0.4) Redis::__construct构造函数 $redis = new Redis(); connect, open 链接redis服务 参数 host : string,服务地址 port : int,端口号 timeout : float,链接时长 (可选, 默认为 0 ,不限链接时间) 注: 在redis.conf中也有时间,默认为300 pconnect, popen 不会主动关闭的链接 参考上面 setOption 设置redis模式 getOption 查看redis设置的模式 ping 查看连接状态 get 得到某个key的值(string值) 如果该key不存在,return false set 写入key 和 value(string值) 如果写入成功,return ture setex 带生存时间的写入值 $redis->setex('key', 3600, 'value'); // sets key → value, with 1h TTL. setnx 判断是否重复的,写入值 $redis->setnx

爱漂泊人生 30个php操作redis常用方法代码例子

社会主义新天地 提交于 2020-05-04 04:11:40
http://www.justwinit.cn/post/8789/ 背景:redis这个新产品在sns时很火,而memcache早就存在, 但redis提供出来的功能,好多网站均把它当memcache使用,这是大才小用,这儿有30个方法来使用redis,值得了解。 这篇文章主要介绍了30个php操作redis常用方法代码例子,本文其实不止30个方法,可以操作string类型、list类型和set类型的数据,需要的朋友可以参考下 redis的操作很多的,以前看到一个比较全的博客,但是现在找不到了。查个东西搜半天,下面整理一下php处理redis的例子,个人觉得常用一些例子。下面的例子都是基于php-redis这个扩展的。 1,connect 描述:实例连接到一个Redis. 参数:host: string,port: int 返回值:BOOL 成功返回:TRUE;失败返回:FALSE 示例: <?php $redis = new redis(); $result = $redis->connect('127.0.0.1', 6379); var_dump($result); //结果:bool(true) ?> 2,set 描述:设置key和value的值 参数:Key Value 返回值:BOOL 成功返回:TRUE;失败返回:FALSE 示例: <?php $redis =

30个php操作redis常用方法代码例子(转载)

点点圈 提交于 2020-05-04 04:11:29
1、connect 描述:实例连接到一个Redis. 参数:host: string,port: int 返回值:BOOL 成功返回:TRUE;失败返回:FALSE 示例: $redis = new redis(); $result = $redis->connect('127.0.0.1', 6379); var_dump($result); //结果:bool(true) ?> 2、set 描述:设置key和value的值 参数:Key Value 返回值:BOOL 成功返回:TRUE;失败返回:FALSE 示例: $redis = new redis(); $redis->connect('127.0.0.1', 6379); $result = $redis->set('test',"11111111111"); var_dump($result); //结果:bool(true) ?> 3、get 描述:获取有关指定键的值 参数:key 返回值:string或BOOL 如果键不存在,则返回 FALSE。否则,返回指定键对应的value值。 范例: $redis = new redis(); $redis->connect('127.0.0.1', 6379); $result = $redis->get('test'); var_dump($result); //结果