那啥,在家里装一套Redis是个什么体验?
最近的工作快忙完了,又可以回来和大家交流了。今天的话题对很多喜欢智能家居或者在家里搞一搞家居系统的人来说可能会有点启发,但要注意的是,对于普通用户来说或许是一个挑战。
先说下背景:
现在很多人在家里有各种各样的智能系统。这些系统,例如米家、苹果HomeKit、华为HiLink等,通常都有各自封闭的生态环境。虽然我们可以依靠像Home Assistant(HA)或者HomeBridge(HB)这样的“桥梁”来实现不同设备之间的互通,但这些解决方案并非万能。在很多细微的调节和控制过程中,我们仍然会感受到不同生态系统之间的巨大隔阂。
智能家居的魅力在于其个性化和自动化的可能性。然而,当我们试图将多个品牌和系统整合到一个统一的平台时,常常会遇到各种障碍。这些障碍可能是协议的不兼容、功能的限制,或者是设备之间无法顺畅通信。
但更重要的是——由于各个厂商自己的各种“策略”,实质上在智能家居系统中我们很难找到一个统一的可以随意访问的数据存储空间。这时候想真正的搞一个“大一统”的系统就难上加难了。
说下iN自己的做法——在家里部署一套Redis!
选这种东西其实没什么心理建设的过程,唯一的原因就是在很多工作和项目中Redis使用得太多,几乎想也不想的就直接拿来在家里部署上了。
首先,Redis是什么?Redis(Remote Dictionary Server,读作“Re-di-s”)是一个开源的内存数据结构存储系统。这玩意主要是在大型的商业系统中担任缓存用途的,通常大型的网站或者应用每秒钟要承担数以万计的数据库查询、读写操作。对于任何数据库服务器来说这么大的操作量都是灾难性的。于是聪明的架构师们就在应用和数据库之间设置了一个基于内存的缓存。

在读取数据信息之前先到缓存中看一看有没有相应的结果数据,如果有,就直接调用缓存数据,如果没有则再去数据库中查询。
Redis就是这种缓存的一个具体实现产品,相应的的同类产品还有诸如:Memcached、Ehcache等等一系列的产品或者变体。
如果想用,基本上用哪个都一差不多。
iN自己的做法就相当简单粗暴了,将数据读进来,仍在Redis中,需要这类数据的应用再去Redis中查找相应的数据就好了。
举个例子:
这是iN自己家里系统看板的网络流量监控:

屏幕就在写字台边上,每天24小时开着,这样一眼看过去就可以迅速的了解家里的网络使用情况,这就省去了出现问题的时候再去路由器的控制界面上找问题的过程。基本上所有的信息或状况也就一目了然了。
怎么实现的?
实际上所用的ROS路由器是带有编程接口的,我们可以通过一行代码:rosClient(cmd='/interface/monitor-traffic', interface = rosInterfacesList, once=b" "),就可以得到路由器上所有的端口的运行情况。
然后将数据略微的做一下整理,就可以用r.set('LocalRouterInterfaceRate', network_json)将数据存储到Redis中。

这也是为什么iN一直和大家说Router OS的路由器好用的原因之一,我们完全可以通过程序来控制和读取路由器的所有行为。
对于Redis内的数据呈现,实际上就是一个大家常用的JSON字符串了:

再将Redis中的数据抽取到前端的页面,也就呈现出更加直观的数据展示效果:

从视觉上也更加容易让人理解。
为什么不直接让前端的程序来读取数据呢?其实,每一次读取ROS数据都是有时间成本和计算成本的,虽然一条语句的处理只需要几十毫秒就可以完成,但要知道——“数据产生了复用才是价值”,这个架构也就满足了一笔数据可以被多个应用和客户端共同使用的目的。
所以,如果爱折腾,还是建议在家里部署一个Redis的。
最后简单的说下Redis的安装和设置方法:
如果你有一台跑linux的系统例如ubuntu,那么只需要 sudo apt install redis-server 这么一条语句就可以在Linux上安装部署一套Redis系统。

