接上篇c#实现redis客户端(一),重新整理些了下。
阅读目录:
背景:因为有地方要用,而又没找到对sentinel良好支持的Net客户端,所以就简单重写了个。
目标:尽可能的简单,轻量级,不进行过度的封装,使用方便。
代码说明:
1. 与Redis服务端的Socket通信、协议格式封装。在RedisBaseClient里
2. 只对Set、Get封装,暴露出Send接口。在RedisCommand里面添加自己想要的支持。
var info = rcClient.Send(RedisCommand.INFO);
3. RedisBaseClient是通信层。 如果扩展其他用途继承即可,比如RedisPubSub:RedisBaseClient,RedisSentinel:RedisBaseClient
4. 供上层良好调用的话,可以做成partial类扩展redisclient。比如RedisClient.String
5. 订阅的监听是直接while的,可在触发事件里面做阻塞。
6. PoolRedisClient池的实现使用ConcurrentStack,仅达到了复用socket连接的目的。
7. 支持socket重连,做法是关闭旧连接,重新建立新socket。
8. 多个命令使用管道实现。见set实现
后续思路:
一:PoolRedisClient池里面连接的释放问题?
1. 使用using 2. 不用使用using,会自动检测并回收 。
不做成自动检测的话,就会出现连接无法释放的问题,总会有人忘记释放的。 所以会优化成1+2结合的方式。
二:client池和socket池分离,socket单独做一个池? 还在考虑中。
命令执行流程图、解决方案图、类图。
[TestMethod, TestCategory("PushSub")]
public void Subscribe_Sentinel_Test()
{
using (RedisPubSub rsc = new RedisPubSub("127.0.0.1", 20001))
{
rsc.SubscriptionReceived += rsc_SubscriptionReceived;
//rsc.Subscribe("+sdown");
}
}
View Code
[TestMethod, TestCategory("String")]
public void Set_Get_key()
{
using (var rcClient = new RedisClient(ip, port))
{
rcClient.Set("Set_Get_key", "Set_Get_key");
var info2 = rcClient.Get("Set_Get_key");
Assert.AreEqual(info2.ToString(), "Set_Get_key");
}
}
View Code
开源地址:https://github.com/mushroomsir/HRedis 有需要的同学,可以参考下。
Hredis后续会跟实际需求来写,如果有更好的实现思路,欢迎一起交流。