巧用Dictionary实现日志数据批量插入
背景
最近再做一个需求,就是对站点的一些事件进行埋点,说白了就是记录用户的访问行为。那么这些数据怎么保存呢,人家点一下保存一下?显然不合适,肯定是需要批量保存,提高效率。
问题窥探
首先,我想到的是Dictionary,对于C#中的Dictionary类相信大家都不陌生,这是一个Collection(集合)类型,可以通过Key/Value(键值对的形式来存放数据;该类最大的优点就是它查找元素的时间复杂度接近O(1),实际项目中常被用来做一些数据的本地缓存,提升整体效率。Dictionary是非线程安全的类型,可以实现先添加到内存当中,在批量保存进去数据库。
主要代码实现
1、定义一个Dictionary。
privatereadonlyDictionary>_storage=newDictionary >(StringComparer.OrdinalIgnoreCase);
2、添加元素,操作的时候需要对其进行线程安全处理,最简单的方式就是加锁(lock)。
publicboolSaveObject(stringpath,Tvalue)whereT:class{ if(String.IsNullOrWhiteSpace(path)) thrownewArgumentNullException("path"); lock(_lock){ _storage[path]=Tuple.Create(newObjectInfo{ 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); } returntrue; }
3、定义一个队列,定时消费日志。
publicDefaultEventQueue(ExceptionlessConfigurationconfig,IExceptionlessLoglog,ISubmissionClientclient,IObjectStorageobjectStorage,IJsonSerializerserializer,TimeSpan?processQueueInterval,TimeSpan?queueStartDelay){ _log=log; _config=config; _client=client; _storage=objectStorage; _serializer=serializer; if(processQueueInterval.HasValue) _processQueueInterval=processQueueInterval.Value; _queueTimer=newTimer(OnProcessQueue,null,queueStartDelay??TimeSpan.FromSeconds(2),_processQueueInterval); }
这里删除的时候也需要lock操作。
publicboolDeleteObject(stringpath){ if(String.IsNullOrWhiteSpace(path)) thrownewArgumentNullException("path"); lock(_lock){ if(!_storage.ContainsKey(path)) returnfalse; _storage.Remove(path); } returntrue; }
publicIEnumerableGetObjectList(stringsearchPattern=null,int?limit=null,DateTime?maxCreatedDate=null){ if(searchPattern==null) searchPattern="*"; if(!maxCreatedDate.HasValue) maxCreatedDate=DateTime.MaxValue; varregex=newRegex("^"+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实现日志数据批量插入的文章就介绍到这了,更多相关Dictionary实现日志数据批量插入内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!