Lua脚本操作Redis字节数组例子

这段Lua脚本主要用于处理Redis中的字节数组,涉及到空间索引的申请方法。通过读取和处理传入的参数,如数据长度、块生成时间和更新时间等,计算并更新字节数组的索引。脚本中包含了计算新索引、更新文件长度、处理多块数据等多种情况,最终将处理后的索引存储回Redis。
摘要由CSDN通过智能技术生成

    /**
     * 空间索引申请方法(value存储为Byte类型)
     * 索引结构:
     * 块开始索引,4字节,最大1.9G :2147483647/1024/1024/1024=1.9G (没有用块编号乘2048作开始索引,然后用两个字节存块编号,是因为两字节太小)
     * 索引偏移量4字节,最大1.9G :2147483647/1024/1024/1024=1.9G
     * 块生成时间与更新时间每个占4字节共8字节
     * 
     * 
     * @return
     */
    public static String getSpaceIndexByteLuaScript() {
        String luaStr = "local bigkey = KEYS[1];" 
                //数据长度
                + "local dataLen = tonumber(ARGV[1]);"
                //vid
                + "local smallKey = ARGV[2];"
                //临时编号
                + "local serNum = tonumber(ARGV[3]);" 
                //数据块长度
                + "local blockLen = tonumber(ARGV[4]);" 
                //终端时间
                + "local devTime = tonumber(ARGV[5]);" 
                //写入或更新标识,0写入,1更新
                + "local inUp =  tonumber(ARGV[6]);" 
                //该条数据该天打点状态
                + "local dayDotState =  tonumber(ARGV[7]);" 
                //日期行数据打点状态数据打点状态小Key
                + "local dayDotKey = ARGV[8];"
                //报警行数据打点状态
                + "local alarmTypeState =  tonumber(ARGV[9]);"
                //报警行数据打点状态数据打点状态小Key
                + "local alarmDotKey = ARGV[10];"
                //索引集合,字节:开始索引(4)+偏移索引(4)+块开始时间(4)+块开始更新(4);如果有多块,则重复前述
                + "local asciiIndex = redis.call('HGET',bigkey,smallKey);"
                //文件长度
                + "local oldfileLen = redis.call('HGET',bigkey,\"fileLen\");"
                //旧日期打点状态
                + "local oldDayDotState = redis.call('HGET',bigkey,dayDotKey);"
                //旧报警打点状态
                + "local oldAlarmTypeState = redis.call('HGET',bigkey,alarmDotKey);"
                
                + "local fileLen = 0;" 
                + "if(oldfileLen ~= false) then "
                + "    fileLen = tonumber(oldfileLen);" 
                + "end "
                  
                //上次索引日查询打点状态
                + "local oldDotState = 0;" 
                + "if(oldDayDotState ~= false) then "
                + "    oldDotState = tonumber(oldDayDotState);" 
                + "end "
                
                //上次索引报警查询打点状态
//                + "local oldAlarmDotState = 0;" 
//                + "if(oldAlarmTypeState ~= false) then "
//                + "    oldAlarmDotState = tonumber(oldAlarmTypeState);" 
//                + "end "
                
                //如果块大小为0,设定一个固定值
                + "if(blockLen == 0) then "
                + "    blockLen = 2048;" 
                + "end "
                
                //索引内容
                + "local beginIndex = 0;"
                + "local offSet = 0;"
                + "local blockSer = 0;"
                + "local insertTime = 0;"
                + "local updateTime = 0;"
                + "local indexTab  = {};"
                //开辟标识:0不开辟,1首次文件开辟,2重新开辟
                + "local blockFlag = 0;"
                
                //如果没有文件内容,则是文件首次申请空间
                + "if(fileLen == 0) then "
                + "       beginIndex = 0;"
                //头1个字节,每块开始包含8字节对应车辆ID
                + "       offSet = dataLen+1+8;&#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值