用静态类做Buff,可行吗

foxhunter5632 2020-06-30 09:37:55
需求:
最近生产环境有个套壳扫描的小程序,20个工作站点,A类和B类站点各10个。
A站点做一些测试数据上传,上传SN好之后B站点扫描。如果A没有过站信息,B站点扫描SN号不通过。

我的思路:
做了一个webservice,但是不想让B站点一直去调用数据库。
想着A站点过站后只管将SN写入静态类的Dictionary,同时写入数据库。B站点第一步先查询webservice的静态类中的dictionary,没有查到的情况再进行数据库查询操作。

最大的担心,写入和查询静态类会不会产生锁死的情况。
大家有没有类似经验,或者有更好的方案,交流一下。
...全文
1140 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
foxhunter5632 2020-08-05
  • 打赏
  • 举报
回复
上了上了,用redis做了缓存,晚点贴用测试跑一下,看看效果。现阶段2工位上的员工表示有很大提升
threenewbee 2020-08-05
  • 打赏
  • 举报
回复
注意并发,没有什么问题,static在所有请求中间共享。并且要注意进程回收的问题。
wanghui0380 2020-06-30
  • 打赏
  • 举报
回复
引用 5 楼 foxhunter5632 的回复:
以前都是写的单站扫描啥的,像这种20个工位一起操作的没写过,我看网上有的是用nosql来做缓存
其实你的问题并不是no不nosql。 你的问题其实是。B类公用A类的对象。也就是分布式共享状态 站在分布式共享状态的情况考虑,我们现在可能的选型 1.全局缓存redis 2.全局状态同步zookekeep/etcd/consol 3.楼上sp喜欢推荐的Orlen这类基于actor模式的分布式异步处理。(Actor模式本身就采用全局状态统一管理方式开发)
foxhunter5632 2020-06-30
  • 打赏
  • 举报
回复
谢谢大家。小厂IT,就自己一个人,写点程序满足小需求。找不到方向的时候很迷茫 回帖的都是俺朋友
  • 打赏
  • 举报
回复
“从外界操作界面来看”而产生的说法,主要都是你做事情搞设计的太少,而不敢去想造成的。但是其实那方面没有啥技术,你老板随便找一个外行、找个小姑娘都能瞎指挥程序员。那种问题不应该反复纠结,而应该认为是自己的本职工作。

那么关键执行力就是你能不能把程序的关键bug尽早让它跳出来,并且保证部署之后不出什么意外。这种软件工程过程,才是你应该去担心和解决的问题。
  • 打赏
  • 举报
回复
一个简单(但是也基本就是全部框架)的并发测试是类似这样的
var rnd = new Random();
var tasks = Enumerable.Range(0, 100).Select(i => Task.Run(async () =>
{
Console.WriteLine($"测试{i}开始了");
await Task.Delay(rnd.Next(1000));
Console.WriteLine($"测试{i}结束了");
}));
await Task.WhenAll(tasks);
Console.WriteLine($"测试完成");

当然这里只是个例子,它创建100个并发任务,然后执行它们。你应该自己写上几行代码,调用自己的业务的千差万别的 BLL 代码,一旦程序有改动、或者一有空就自己测试系统是否靠谱。
foxhunter5632 2020-06-30
  • 打赏
  • 举报
回复
以前都是写的单站扫描啥的,像这种20个工位一起操作的没写过,我看网上有的是用nosql来做缓存
wanghui0380 2020-06-30
  • 打赏
  • 举报
回复
1.微软有线程安全字典ConcurrentDictionary,这是对你本身提问的回答 2.问题iis会自己重启应用程序池,所以这个字典会自己丢失,所以你完全依赖内存字典,业务上是否有保证? 3.微软还有Cache类可以完成相同要求 4.假设不考虑iis应用池重启问题。你打算把这个字典里的项目保留多长时间,你不可能永远把他丢在内存里 所以综合考虑,此处应该是用Cache,因为他会自动逐出过期项目,按你的项目描述,我可以理解为“卡口检查”,这一般都会有正常业务周期,比如数据保存1天。1天外超时未处理检查 个人选择 CacheFactory,因为他同时支持内存缓存,Redis缓存,memcache缓存,和多级缓存 ,
正怒月神 2020-06-30
  • 打赏
  • 举报
回复
其实本质,就是先查询缓存,缓存没有,在去数据库拉取最新。 这个是常规的提高性能的做法。 逻辑上没什么大问题。 数据库往缓存写入数据时,需要锁。
  • 打赏
  • 举报
回复
多用户、并发访问有没有bug,以及其它一切是是非非,以测试为准。你应该自己写上几行测试代码来反复测试几千遍。只有你自己写测试才明白真实的业务逻辑,有bug就贴出能重现问题的源代码和调试截屏来,靠别人给你概念是写不好程序的。
  • 打赏
  • 举报
回复
缓存的真正概念,在于它应该自动“清理缓存”,例如根据内存占用情况、使用次数、存活时间、依赖于其它缓存的改变,等等条件而自动级联删除。把一个静态内存变量叫做“缓存”这是个错误概念,静态变量就是静态变量原本的概念就好了,用不着在乱想乱起名字了。
八爻老骥 2020-06-30
  • 打赏
  • 举报
回复
以前做的项目,有些对象不能序列化,我就是放静态变量里的,用的挺爽。只要使用得当,没什么不可以。
xuzuning 2020-06-30
  • 打赏
  • 举报
回复
WebService是一种跨编程语言和跨操作系统平台的远程调用技术。 只有通过Web Service,客户端和服务器才能够自由的用HTTP进行通信 而HTTP是无状态协议,静态对象并不能独立于应用之外 所以你的问题并无讨论的基础

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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