脚本进阶

HASH 操作

帮助你了解 Blue 引擎脚本中的 HASH、HashExists、HashModified 与 <$HASH(...)>,包括键值读写、过期控制、持久化和常见判断。

说明

这一页整理脚本里操作 HASH 容器时最常用的能力。

如果你的需求是做快速键值读写、运行时缓存、静态表加载或需要把一组数据长期保存在内存里并按需落盘,可以先从这里开始。

HASH 适合处理什么

HASH 更适合处理下面这类数据:

  • 键和值一一对应的快速查表数据
  • 运行时缓存、限时状态和临时标记
  • 需要按键频繁读取而不想走文件 IO 的数据
  • 需要在内存里维护,并按需保存或后台自动落盘的数据

如果当前数据本身是多层对象或数组结构,通常更适合优先看 JSON;如果当前需求主要是直接维护 ini 文件,通常更适合看 INI。

HASH 命令一览

本页中的 Hash-Set、Hash-Get、Hash-SetE 等名称用于速查;实际脚本里通常写成 HASH <标识> Set/Get/SetE ... 这类格式。

如果你只是来查某个命令的单页参数,可以直接看 HASH 命令分组。

读取与判断

这组命令更适合处理“键在不在”“值是多少”“当前容器有没有被改动”这类读取和判断场景。

命令最小格式一句话用途
HashExists<标识> <KEY>判断某个键是否存在
Hash-Get<标识> Get <KEY> <变量>把指定键的值读到变量
HashModified<标识>判断当前 HASH 是否已被修改
<$HASH(...)><$HASH(标识)键名> / <$HASH(标识)Size>直接按键读取值,或获取当前容器中的键数量

什么时候判断存在、读取变量、直接取值或检查改动

这几种能力经常一起出现,但职责不同:

场景优先能力原因
先判断键在不在HashExists适合写在 #IF 判断里,先确认某个键是否存在
需要把值读到变量里再继续处理Hash-Get适合后续做消息显示、比较或计算
只是在字符串、消息或标签里直接取值<$HASH(...)>不需要先把结果写进变量
保存前先判断容器是否改动HashModified适合在手动保存或阶段性落盘前先做判断

如果只是先判断有没有这个键,用 HashExists;如果后面还要继续参与比较、拼接或计算,用 Hash-Get;如果只是直接显示结果,用 <$HASH(...)> 往往更省事;如果你的目标是避免重复保存,优先先用 HashModified。

HashExists

#IF
HashExists 活动状态 报名开关
#ACT
SendMsg 5 "报名已经开启。"

Hash-Get

#ACT
HASH 活动状态 Get 报名开关 S10
SendMsg 5 "当前开关:<$STR(S10)>"

HashModified

#IF
HashModified 活动状态
#ACT
HASH 活动状态 Save ..\QuestDiary\活动状态.txt

这类写法适合在保存前先判断当前 HASH 是否真的发生了改动,避免每次流程执行时都重复落盘。

如果你需要判断某个键不存在时再继续执行,也可以在 #IF 里直接写 !HashExists <标识> <KEY>。

写入与维护

这组命令适合写值、改值、删键和清空容器。

命令最小格式一句话用途
Hash-Set<标识> Set <KEY> <值>向 HASH 写入一个键和值
Hash-Inc<标识> Inc <KEY> <数值>对整数值做增加
Hash-Dec<标识> Dec <KEY> <数值>对整数值做减少
Hash-Delete<标识> Delete <KEY>删除指定键
Hash-Clear<标识> Clear清空整个 HASH 容器

这组命令更适合做缓存更新、状态落点和简单计数维护。如果你只是先判断有没有这个键,仍然应优先用 HashExists,不要把写入命令当成判断命令使用。

<$HASH(...)> 标签怎么用

当前文档只收录已验证且常用的两种基础写法:

写法用途
<$HASH(标识)Size>获取当前 HASH 容器中的键数量
<$HASH(标识)键名>直接按键取值,效果接近 Hash-Get

例如:

SendMsg 5 "当前键数量:<$HASH(活动状态)Size>"
SendMsg 5 "报名开关:<$HASH(活动状态)报名开关>"

这种写法更适合直接显示结果;如果后续还要继续参与数值计算或条件比较,通常仍建议先读到变量里。

过期与持久化怎么选

HASH 常见的另外两个问题是“键多久失效”和“什么时候落盘”。

命令最小格式一句话用途
Hash-SetE<标识> SetE <KEY> <秒数>给某个键设置有效期
Hash-GetE<标识> GetE <KEY> <变量>读取过期状态或剩余秒数
Hash-Save<标识> Save <文件路径>在某个时机手动保存当前 HASH
Hash-Load<标识> Load <文件路径>从现成文件恢复容器
Hash-BGSave<标识> BGSave <文件路径>配置后台自动保存,更常见于全局 HASH

Hash-GetE 的返回值需要单独区分处理:返回 -2 表示键不存在,返回 -1 表示永不过期,返回大于等于 0 的整数时表示剩余过期秒数。

如果你需要明确知道当前容器是否已经改动,可以再配合 HashModified 做保存前判断。

相关阅读