需求:因键值到期需处理事后工作比如清缓存等.
redis 对象存储碰到复杂对象,存储对象是有问题的, 因为redis 存取的方式是先把对象json 序列化. 取出使用时再编译过来.
也可以理解,毕竟redis 是独立运行的, 至于C# 或者java 对象这些存在内存堆里的东西, 放到redis 内,确实有很多难度和不确定因素.
于是 redis 我使用其到期删除键值功能, 对象只能由字典管理. 但字典需要维护,对象需到期删除,这时需要订阅redis 键值到期事件.根据事件传来的参数,管理c#内的字典内的对象.
1:修改redis 的配置文件 ,redis.conf 修改后无用 ,后又把目录下的redis.windows-service.conf,redis.windows.conf 两个文件都加入了或者覆盖了原配置,至于什么当前环境使用的哪个配置文件,在此就不深究了.
notify-keyspace-events "Ex"
2:重启redis 服务
3:我使用的StackExchange redis 组件
获取订阅频道号对象.
DbNum = dbNum; _conn = string.IsNullOrWhiteSpace(readWriteHosts) ? ConnectionMultiplexer.Connect(ConfigurationOptions.Parse(DefaultConnectionString)) : ConnectionMultiplexer.Connect(ConfigurationOptions.Parse(readWriteHosts)); ISubscriber subscriber = _conn.GetSubscriber(); subscriber.Subscribe("__keyevent@0__:expired", (channel, notificationType) => { Console.WriteLine(channel + "|" + notificationType); });
加上以上进行测试
RedisHelper.GetInstance().SetString("12356", "ok", new TimeSpan(0,0,20));
20秒后,便可收到事件提醒.