/// <summary> /// 获取当前数据 /// </summary> /// <param name="key">关键字</param> /// <param name="isLive">设置为活动数据</param> /// <returns></returns> public valueType Get(ref keyType key, bool isLive = false) { if (current == null) { currentKey = key; if (!datas.TryGetValue(key, out current)) { datas.Add(key, current = new LiveCount(create(ref key), isLive)); if (datas.Count > maxDataCount && freeData.Count != 0) { keyType removeKey = freeData.UnsafePopNode().Key; datas.Remove(removeKey); LiveCount removeValue; freeData.Remove(ref removeKey, out removeValue); } if (!isLive) { freeData.Set(ref key, current); } } } else if (isLive) { setLive(); } return(current.Value); }
/// <summary> /// 删除文件缓存 /// </summary> /// <param name="path"></param> private void remove(ref FileCacheKey path) { FileCache file; Monitor.Enter(fileLock); if (files.Remove(ref path, out file)) { freeCacheSize += file.Size; } Monitor.Exit(fileLock); }
/// <summary> /// 根据域名获取IP地址 /// </summary> /// <param name="domain">域名</param> /// <returns>IP地址,失败返回null</returns> internal unsafe static IPAddress[] Get(ref SubArray <byte> domain) { try { fixed(byte *domainFixed = domain.Array) { byte *domainStart = domainFixed + domain.StartIndex; AutoCSer.Memory.ToLowerNotNull(domainStart, domainStart + domain.Length); HashBytes key = domain; DomainIPAddress value; Monitor.Enter(domainIpLock); try { value = domainIps.Get(ref key, default(DomainIPAddress)); if (value.Ips != null && value.Timeout < AutoCSer.Date.NowTime.Now) { domainIps.Remove(ref key, out value); value.Ips = null; } } finally { Monitor.Exit(domainIpLock); } if (value.Ips == null) { if (value.Domain == null) { value.Domain = Memory_WebClient.BytesToStringNotEmpty(domainStart, domain.Length); } IPAddress ip; if (IPAddress.TryParse(value.Domain, out ip)) { value.Timeout = DateTime.MaxValue; value.Domain = null; setDomainIp(key.Copy(), ref value); return(value.Ips = new IPAddress[] { ip }); } value.Ips = Dns.GetHostEntry(value.Domain).AddressList; if (value.Ips.Length != 0) { value.Timeout = AutoCSer.Date.NowTime.Now.AddTicks(domainIpTimeoutTicks); setDomainIp(key.Copy(), ref value); return(value.Ips); } } else { return(value.Ips); } } } catch (Exception error) { AutoCSer.Log.Pub.Log.add(AutoCSer.Log.LogType.Error, error); } return(null); }
/// <summary> /// 日志流数据 /// </summary> /// <param name="data"></param> private void onLog(AutoCSer.Net.TcpServer.ReturnValue <Log <valueType, modelType> .Data> data) { if (isError == 0) { if (data.Type == Net.TcpServer.ReturnType.Success) { try { valueType value = data.Value.Value.Value; RandomKey <keyType> key = getKey(data.Value.Value.Value); KeyValue <valueType, EventWaitHandle> queueValue; switch (data.Value.Type) { case LogType.Insert: Monitor.Enter(logLock); if (queue.TryGetOnly(key, out queueValue)) { queue.SetOnly(key, new KeyValue <valueType, EventWaitHandle>(value, null)); Monitor.Exit(logLock); } else { try { queue.Set(ref key, new KeyValue <valueType, EventWaitHandle>(value, null)); if (queue.Count > maxCount) { queue.UnsafePopNode(); } } finally { Monitor.Exit(logLock); } } return; case LogType.Update: Monitor.Enter(logLock); if (queue.TryGetOnly(key, out queueValue)) { if (queueValue.Value == null) { try { AutoCSer.MemberCopy.Copyer <modelType> .Copy(queueValue.Key, value, data.Value.Value.MemberMap); } finally { Monitor.Exit(logLock); } if (data.Value.Value.MemberMap == null && !isErrorMemberMap) { isErrorMemberMap = true; log.add(AutoCSer.Log.LogType.Warn, "客户端缓存数据缺少成员位图信息 " + typeof(valueType).fullName()); } return; } queue.Remove(ref key, out queueValue); } Monitor.Exit(logLock); MemberMapValueLinkPool <valueType> .PushNotNull(value); return; case LogType.Delete: MemberMapValueLinkPool <valueType> .PushNotNull(value); Monitor.Enter(logLock); queue.Remove(ref key, out queueValue); Monitor.Exit(logLock); return; } } catch (Exception error) { log.add(AutoCSer.Log.LogType.Error, error); } } this.error(); } }