内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

Dictionary實現(xiàn)日志數(shù)據(jù)批量插入的方法-創(chuàng)新互聯(lián)

這篇文章給大家分享的是有關(guān)Dictionary實現(xiàn)日志數(shù)據(jù)批量插入的方法的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

成都創(chuàng)新互聯(lián)主要從事網(wǎng)站制作、做網(wǎng)站、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)林州,10年網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18980820575

背景

最近再做一個需求,就是對站點的一些事件進(jìn)行埋點,說白了就是記錄用戶的訪問行為。那么這些數(shù)據(jù)怎么保存呢,人家點一下保存一下?顯然不合適,肯定是需要批量保存,提高效率。

問題窺探

首先,我想到的是Dictionary,對于C#中的Dictionary類相信大家都不陌生,這是一個Collection(集合)類型,可以通過Key/Value(鍵值對的形式來存放數(shù)據(jù);該類較大的優(yōu)點就是它查找元素的時間復(fù)雜度接近O(1),實際項目中常被用來做一些數(shù)據(jù)的本地緩存,提升整體效率。Dictionary是非線程安全的類型,可以實現(xiàn)先添加到內(nèi)存當(dāng)中,在批量保存進(jìn)去數(shù)據(jù)庫。

主要代碼實現(xiàn)

1、定義一個Dictionary。

private readonly Dictionary<string, Tuple<ObjectInfo, object>> _storage = new Dictionary<string, Tuple<ObjectInfo, object>>(StringComparer.OrdinalIgnoreCase);

2、添加元素,操作的時候需要對其進(jìn)行線程安全處理,最簡單的方式就是加鎖(lock)。

public bool SaveObject<T>(string path, T value) where T : class {
      if (String.IsNullOrWhiteSpace(path))
        throw new ArgumentNullException("path");

      lock (_lock) {
        _storage[path] = Tuple.Create(new ObjectInfo {
          Created = DateTime.Now,
          Modified = DateTime.Now,
          Path = path
        }, (object)value);

        if (_storage.Count > MaxObjects)
          _storage.Remove(_storage.OrderByDescending(kvp => kvp.Value.Item1.Created).First().Key);
      }

      return true;
    }

3、定義一個隊列,定時消費日志。

public DefaultEventQueue(ExceptionlessConfiguration config, IExceptionlessLog log, ISubmissionClient client, IObjectStorage objectStorage, IJsonSerializer serializer, TimeSpan? processQueueInterval, TimeSpan? queueStartDelay) {
      _log = log;
      _config = config;
      _client = client;
      _storage = objectStorage;
      _serializer = serializer;
      if (processQueueInterval.HasValue)
        _processQueueInterval = processQueueInterval.Value;

      _queueTimer = new Timer(OnProcessQueue, null, queueStartDelay ?? TimeSpan.FromSeconds(2), _processQueueInterval);
    }

這里刪除的時候也需要lock 操作。

public bool DeleteObject(string path) {
      if (String.IsNullOrWhiteSpace(path))
        throw new ArgumentNullException("path");

      lock (_lock) {
        if (!_storage.ContainsKey(path))
          return false;

        _storage.Remove(path);
      }

      return true;
    }
public IEnumerable<ObjectInfo> GetObjectList(string searchPattern = null, int? limit = null, DateTime? maxCreatedDate = null) {
      if (searchPattern == null)
        searchPattern = "*";
      if (!maxCreatedDate.HasValue)
        maxCreatedDate = DateTime.MaxValue;

      var regex = new Regex("^" + Regex.Escape(searchPattern).Replace("\\*", ".*?") + "$");
      lock (_lock)
        return _storage.Keys.Where(k => regex.IsMatch(k)).Select(k => _storage[k].Item1).Where(f => f.Created <= maxCreatedDate).Take(limit ?? Int32.MaxValue).ToList();
    }

總結(jié)

1、利用Dictionary。多線程添加數(shù)據(jù)到內(nèi)存;

2、達(dá)到一定量的時候,批量保存數(shù)據(jù)。

3、使用lock ,保證Dictionary操作安全。

感謝各位的閱讀!關(guān)于“Dictionary實現(xiàn)日志數(shù)據(jù)批量插入的方法”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

當(dāng)前名稱:Dictionary實現(xiàn)日志數(shù)據(jù)批量插入的方法-創(chuàng)新互聯(lián)
分享地址:http://m.rwnh.cn/article48/poehp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動網(wǎng)站建設(shè)、網(wǎng)站設(shè)計網(wǎng)頁設(shè)計公司、企業(yè)網(wǎng)站制作品牌網(wǎng)站制作、外貿(mào)建站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運營
五原县| 财经| 石阡县| 措勤县| 新津县| 醴陵市| 卢龙县| 上饶市| 绩溪县| 舞钢市| 揭阳市| 衡山县| 舟山市| 扎兰屯市| 永州市| 永定县| 黑山县| 合阳县| 始兴县| 顺平县| 汉川市| 鲁甸县| 安丘市| 监利县| 华池县| 鄂州市| 桐城市| 乌拉特中旗| 微山县| 通州区| 岳池县| 宜章县| 巴林左旗| 巴林左旗| 喀喇| 肇源县| 图们市| 若羌县| 当阳市| 桐柏县| 姜堰市|