private void ProcessStorage() { try { obj_rwl.AcquireWriterLock(System.Threading.Timeout.Infinite); //在对象集合中寻找 List <CCacheItem_WuQi <K, T> > result = new List <CCacheItem_WuQi <K, T> >(); foreach (KeyValuePair <K, CCacheItem_WuQi <K, T> > defront in obj_containers) { CCacheItem_WuQi <K, T> item = (CCacheItem_WuQi <K, T>)defront.Value; if (false != item.IsExpire(intervalMinuteTime)) { result.Add(item); } } foreach (CCacheItem_WuQi <K, T> item in result) { obj_containers.Remove(item.key); } } catch (System.Exception e) { CExceptionContainer_WuQi.ProcessException(e); throw e; } finally { obj_rwl.ReleaseWriterLock(); } }
public bool Insert(K k, CCacheItem_WuQi <K, T> item, ref ICacheStorage_WuQi <K, T> container) { if (!container.Contains(k)) { container.Add(k, item); } return(true); }
/// <summary> /// 获取此存储器中所有项的值 /// </summary> /// <returns>存储项列表(数组)</returns> public CCacheItem_WuQi <K, T>[] GetAllValues() { CCacheItem_WuQi <K, T>[] tmp = new CCacheItem_WuQi <K, T> [this.obj_cache.Count]; System.Collections.Generic.Dictionary <K, CCacheItem_WuQi <K, T> > .ValueCollection vc = this.obj_cache.Values; vc.CopyTo(tmp, 0); return(tmp); }
public T SelectSingleObject(ref ICacheStorage_WuQi <K, T> container, K k, out int getall) { if (false != container.Contains(k)) { getall = 1;//该数据已经查询到了,不在需要到数据库中查询了。 CCacheItem_WuQi <K, T> item = container[k]; //更新元素的访问数和最后访问时间 item.hits++; item.d_lastaccesstime = DateTime.Now; return(item.t_value); } else { getall = 0; } return(default(T)); }
/// <summary> /// 更新一个对象 /// </summary> /// <param name="t">对象的值</param> /// <param name="k">对象的键</param> /// <returns></returns> public bool Update(K k, T t) { int rollback = 0;//设置回滚标记;用来同步数据库操作和内存操作 CCacheItem_WuQi <K, T> backT = null; try { obj_rwl.AcquireWriterLock(System.Threading.Timeout.Infinite); //在对象集合中寻找,此处不需要过期策略 if (false != this.obj_containers.Contains(k)) { backT = this.obj_containers[k]; this.obj_containers[k] = new CCacheItem_WuQi <K, T>(k, t); rollback = 1; } //从数据库中更新,如果成功将回滚置1 //该操作将同时更新该对象的所有数据项,而没有排除不需要更新的数据项; //所以该操作要求数据库表存储在一个数据服务器上。 //不适用于分布式服务器,因为分布式服务器常采用分表策略,该操作将大大降低效率。 if (false == UpdateDB(k, t)) { this.obj_containers[k] = backT; } } catch (System.Exception e) { //如果回滚标志置1 if (0 != rollback) { this.obj_containers[k] = backT; } CExceptionContainer_WuQi.ProcessException(e); throw e; } finally { obj_rwl.ReleaseWriterLock(); } return(true); }
public bool Insert(K k, CCacheItem_WuQi <K, T> item, ref ICacheStorage_WuQi <K, T> container) { return(true); }
/// <summary> /// 设置存储项 /// </summary> /// <param name="key">存储项的健值</param> /// <param name="value">存储的对象</param> /// <remarks> /// 仅针对存在存储项,若不存在,则不进行任何操作 /// </remarks> public void Set(K key, CCacheItem_WuQi <K, T> obj) { this.obj_cache[key] = obj; }
/// <summary> /// 添加一项到存储器中 /// </summary> /// <param name="key">存储项的健值</param> /// <param name="value">存储的对象</param> /// <remarks> /// 如果存在相同的健值,则更新存储的对象 /// </remarks> public void Add(K key, CCacheItem_WuQi <K, T> obj) { this.obj_cache.Add(key, obj); }