介绍
这篇文章给大家分享的是有关字典实现日志数据批量插入的方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
背景
最近再做一个需求,就是对站点的一些事件进行埋点,说白了就是记录用户的访问行为。那么这些数据怎么保存呢,人家点一下保存一下吗?显然不合适,肯定是需要批量保存,提高效率。
问题窥探
首先,我想到的是字典,对于c#中的字典类相信大家都不陌生,这是一个收集集(合)类型,可以通过键/值(键值对的形式来存放数据,该类最大的优点就是它查找元素的时间复杂度接近O(1),实际项目中常被用来做一些数据的本地缓存,提升整体效率Dictionary是非线程安全的类型,可以实现先添加到内存当中,在批量保存进去数据库。
主要代码实现
1,定义一个词典。
private readonly Dictionary<字符串,Tuple祝辞,_storage =, new Dictionary<字符串,Tuple 祝辞(StringComparer.OrdinalIgnoreCase);
2,添加元素,操作的时候需要对其进行线程安全处理,最简单的方式就是加锁(锁)。
public bool SaveObject(string 路径,T 价值),where T :, class { ,,,,,if (String.IsNullOrWhiteSpace(路径)) ,,,,,,,throw new ArgumentNullException (“path"); ,,,,,lock (_lock), { ,,,,,,,_storage(路径),=,Tuple.Create (new ObjectInfo  { ,,,,,,,,,Created =, DateTime.Now, ,,,,,,,,,Modified =, DateTime.Now, ,,,,,,,,,Path =,路径 ,,,,,,,},,(对象)值); ,,,,,,,if (_storage.Count 祝辞,MaxObjects) ,,,,,,,,,_storage.Remove (_storage.OrderByDescending (kvp =祝辞,kvp.Value.Item1.Created)当代()。key); ,,,,,} ,,,,,return 真实; ,,,}
3,定义一个队列,定时消费日志。
public DefaultEventQueue (ExceptionlessConfiguration 配置,IExceptionlessLog 日志,,ISubmissionClient 客户,,IObjectStorage objectStorage,, IJsonSerializer 序列化器,,时间间隔?,processQueueInterval,,时间间隔?,queueStartDelay), { ,,,,,_log =,日志; ,,,,,_config =,配置; ,,,,,_client =,客户端; ,,,,,_storage =, objectStorage; ,,,,,_serializer =,序列化器; ,,,,,if (processQueueInterval.HasValue) ,,,,,,,_processQueueInterval =, processQueueInterval.Value; ,,,,,_queueTimer =, new 计时器(OnProcessQueue, null,, queueStartDelay ? ?, TimeSpan.FromSeconds (2), _processQueueInterval); ,,,}
这里删除的时候也需要锁操作。
public bool DeleteObject (string 路径),{ ,,,,,if (String.IsNullOrWhiteSpace(路径)) ,,,,,,,throw new ArgumentNullException (“path"); ,,,,,lock (_lock), { ,,,,,,,if (! _storage.ContainsKey(路径)) ,,,,,,,,,return 假; ,,,,,,,_storage.Remove(路径); ,,,,,} ,,,,,return 真实; ,,,}
public IEnumerable, GetObjectList (string searchPattern =, null,, int ?, limit =, null,, DateTime ?, maxCreatedDate =, null), { ,,,,,if (searchPattern ==, null) ,,,,,,,searchPattern =,“*”; ,,,,,if (maxCreatedDate.HasValue !) ,,,,,,,maxCreatedDate =, DateTime.MaxValue; ,,,,,var regex =, new 正则表达式(“^”,+,Regex.Escape (searchPattern) .Replace(“\ \ *”,,“。* ?“), +,“美元”); ,,,,,lock (_lock) ,,,,,,,return _storage.Keys.Where (k =祝辞,regex.IsMatch (k) .Select (k =祝辞,_storage [k] .Item1)。(f =祝辞,f.Created & lt;=, maxCreatedDate), (limit ? ?, Int32.MaxValue) .ToList (); null 字典实现日志数据批量插入的方法