当Redis安装完毕之后,Redis就已经运行在你的系统中了。
对于家庭使用,其实我们还需要稍微的修改一下redis的配置信息。原因是Redis本身默认被配置为仅仅允许本机访问。但对于家庭分布式系统来说,我们经常会有从各种不同的设备访问Redis的需求。因此需要将Redis的远程访问打开。
使用命令:sudo nano /etc/redis/redis.conf

把这台安装了Redis的服务器的IP地址设置一下绑定。Redis 就可以在网络上为其他系统进行服务了。
设置完毕后,命令行测试一下:

加上 -h redis 服务器的IP地址,在redis界面中输入 ping (乒)你会立刻从Redis中收到返回信息 PONG(乓),这样就证明你的Redis可以良好的工作了。

spirn
校验提示文案
synodriver
难点 1 不能用轮训 只能采用(1)blpop之类的阻塞指令(2)keyspaceevent,需要修改Redis配置(3)自己pubsub
2 用了上面的东西,如何保证2段原子性代码之间,远程的redis中状态不会被修改(为什么是2段?因为把阻塞指令放lua或者事务里面是件蠢事,redis也不允许这样,比如lua中的blpop会变成lpop)
3 cancel问题。被cancel的时候,如何知道是哪个await出来的异常?如何知道他有没有完成?如何在事后清理资源,恢复Redis中的状态?(shield无效,这是锁,不能当缩头乌龟,就是要block住当前协程)(随着try中await语句的增加,每个await都可能是cancel的源头,需要判断的东西也变多,这是场灾难) 现在就是被这几个问题卡了好久了想不到解决的办法,3可能还好解决,2只能说去赌这种小概率事情不会发生
校验提示文案
gchru
校验提示文案
DM_沃瑞亚
校验提示文案
千金散去还复来
校验提示文案
KaneZMY
校验提示文案
丁炸桥楚帮场孔过瘾
校验提示文案
wintsa123
校验提示文案
q0000x
校验提示文案
我是一颗小小的石头
校验提示文案
值友8927234115
校验提示文案
kxbs
校验提示文案
iroclee
校验提示文案
SimonX666
校验提示文案
赵云天
校验提示文案
Amxiaosha
校验提示文案
我爱黑灰肉丝
校验提示文案
值友7597782600
校验提示文案
benpower
校验提示文案
陈圻淼
校验提示文案
synodriver
难点 1 不能用轮训 只能采用(1)blpop之类的阻塞指令(2)keyspaceevent,需要修改Redis配置(3)自己pubsub
2 用了上面的东西,如何保证2段原子性代码之间,远程的redis中状态不会被修改(为什么是2段?因为把阻塞指令放lua或者事务里面是件蠢事,redis也不允许这样,比如lua中的blpop会变成lpop)
3 cancel问题。被cancel的时候,如何知道是哪个await出来的异常?如何知道他有没有完成?如何在事后清理资源,恢复Redis中的状态?(shield无效,这是锁,不能当缩头乌龟,就是要block住当前协程)(随着try中await语句的增加,每个await都可能是cancel的源头,需要判断的东西也变多,这是场灾难) 现在就是被这几个问题卡了好久了想不到解决的办法,3可能还好解决,2只能说去赌这种小概率事情不会发生
校验提示文案
捷克莫扎特
校验提示文案
linklist
校验提示文案
明日黄昏
我在路由器部署了一套redis和mondb,架了一个内部通讯环境
校验提示文案
值友5514678356
校验提示文案
我是一颗小小的石头
校验提示文案
q0000x
校验提示文案
purplerain
校验提示文案
wintsa123
校验提示文案
丁炸桥楚帮场孔过瘾
校验提示文案
SamSelect
校验提示文案
叠红包买航母
校验提示文案
千金散去还复来
校验提示文案
gchru
校验提示文案
值友7597782600
校验提示文案
天雷小滚滚
...
校验提示文案
值友1790803878
校验提示文案
我爱黑灰肉丝
校验提示文案
闲来箫声
校验提示文案
DM_沃瑞亚
校验提示文案