缓存
# 背景
在物联网项目中,缓存的身影总是少不了的。以我的项目为例,我就用了本地缓存,基于ConcurrentHashMap
实现;分布式缓存,基于Redis
实现。
# 本地缓存
设备与平台连接时,基于Netty
,会有一个Channel
。平台与设备就基于这个Channel
相互进行通信。为了能够更方便的对通道进行管理,我使用了ConcurrentHashMap
,简单实现了个本地缓存。
设置缓存: 使用channel获取的远程地址当做key,通道作为值来使用。
private Map<String, Channel> channelMapping = new ConcurrentHashMap<>(16);
1
存放&移除时机:通道激活时,放入缓存;通道关闭时,移除缓存。
public void channelActive(ChannelHandlerContext ctx) throws Exception {
String clientIdentify = ctx.channel().remoteAddress().toString();
log.info("clientIdentify: {} active......", clientIdentify);
server.getChannelMapping().put(clientIdentify, ctx.channel());
super.channelActive(ctx);
}
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
String clientIdentify = ctx.channel().remoteAddress().toString();
server.getChannelMapping().remove(clientIdentify);
super.channelInactive(ctx);
log.info("clientIdentify: {} inactive......", clientIdentify);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
使用:需要对设备发送数据时,单独获取,发送数据。
public void sendByte(String remoteAddress, byte[] bytes) {
Channel channel = this.getChannelMapping().get(remoteAddress);
ByteBuf buf = Unpooled.buffer();
buf.writeBytes(bytes);
channel.writeAndFlush(buf);
}
1
2
3
4
5
6
2
3
4
5
6
# Redis
Redis时一个使用 C 语言开发的数据库,不过与传统数据库不同的是 Redis 的数据是存在内存中的 ,也就是它是内存数据库,所以读写速度非常快。
# 设备信息
类型 | 结构 | 操作 |
---|---|---|
设备信息 | hash | 设备影子注释 |
通常情况下,设备影子由云平台提供,当物理设备连接到云平台时,设备影子会自动创建。设备影子包含了设备的属性、状态、元数据和影子状态等信息。设备影子的状态信息可以与设备进行同步,以便在设备离线时保持其最新状态。在设备重新连接到云平台时,设备影子可以帮助设备进行快速的状态同步。
设备影子的主要作用是提供一个中间层,实现设备和应用程序之间的解耦和互操作。应用程序可以通过设备影子来监控和控制设备状态,而不需要直接与设备进行通信。这种方式使应用程序更加灵活和可靠,并且可以轻松地在不同的设备之间进行迁移和扩展。
设备影子还可以用于数据分析和可视化。通过收集设备影子的数据,可以实时地监控设备的状态和性能,并对其进行分析和可视化。这样可以帮助用户更好地了解设备的工作状态,优化设备的性能,提高设备的可用性和可靠性。
# 用户信息
类型 | 结构 | 操作 |
---|---|---|
登录用户信息 | string | 记录用户的登录信息:浏览器版本、ip、登录时间 |
在线用户信息 | zset | 记录在线用户数量。可根据sort对不同类型的用户设置不同的权重 |
# 权限信息
类型 | 结构 | 操作 |
---|---|---|
资源信息 | string | 记录平台所有的资源 |
上次更新: 2023/02/19, 11:42:06