请教大家如何设计一个高并发统计计数器的?

亚特兰蒂斯DE 2019-10-15 06:11:59
大家好 我跟大家讨论一个问题.

我要做一个数据统计计数器.

多线程并发情况下实现 统计叠加

目前办法是

对象锁 同步


大家在设计这样场景 是如何设计的

对一个变量 叠加计算...

还有其它方案么 参考下 我不知道我这个方案是否是最优
.


var long =0;
lock (lockObj_lock)
{long+++
}
...全文
303 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
亚特兰蒂斯DE 2019-10-16
  • 打赏
  • 举报
回复
谢谢 各位大神解答 ..我去实战下....给你们结贴....
正怒月神 版主 2019-10-16
  • 打赏
  • 举报
回复
Interlocked 可以满足
github_36000833 2019-10-16
  • 打赏
  • 举报
回复
如果是单机,可以直接用Interlocked.Increment
long visits = 0;
System.Threading.Interlocked.Increment(ref visits);


如果是服务器堆,比如几百个服务器,每个计数都去更新数据库可能效率不好。
一种方案是本地累计,批量更新数据库。这种情况,可能就要用lock:

long visits = 0;
object lockObj = new object();

void VisitsAddOne()
{
lock(lockObj)
{
visits++;
if (visits >= 1000)
{
DatabaseAddVisitsAsync(visits);
visits = 0;
}
}
}


如果计数是用来实时限制,比如每个用户只能用5张优惠券。
这种情况下,同步一般要在数据库部分做。比如用Redis可以类似这样做:
bool CommitAndCheckCouponUsage(string customer)
{
var current = myRedis.INCR(customer + ".coupons");
return current < 5;
}
wanghui0380 2019-10-16
  • 打赏
  • 举报
回复
net本来就有原子操作 Interlocked

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