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

当 Lua 通过 call() 或 pcall() 函数执行 Redis 命令的时候,命令的返回值会被转换成 Lua 数据结构。 同样地,当 Lua 脚本在 Redis 内置的解释器里运行时,Lua 脚本的返回值也会被转换成 Redis 协议(protocol),然后由 EVAL 将值返回给客户端。

数据类型之间的转换遵循这样一个设计原则:如果将一个 Redis 值转换成 Lua 值,之后再将转换所得的 Lua 值转换回 Redis 值,那么这个转换所得的 Redis 值应该和最初时的 Redis 值一样。

换句话说, Lua 类型和 Redis 类型之间存在着一一对应的转换关系。

Redis 到 Lua 的转换表。

  • Redis integer reply -> Lua number / Redis 整数转换成 Lua 数字
  • Redis bulk reply -> Lua string / Redis bulk 回复转换成 Lua 字符串
  • Redis multi bulk reply -> Lua table (may have other Redis data types nested) / Redis 多条 bulk 回复转换成 Lua 表,表内可能有其他别的 Redis 数据类型
  • Redis status reply -> Lua table with a single ok field containing the status / Redis 状态回复转换成 Lua 表,表内的 ok 域包含了状态信息
  • Redis error reply -> Lua table with a single err field containing the error / Redis 错误回复转换成 Lua 表,表内的 err 域包含了错误信息
  • Redis Nil bulk reply and Nil multi bulk reply -> Lua false boolean type / Redis 的 Nil 回复和 Nil 多条回复转换成 Lua 的布尔值 false

Lua 到 Redis 的转换表。

  • Lua number -> Redis integer reply (the number is converted into an integer) / Lua 数字转换成 Redis 整数
  • Lua string -> Redis bulk reply / Lua 字符串转换成 Redis bulk 回复
  • Lua table (array) -> Redis multi bulk reply (truncated to the first nil inside the Lua array if any) / Lua 表(数组)转换成 Redis 多条 bulk 回复
  • Lua table with a single ok field -> Redis status reply / 一个带单个 ok 域的 Lua 表,转换成 Redis 状态回复
  • Lua table with a single err field -> Redis error reply / 一个带单个 err 域的 Lua 表,转换成 Redis 错误回复
  • Lua boolean false -> Redis Nil bulk reply. / Lua 的布尔值 false 转换成 Redis 的 Nil bulk 回复

从 Lua 转换到 Redis 有一条额外的规则,这条规则没有和它对应的从 Redis 转换到 Lua 的规则:

  • Lua boolean true -> Redis integer reply with value of 1. / Lua 布尔值 true 转换成 Redis 整数回复中的 1

还有下面两点需要重点注意:

  • lua中整数和浮点数之间没有什么区别。因此,我们始终Lua的数字转换成整数的回复,这样将舍去小数部分。如果你想从Lua返回一个浮点数,你应该将它作为一个字符串(见比如ZSCORE命令)。
  • There is no simple way to have nils inside Lua arrays, this is a result of Lua table semantics, so when Redis converts a Lua array into Redis protocol the conversion is stopped if a nil is encountered.
时间: 2024-10-06 05:13:14

Lua 数据类型和 Redis 数据类型之间转换的相关文章

关于JAVA变量,数据类型,基本数据类型之间的转换和对象型的基本数据类型

如何给java变量取名字-----标示符     标示符是用来给类,对象,方法,变量,接口和自定义数据类型命名的.凡是可以自己取名字的地方都叫做标示符,都要遵循标示符的规则. 标示符的规则:1.由数字,字母和下划线(_),美元符号($)组成. 2.区分大小写,首字母不能数字,长度无限制. 3.不能与java关键字重名. java常用数据类型(基本类型和引用类型) 基本数据类型: 基本数据类型分为数值类型和非数值类型.其中数值类型包括整数类型和非整形.非数值类型包括,字符类型,布尔类型, 整型包括

redis 数据类型详解 以及 redis适用场景场合

