phpwind 做企业网站/seo培训优化课程

phpwind 做企业网站,seo培训优化课程,凡科做的网站百度不到,公司网页制作收费标准前几天,公司数据库出现了两条相同的数据,而且时间相同(毫秒也相同)。排查原因,发现是网络波动造成了重复提交。由于网络波动而重复提交的例子也比较多:网络上,防重复提交的方法也很多&#xff0…

    前几天,公司数据库出现了两条相同的数据,而且时间相同(毫秒也相同)。排查原因,发现是网络波动造成了重复提交。

    由于网络波动而重复提交的例子也比较多:

640?wx_fmt=png

640?wx_fmt=png

    网络上,防重复提交的方法也很多,使用redis锁,代码层面使用lock。

    但是,我没有发现一个符合我心意的解决方案。因为网上的解决方案,第一次提交返回成功,第二次提交返回失败。由于两次返回信息不一致,一次成功一次失败,我们不确定客户端是以哪个返回信息为准,虽然我们希望客户端以第一次返回成功的信息为准,但客户端也可能以第二次失败信息运行,这是一个不确定的结果。

在重复提交后,如果客户端的接收到的信息都相同,都是成功,那客户端就可以正常运行,就不会影响用户体验。

    我想到一个缓存类,来源于PetaPoco。

Cache<TKey, TValue>代码如下:

 

640?wx_fmt=png


    Cache<TKey, TValue>符合我的要求,第一次运行后,会将值缓存,第二次提交会返回第一次的值。

    但是,细细分析Cache<TKey, TValue> 类,可以发现有以下几个缺点

         1、 不会自动清空缓存,适合一些key不多的数据,不适合做为网络接口。

         2、 由于_lock.EnterWriteLock,多线程会变成并单线程,不适合做为网络接口。

         3、 没有过期缓存判断。

    于是我对Cache<TKey, TValue>进行改造。

AntiDupCache代码如下:

  

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png


代码分析:

      使用两个ReaderWriterLockSlim锁 + 一个AntiDupLockSlim锁,实现并发功能。

      Dictionary<TKey, Tuple<long, TValue>> _map实现缓存,long类型值记录时间,实现缓存过期

      int _maxCount + Queue<TKey> _queue,_queue 记录key列队,当数量大于_maxCount,清除多余缓存。

      AntiDupLockSlim继承ReaderWriterLockSlim,实现垃圾回收,

代码使用 :

640?wx_fmt=png


测试性能数据:

----------------------- 开始  从1到100   重复次数:1 单位: ms -----------------------

      并发数量: 1    2    3    4    5    6    7    8    9    10   11   12

      普通并发: 188  93   65   46   38   36   28   31   22   20   18   19

  AntiDupCache: 190  97   63   48   37   34   29   30   22   18   17   21

  AntiDupQueue: 188  95   63   46   37   33   30   25   21   19   17   21

     DictCache: 185  96   64   47   38   33   28   29   22   19   17   21

         Cache: 185  186  186  188  188  188  184  179  180  184  184  176

第二次普通并发: 180  92   63   47   38   36   26   28   20   17   16   20

----------------------- 开始  从1到100   重复次数:2 单位: ms -----------------------

      并发数量: 1    2    3    4    5    6    7    8    9    10   11   12

      普通并发: 368  191  124  93   73   61   55   47   44   37   34   44

  AntiDupCache: 180  90   66   48   37   31   28   24   21   17   17   22

  AntiDupQueue: 181  93   65   46   39   31   27   23   21   19   18   19

     DictCache: 176  97   61   46   38   30   31   23   21   18   18   22

         Cache: 183  187  186  182  186  185  184  177  181  177  176  177

第二次普通并发: 366  185  127  95   71   62   56   48   43   38   34   43

----------------------- 开始  从1到100   重复次数:4 单位: ms -----------------------

      并发数量: 1    2    3    4    5    6    7    8    9    10   11   12

      普通并发: 726  371  253  190  152  132  106  91   86   74   71   69

  AntiDupCache: 189  95   64   49   37   33   28   26   22   19   17   18

  AntiDupQueue: 184  97   65   51   39   35   28   24   21   18   17   17

     DictCache: 182  95   64   45   39   34   29   23   21   18   18   16

         Cache: 170  181  180  184  182  183  181  181  176  179  179  178

第二次普通并发: 723  375  250  186  150  129  107  94   87   74   71   67

----------------------- 开始  从1到100   重复次数:12 单位: ms -----------------------

      并发数量: 1    2    3    4    5    6    7    8    9    10   11   12

      普通并发: 2170 1108 762  569  450  389  325  283  253  228  206  186

  AntiDupCache: 182  95   64   51   41   32   28   25   26   20   18   18

  AntiDupQueue: 189  93   67   44   37   35   29   30   27   22   20   17

     DictCache: 184  97   59   50   38   29   27   26   24   19   18   17

         Cache: 174  189  181  184  184  177  182  180  176  176  180  179

第二次普通并发: 2190 1116 753  560  456  377  324  286  249  227  202  189

仿线上环境,性能测试数据:

