亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Dictionary實現日志數據批量插入的方法

發布時間:2021-02-02 09:51:00 來源:億速云 閱讀:167 作者:小新 欄目:開發技術

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

背景

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

問題窺探

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

主要代碼實現

1、定義一個Dictionary。

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

2、添加元素,操作的時候需要對其進行線程安全處理,最簡單的方式就是加鎖(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();
    }

總結

1、利用Dictionary。多線程添加數據到內存;

2、達到一定量的時候,批量保存數據。

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

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

兰考县| 浙江省| 鸡泽县| 河间市| 安新县| 桑日县| 江安县| 平湖市| 亚东县| 明光市| 晋宁县| 抚远县| 莒南县| 南溪县| 镇远县| 前郭尔| 响水县| 天等县| 连南| 屏边| 区。| 博白县| 万宁市| 米易县| 阆中市| 北海市| 东宁县| 普洱| 荣成市| 洛宁县| 凉城县| 龙陵县| 广昌县| 玉田县| 台山市| 呼伦贝尔市| 仁化县| 巨鹿县| 泰安市| 江津市| 南投市|