1.  MySql+Memcached架构的问题 实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样的架构,但随着业务数据量的不断增加,和访问量的持续增长,我们遇到了很多问题: 1.MySQL需要不断进行拆库拆表,Memcached也需不断跟着扩容,扩容和维护工作占据大量开发时间. 2.Memcached与MySQL数据库数据一致性问题. 3.Memcached数据命中率低或down机,大量访问直接穿透到DB,MySQL无

redis数据类型及使用场景

Redis数据类型  String: Strings 数据结构是简单的key-value类型,value其实不仅是String,也可以是数字. 常用命令:  set,get,decr,incr,mget 等. 应用场景:String是最常用的一种数据类型,普通的key/ value 存储都可以归为此类.即可以完全实现目前 Memcached 的功能,并且效率更高.还可以享受Redis的定时持久化,操作日志及 Replication等功能.除了提供与 Memcached 一样的get.set.in

Redis数据类型--hash

Redis 的 哈希值是字符串字段和字符串值之间的映射 相比于string等数据类型,其提供了很多方便的域操作,因此在表示对象时,是非常适合的数据类型 在redis中的哈希值存储容量是非常巨大的,可以存储超过40亿键值对 将Redis中的Hash类型看成具有String Key和String Value的map容器.所以该类型非常适合于存储值对象的信息.如Username.Password和Age等 hash是一些列key value(field value)的映射表.常常用其存储一些对象实例.

解决从 datetime2 数据类型到 datetime 数据类型的转换产生一个超出范围的值的问题

场景: ASP.NET MVC项目中,使用entity framework添加数据遇到"从 datetime2 数据类型到 datetime 数据类型的转换产生一个超出范围的值"这个错误问题.后经过问题的排查,是由于C#代码中实体类所传入的DateTime类型属性没有赋值的原因,其中主要涉及到SQL Server 中datetime2的时间精度和日期范围的问题. 条件分析: SQL Server数据库版本中有datetime2类型 数据库中,某个要进行添加或者修改操作的字段的数据类型为

redis使用基础(二) ——Redis数据类型

redis使用基础(二) --Redis数据类型 (转载请附上本文链接--linhxx)  一.概述 Redis是一种Key-Value类型的数据库,属于非关系型数据库,NoSQL的一种.Redis共有5种数据类型:字符串(string).散列(hash).列表(list).集合(set).有序集合(zset). 1.通配符 Redis支持部分通配符,包括?.*.[].\x,和正则表达式一致,?表示匹配0或1个,*匹配任意个,[]匹配框内的任意一个内容,\x转义,例如\?表示匹配?. 2.获取键

redis数据类型的使用和介绍

redis数据类型的使用 list  列表 最多可以存2的32次方减1 个 元素组成列表 用来存储多个有序的字符串. 在redis中,可以对列表俩端插入(push)和(pop)弹出,还可以获得制定范围的元素列表,获取指定索引下表的元素等 元素可以重复 命令操作 操作类型 操作 添加 : rpush    lpush   linsert 查 : lrange    lindex  llen 删除  : lpop    rpop  lrem  ltrim 修改 :   lset 阻塞操作  :  b

缓存数据库-redis数据类型和操作(list)

转: 狼来的日子里! 奋发博取 缓存数据库-redis数据类型和操作(list) 一:Redis 列表(List) Redis列表是简单的字符串列表,按照插入顺序排序.你可以添加一个元素导列表的头部(左边)或者尾部(右边) 一个列表最多可以包含 232 - 1 个元素 (4294967295, 每个列表超过40亿个元素). List操作,redis中的List在在内存中按照一个name对应一个List来存储.如图: 二:列表常用操作 1)lpush(name,values)  在name对应的l

Redis数据类型:Sorted Sets操作指令

Redis数据类型:Sorted Sets操作指令 Sorted Sets常用操作指令 Sorted Sets,本质是一个有序的Sets,其实在原来的Sets集合中对每一个元素新增了一个属性Score,用于排序. ZADD 将指定的元素及Score添加到集合.如果集合中存在该元素,则更新其Score. 如果集合不存在,会先创建一个集合然后在添加元素及Score. 127.0.0.1:6379> ZADD sortset 1 name (integer) 1 ZRANGE 返回指定下标开始到结束下