----------------------- 仿线上环境  从1到1000  单位: ms -----------------------

      并发数量: 1    2    3    4    5    6    7    8    9    10   11   12

      普通并发: 1852 950  636  480  388  331  280  241  213  198  181  168

  AntiDupCache: 1844 949  633  481  382  320  267  239  210  195  174  170

  AntiDupQueue: 1835 929  628  479  386  318  272  241  208  194  174  166

     DictCache: 1841 935  629  480  378  324  269  241  207  199  176  168

         Cache: 1832 1854 1851 1866 1858 1858 1832 1825 1801 1797 1788 1785

第二次普通并发: 1854 943  640  468  389  321  273  237  209  198  177  172

项目:

      Github:https://github.com/toolgood/ToolGood.AntiDuplication

      Nuget: Install-Package ToolGood.AntiDuplication

后记:

     尝试添加 一个Queue<AntiDupLockSlim> 或Stack<AntiDupLockSlim> 用来缓存锁,后发现性能效率相差不大,上下浮动。

     使用 lock关键字加锁,速度相差不大,代码看似更简单,但隐藏了一个地雷:一般人使用唯一键都是使用string,就意味着可能使用lock(string),锁定字符串尤其危险,因为字符串被公共语言运行库 (CLR)“暂留”。 这意味着整个程序中任何给定字符串都只有一个实例,就是这同一个对象表示了所有运行的应用程序域的所有线程中的该文本。因此,只要在应用程序进程中的任何位置处具有相同内容的字符串上放置了锁,就将锁定应用程序中该字符串的所有实例。

原文地址:https://www.cnblogs.com/toolgood/p/10700828.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com 
640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316319.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#并行编程(4):基于任务的并行

C#中的任务Task在C#编程中&#xff0c;实现并行可以直接使用线程&#xff0c;但使用起来很繁琐&#xff1b;也可以使用线程池&#xff0c;线程池很大程度上简化了线程的使用&#xff0c;但是也有着一些局限&#xff0c;比如我们不知道作业什么时候完成&#xff0c;也取不到作业…

.net core 注入中的三种模式:Singleton、Scoped 和 Transient

从上篇内容不如题的文章《.net core 并发下的线程安全问题》扩展认识.net core注入中的三种模式&#xff1a;Singleton、Scoped 和 Transient我们都知道在 Startup 的 ConfigureServices 可以注入我们想要的服务&#xff0c;那么在注入的时候有三种模式可以选择&#xff0c;那么…

【西安活动】 | 4月20日「拥抱开源,又见.NET:云时代 • 新契机」

云计算日渐兴起&#xff0c;成为提升企业效率和生产力的最终解决方案&#xff0c;而云时代也为软件开发模式带来了翻天覆地的变化。可以说 .NET Core就是这个时代催生的产物。自2016年 .NET Core 1.0 发布以来&#xff0c;其强大的生命力让越来越多技术爱好者对她的未来满怀憧憬…

C#并行编程(5):需要知道的异步

异步与并行的联系大家知道“并行”是利用CPU的多个核心或者多个CPU同时执行不同的任务&#xff0c;我们不关心这些任务之间的依赖关系。但是在我们实际的业务中&#xff0c;很多任务之间是相互影响的&#xff0c;比如统计车间全年产量的运算要依赖于各月产量的统计结果。假如你…

从壹开始 [ Id4 ] 之一║ 授权服务器 IdentityServer4 开篇讲计划书

哈喽大家周四好&#xff01;时间过的很快&#xff0c;现在已经是三月份了&#xff0c;我的 IdentityServer4 教程也拖了一定的时间了&#xff0c;正好最近有精力学新东西了&#xff0c;主要中间被小伙伴要求写一个管理后台&#xff0c;目前1.0已经上线&#xff08;《权限后台系…

.NET 泛型,详细介绍

今天的文章是因为再给一个朋友讲这个的时候随手记录下整理出来的。说白了就是把前辈们曾经给我吹过的我又吹了出去。泛型&#xff1a;是C# FrameWork 2.0 时代 加入进来的&#xff0c;可以说对与Net开发人员来说泛型是无处不再的&#xff0c;喜欢看源码的同学&#xff0c;可能会…

P2257 YY的GCD

P2257 YY的GCD 题意&#xff1a; 求 1≤x≤N,1≤y≤M1 \leq x \leq N,1 \leq y \leq M1≤x≤N,1≤y≤M 且gcd(x, y) 为质数的 (x,y) 有多少对。 题解&#xff1a; 莫比乌斯反演 代码&#xff1a; #include <bits/stdc.h> #include <unordered_map> #define…

程序员修神之路--问世间异步为何物?

菜菜哥&#xff0c;今天天气挺热的&#xff0c;我都穿裙子了说吧&#xff0c;什么事&#xff1f;&#xff1f;苦笑一下..... 老大说把所有的接口都改成异步操作异步好呀&#xff0c;最少比同步能提高吞吐量异步是怎么回事呢&#xff0c;能讲讲不&#xff1f;来&#xff0c;凑近…

P3455 [POI2007]ZAP-Queries

