Lua和Redis类型转换

Lua 数据类型和 Redis 数据类型转换

当 Lua 使用 call() 或 pcall() 调用 Redis 命令时,Redis 返回值将转换为 Lua 数据类型。同样,在调用 Redis 命令和 Lua 脚本返回值时,Lua 数据类型会转换为 Redis 协议,以便脚本可以控制 EVAL 将返回给客户端的内容。

这种数据类型之间的转换是这样设计的,如果将 Redis 类型转换为 Lua 类型,然后将结果转换回 Redis 类型,结果与初始值相同。

换句话说,Lua 和 Redis 类型之间存在一对一的转换。下表显示了所有转换规则:

Redis 到 Lua 的转换表。

  • Redis 整数返回值 -> Lua number
  • Redis 批量返回值 -> Lua 字符串
  • Redis 多批量返回值 -> Lua 表(可能嵌套了其他 Redis 数据类型)
  • Redis 状态返回值 -> Lua 表,其中包含一个包含状态的 ok 字段
  • Redis 错误返回值 -> Lua 表,其中包含包含错误的单个 err 字段
  • Redis Nil 批量返回值和 Nil 多批量返回值 -> Lua false 布尔类型

Lua 到 Redis 的转换表。

  • Lua number -> Redis integer 返回值(数字转换为整数)
  • Lua 字符串 -> Redis 批量返回值
  • Lua 表(数组)-> Redis 多批量返回值(如果有,则截断为 Lua 数组中第一个 nil)
  • 带有单个 ok 字段的 Lua 表 -> Redis 状态返回值
  • 带有单个 err 字段的 Lua 表 -> Redis 错误返回值
  • Lua boolean false -> Redis Nil 批量返回值。

还有一个额外的 Lua 到 Redis 的转换规则,它没有对应的 Redis 到 Lua 的转换规则:

Lua boolean true -> Redis 整数返回值,值为 1。
最后,需要注意三个重要规则:

Lua 有一个单一的数字类型,Lua numbers。整数和浮点数之间没有区别。所以我们总是将 Lua 数字转换为整数返回值,如果有的话,删除数字的小数部分。如果你想从 Lua 返回一个浮点数,你应该将它作为一个字符串返回,就像 Redis 本身所做的一样(例如参见 ZSCORE 命令)。
没有简单的方法在 Lua 数组中包含 nil,这是 Lua 表语义的结果,因此当 Redis 将 Lua 数组转换为 Redis 协议时,如果遇到 nil,则停止转换。
当 Lua 表包含键(及其值)时,转换后的 Redis 返回值将不包含它们。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值