//------------------------------------------------------------------------------ // 此代码版权(除特别声明或在XREF结尾的命名空间的代码)归作者本人若汝棋茗所有 // 源代码使用协议遵循本仓库的开源协议及附加协议,若本仓库没有设置,则按MIT开源协议授权 // CSDN博客:https://blog.csdn.net/qq_40374647 // 哔哩哔哩视频:https://space.bilibili.com/94253567 // Gitee源代码仓库:https://gitee.com/RRQM_Home // Github源代码仓库:https://github.com/RRQM // API首页:https://www.yuque.com/rrqm/touchsocket/index // 交流QQ群:234762506 // 感谢您的下载和使用 //------------------------------------------------------------------------------ //------------------------------------------------------------------------------ using System; using TouchSocket.Core; namespace TouchSocket.Rpc.TouchRpc { /// /// RedisPlugin /// public class RedisPlugin : TouchRpcPluginBase { /// /// 定义元素的序列化和反序列化。 /// 注意:Byte[]类型不用考虑。内部单独会做处理。 /// public BytesConverter Converter { get; private set; } = new BytesConverter(); /// /// 实际储存缓存。 /// public ICache ICache { get; set; } = new MemoryCache(); /// /// 设置实际储存缓存。 /// /// public void SetCache(ICache cache) { ICache = cache; } /// /// 定义元素的序列化和反序列化。 /// 注意:Byte[]类型不用考虑。内部单独会做处理。 /// /// public void SetConverter(BytesConverter converter) { Converter = converter; } /// /// /// /// /// protected override void OnHandshaked(IDependencyTouchRpc client, VerifyOptionEventArgs e) { client.SetValue(RedisClientExtensions.RedisClientProperty, new InternalRedisClient(client.RpcActor, Converter)); base.OnHandshaked(client, e); } /// /// /// /// /// protected override void OnReceivedProtocolData(IDependencyTouchRpc client, ProtocolDataEventArgs e) { switch (e.Protocol) { case TouchRpcUtility.P_600_Redis_Request: { var waitResult = new RedisResponseWaitPackage(); try { e.Handled = true; RedisRequestWaitPackage package = new RedisRequestWaitPackage(); package.Unpackage(e.ByteBlock.Seek(2)); waitResult.Sign = package.Sign; switch (package.packageType) { case RedisPackageType.Set: { bool success = ICache.SetCache(new CacheEntry(package.key) { Duration = package.timeSpan.Value, Value = package.value }); if (success) { waitResult.Status = 1; } else { waitResult.Status = byte.MaxValue; } break; } case RedisPackageType.Get: { var cache = ICache.GetCache(package.key); if (cache != null) { waitResult.Status = 1; waitResult.value = cache.Value; } else { waitResult.Status = byte.MaxValue; } } break; case RedisPackageType.Contains: { if (ICache.ContainsCache(package.key)) { waitResult.Status = 1; } else { waitResult.Status = byte.MaxValue; } } break; case RedisPackageType.Remove: { if (ICache.RemoveCache(package.key)) { waitResult.Status = 1; } else { waitResult.Status = byte.MaxValue; } } break; case RedisPackageType.Clear: { ICache.ClearCache(); waitResult.Status = 1; } break; default: return; } } catch (Exception ex) { waitResult.Status = 2; waitResult.Message = ex.Message; } using (ByteBlock byteBlock = new ByteBlock()) { waitResult.Package(byteBlock); client.Send(TouchRpcUtility.P_1600_Redis_Response, byteBlock.Buffer, 0, byteBlock.Len); } break; } case TouchRpcUtility.P_1600_Redis_Response: { e.Handled = true; var waitResult = new RedisResponseWaitPackage(); waitResult.Unpackage(e.ByteBlock.Seek(2)); client.RpcActor.WaitHandlePool.SetRun(waitResult); break; } default: break; } } } }