P3455 [POI2007]ZAP-Queries 题意&#xff1a; 求满足1≤x≤a,1≤y≤b1\leq x\leq a,1\leq y\leq b1≤x≤a,1≤y≤b&#xff0c;且gcd(x,y)dgcd(x,y)dgcd(x,y)d的二元组(x,y)的数量 题解&#xff1a; 莫比乌斯反演板子 代码&#xff1a; // Problem: P3455 [POI2007]ZAP…

.NET Core 使用MailKit发送电子邮件

点击上方蓝字关注“汪宇杰博客”发送邮件通知的功能在各种系统里都很常见。我的博客也能在有新评论、新回复&#xff0c;或者文章被其他网站引用时向管理员发送邮件。那么在.NET Core里&#xff0c;如何实现发送电子邮件呢&#xff1f;准备工作我的案例会利用微软outlook.com的…

P3327 [SDOI2015]约数个数和

P3327 [SDOI2015]约数个数和 题意&#xff1a; 设 d(x) 为 x 的约数个数&#xff0c;给定 n,m&#xff0c;求 ∑i1n∑j1md(i,j)\sum_{i1}^{n}\sum_{j1}^{m}d(i,j)∑i1n​∑j1m​d(i,j) 题解&#xff1a; 代码&#xff1a; // Problem: P3327 [SDOI2015]约数个数和 // Conte…

C#并行编程(6):线程同步面面观

理解线程同步线程的数据访问在并行&#xff08;多线程&#xff09;环境中&#xff0c;不可避免地会存在多个线程同时访问某个数据的情况。多个线程对共享数据的访问有下面3种情形&#xff1a;多个线程同时读取数据&#xff1b;单个线程更新数据&#xff0c;此时其他线程读取数据…

P2522 [HAOI2011]Problem b

P2522 [HAOI2011]Problem b 题意&#xff1a; 对于给出的 n 个询问&#xff0c;每次求有多少个数对 (x,y)&#xff0c;满足 a≤x≤b&#xff0c;c≤y≤d&#xff0c;且 gcd(x,y)k&#xff0c;gcd(x,y) 函数为 x 和 y 的最大公约数。 题解&#xff1a; 这个题跟P3455 [POI20…

.NET Core/Framework 创建委托以大幅度提高反射调用的性能

都知道反射伤性能&#xff0c;但不得不反射的时候又怎么办呢&#xff1f;当真的被问题逼迫的时候还是能找到解决办法的。为反射得到的方法创建一个委托&#xff0c;此后调用此委托将能够提高近乎直接调用方法本身的性能。&#xff08;当然 Emit 也能够帮助我们显著提升性能&…

[省选联考 2020 A/B 卷] 冰火战士(树状数组上二分)

文章目录problemsolution(10pts)code(10pts)solution(30pts)code(30pts)solution(60pts)code(60pts)solution(100pts)code(100pts)problem luogu-P6619 一场比赛即将开始。 每位战士有两个属性&#xff1a;温度和能量。 有两派战士&#xff1a; 冰系战士的技能会对周围造成…

P1829 [国家集训队]Crash的数字表格 / JZPTAB

P1829 [国家集训队]Crash的数字表格 / JZPTAB 题意&#xff1a; 求∑i1n∑j1mlcm(i,j)\sum_{i1}^{n}\sum_{j1}^{m}lcm(i,j)∑i1n​∑j1m​lcm(i,j) 1<n<m<1e7 结果mod20101009 题解&#xff1a; 跟这个题P3911 最小公倍数之和很相近&#xff0c;但是本题数据范围大…

C# 跨设备前后端开发探索

每个人都拥有 好奇心&#xff0c;好奇心驱使着我们总是去尝试做一些有趣的事情。带起你的好奇心&#xff0c;本文将使用 C# 开发各种各样好玩的东西。每个人都拥有 好奇心&#xff0c;好奇心驱使着我们总是去尝试做一些有趣的事情。比如这件事&#xff1a;在好奇心的驱使下&…

Docker最全教程之Python爬网实战(二十二)

Python目前是流行度增长最快的主流编程语言&#xff0c;也是第二大最受开发者喜爱的语言&#xff08;参考Stack Overflow 2019开发者调查报告发布&#xff09;。笔者建议.NET、Java开发人员可以将Python发展为第二语言&#xff0c;一方面Python在某些领域确实非常犀利&#xff…

P2870 [USACO07DEC]Best Cow Line G

P2870 [USACO07DEC]Best Cow Line G 题意&#xff1a; 给你一个字符串&#xff0c;每次从首或尾取一个字符组成字符串&#xff0c;问所有能够组成的字符串中字典序最小的一个。 题解&#xff1a; 现在要组成字典序最小的&#xff0c;那我们每次就尽可能取小的 我们从两端开…

中间件是什么?在.NET Core中的工作原理又是怎样的呢?

本文出自《从零开始学ASP.NET CORE MVC》推荐文章&#xff1a;ASP.NET Core appsettings.json文件ASP.NET Core 中的中间件(Middleware)在这个视频中&#xff0c;我们将了解&#xff0c;ASP.NET Core 中的中间件是 什么&#xff1f;中间件很重要&#xff0c;尤其是在你想当架构…