V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Devin
V2EX  ›  .NET

S 端从数据源获取数据并保存,当 C 端请求时,返回 S 端保存的数据

  •  
  •   Devin · 2018-02-25 20:14:22 +08:00 via iPhone · 2312 次点击
    这是一个创建于 2489 天前的主题,其中的信息可能已经有所发展或是发生改变。
    1 S 端的作用可以理解成是一个中继
    2 S 端每分钟更新 1 次数据,并保存此数据 1 分钟
    3 C 端用户 100 个,每隔一段时间向 S 请求一次数据,S 端返回当时保存的数据

    请问 S 端应该怎么设计?
    1 S 端的数据怎么保存在内存不是在硬盘,减少读盘加快响应
    2 怎么同时做到保存和响应 C 端请求
    3 涉及到哪些方面的知识
    16 条回复    2018-02-27 09:38:34 +08:00
    oh
        1
    oh  
       2018-02-25 21:07:22 +08:00 via iPhone
    要么说 server / client 要么说服务端客户端,
    至于保存在哪里,这不是代码可以控制的么,你想保存在哪就保存在哪啊,.net 也有缓存,
    ……
    打了这么多 看到后面两个问题 不想再打了
    oh
        2
    oh  
       2018-02-25 21:08:28 +08:00 via iPhone
    找个会写代码的人帮你实现吧,也不至于问这样的问题
    Devin
        3
    Devin  
    OP
       2018-02-25 21:20:52 +08:00 via iPhone
    @oh 谢谢你的时间,想必阁下出生时就会写代码
    chinvo
        4
    chinvo  
       2018-02-25 21:24:01 +08:00
    不会就去学

    只会伸手是不会有好心人喂的

    或者就花钱找人实现
    或者就花时间自己学
    lbp0200
        5
    lbp0200  
       2018-02-25 21:24:15 +08:00   ❤️ 1
    这就是缓存
    chinvo
        6
    chinvo  
       2018-02-25 21:24:16 +08:00
    没人出生就会写代码
    oh
        7
    oh  
       2018-02-25 21:34:10 +08:00 via iPhone
    @Devin 术业有专用,不管你原先是不是做这一块的,问出这样的问题说明你连基础概念都没有,要么找人做,要么从基础学,而不是让别人来给你面向结果的思路。祝你下辈子出生就会写代码。
    CEBBCAT
        8
    CEBBCAT  
       2018-02-25 22:01:24 +08:00   ❤️ 1
    前提:

    1. Server 的数据从哪里来?你说是个中继, 那就要把拓扑图摆出来嘛

    问题:

    1. 你不主动去写, 数据很难存到硬盘里, 但系统可能会因为内存不足而启用虚拟内存

    2. 通讯方式是什么?

    3. 网络编程 编程基础 编程入门
    Devin
        9
    Devin  
    OP
       2018-02-25 22:05:39 +08:00 via iPhone
    @oh
    谢谢,这也不错
    那请问应该怎么学基础,或者第 3 个问题,涉及到哪些方面的知识?
    另外,新手问问题经常不着边际,请包容。。。你的文字透露出你现在心情很不好,不要把我当你的出气筒,我可以感受到你对新手满满的敌意
    我知道基础弱,之所以问怎么实现,目的是从回复中找出知识点
    还有,我就想自己做,就想!@chinvo
    Devin
        10
    Devin  
    OP
       2018-02-25 22:25:00 +08:00 via iPhone
    @CEBBCAT server 获取到的数据是由读取另一个程序生成的一个 10KB 文本文件处理后转成的一个 List<string>
    目前知道可以把这个 List<string>写入硬盘,局域网共享给 client 端读取,但这种方式明显不好,因而要换成 cs 架构
    另外用 wcf 来实现 cs 通讯也是没问题的,就是不知道怎么把 server 处理的数据缓存后响应给 client
    CEBBCAT
        11
    CEBBCAT  
       2018-02-25 23:40:00 +08:00
    @Devin #10 Socket
    oh
        12
    oh  
       2018-02-25 23:46:01 +08:00 via iPhone   ❤️ 1
    @Devin

    1. 既然是局域网内的就没有 nat 问题了,服务端直接监听某个 http 端口让客户端每分钟请求一次,取得最新的数据;

    2. 也可以反过来,服务端监听 tcp 端口,客户端全部保持连接,服务端每分钟就自动推送新版本的数据给客户端,看你自己的需求。

    3. 既然服务端是一个持久服务,而且一直是活动状态,只要你自己别写入硬盘那基本都是在内存里,也可以手动保存到 Cache 中,.net 的缓存有很多,而且 .net 本身的垃圾回收机制挺完善的,对于每分钟 100 并发这种级别的需求不用过度设计。

    4. 在一楼我就提到了你最关心的问题,至于怎么实现要么隔行如隔山你得从基础了解,要么你完全心里就有数,然而你只看到了所谓的敌意还先喷为敬,呵呵哒。
    oh
        13
    oh  
       2018-02-25 23:48:47 +08:00 via iPhone   ❤️ 1
    再补一个关键词,解决你所谓的 “每分钟” 的问题,定时器 Timer 或者线程挂起一分钟都可以。别又说没给知识点,再详细不如直接写份代码给你了。
    wizardoz
        14
    wizardoz  
       2018-02-26 09:53:54 +08:00   ❤️ 1
    用 redis。
    C 端访问时,S 端先从 redis 查找数据,如果
    没有数据,S 端更新数据,保存入 redis 并设数据超时事件为 1 分钟
    有数据,直接返回
    Devin
        15
    Devin  
    OP
       2018-02-26 19:23:46 +08:00 via iPhone
    @wizardoz 请问 S 端怎么做到,一边更新数据,一边响应 C 端呢?用 2 个任务来分别处理么?
    wizardoz
        16
    wizardoz  
       2018-02-27 09:38:34 +08:00   ❤️ 1
    @Devin 看你对数据更新时间的要求,如果需要严格一分钟更新,那么就专门用一个程序来更新数据放到 redis。一个程序当 S 端。如果对这个时间不是那么严格,只是要保证 C 端取到的数据是一分钟保质期以内的。那么用 C 端的请求来驱动数据更新就可以了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5235 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 08:41 · PVG 16:41 · LAX 00:41 · JFK 03:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.