- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试使用 redigo在redis上执行一个lua脚本。我的代码如下所示:-
package main
import (
"github.com/PuerkitoBio/redisc"
"github.com/garyburd/redigo/redis"
"log"
"time"
)
const script = `if redis.call("EXISTS", KEYS[1]) == 1 then
local keyvalues = redis.call("HGETALL", KEYS[1])
local a = {}
for i=2, table.getn(ARGV) do
a[i-1] = ARGV[i]
end
local res = redis.call("HMSET", KEYS[1], unpack(a))
redis.call("EXPIRE", KEYS[1], ARGV[1])
return keyvalues
else
return 2 -- "Key doesn't exists"
end`
func main() {
cluster := redisc.Cluster{
StartupNodes: []string{":30001", ":30002", ":30003", ":30004", ":30005", ":30006"},
DialOptions: []redis.DialOption{redis.DialConnectTimeout(5 * time.Second)},
CreatePool: createPool,
}
defer cluster.Close()
// initialize its mapping
if err := cluster.Refresh(); err != nil {
log.Fatalf("Refresh failed: %v", err)
}
// grab a connection from the pool
conn := cluster.Get()
defer cluster.Close()
retryConn, errRe := redisc.RetryConn(conn, 3, 1*time.Millisecond)
if errRe != nil {
log.Println("Failed to get retry connection " + errRe.Error())
return
}
rScript := redis.NewScript(1, script)
argv := make([]string, 5)
argv[0] = "30000"
argv[1] = "SSF_lastAccessedDate"
argv[2] = "1481627386"
argv[3] = "SSF_expiryDate"
argv[4] = "2481657386"
reply, errS := rScript.Do(retryConn, "JJNb324a680c35d11e6a1123c15c2d271f21481871788G", argv)
if errS != nil {
log.Println("Error in executing script " + errS.Error())
} else {
log.Printf("Result %+v", reply)
}
}
func createPool(addr string, opts ...redis.DialOption) (*redis.Pool, error) {
return &redis.Pool{
MaxIdle: 100,
MaxActive: 4000,
IdleTimeout: time.Minute,
Dial: func() (redis.Conn, error) {
return redis.Dial("tcp", addr, opts...)
},
TestOnBorrow: func(c redis.Conn, t time.Time) error {
if time.Since(t) < time.Minute {
return nil
}
_, err := c.Do("PING")
return err
},
}, nil
}
但是在执行代码时会抛出错误:-
2016/12/16 12:52:32 Error in executing script ERR Error running script (call to f_5a127779e5c1c2daa0b636d9b02f6b570a9f7f13): @user_script:7: @user_script: 7: Wrong number of args calling Redis command From Lua script
谁能告诉我出了什么问题以及如何解决这个问题?
环境:-
编辑
按照答案中的建议,我将调用修改为:-
rScript.Do(retryConn, "JJNb324a680c35d11e6a1123c15c2d271f21481871788G", argv[0], argv[1], argv[2], argv[3], argv[4])
但它给出的输出是:-
2016/12/16 21:39:51 Result [[116 121 112 101] [50] [100 97 116 97] [72 101 108 108 111] [120] [50] [83 83 70 95 99 114 101 97 116 105 111 110 68 97 116 101] [49 52 56 49 56 55 49 55 56 56] [83 83 70 95 108 97 115 116 77 111 100 105 102 105 101 100 68 97 116 101] [49 52 56 49 56 55 49 55 56 56] [83 83 70 95 101 120 112 105 114 121 68 97 116 101] [50 52 56 49 54 53 55 51 56 54] [83 83 70 95 108 97 115 116 65 99 99 101 115 115 101 100 68 97 116 101] [49 52 56 49 54 50 55 51 56 54]]
但是从 redis-cli
我得到的输出是:-
1) "type"
2) "2"
3) "data"
4) "Hello"
5) "x"
6) "2"
7) "SSF_creationDate"
8) "1481871788"
9) "SSF_lastModifiedDate"
10) "1481871788"
11) "SSF_expiryDate"
12) "2481657386"
13) "SSF_lastAccessedDate"
14) "1481627386"
最佳答案
根据报错信息,错误在这一行:
local res = redis.call("HMSET", KEYS[1], unpack(a))
问题是应用程序将两个参数传递给脚本,键和 argv
转换为字符串。调用 unpack(a)
产生一个值。
修复方法是将每个参数分别传递给脚本:
reply, errS := rScript.Do(retryConn,
"JJNb324a680c35d11e6a1123c15c2d271f21481871788G",
"30000",
"SSF_lastAccessedDate", "1481627386",
"SSF_expiryDate", "2481657386")
我建议用脚本初始化一个包级变量,这样脚本文本的哈希值就计算一次,而不是每次使用脚本时都计算一次:
var rScript = redis.NewScript(1, `if redis.call("EXISTS", KEYS[1]) == 1 then
local keyvalues = redis.call("HGETALL", KEYS[1])
local a = {}
for i=2, table.getn(ARGV) do
a[i-1] = ARGV[i]
end
local res = redis.call("HMSET", KEYS[1], unpack(a))
redis.call("EXPIRE", KEYS[1], ARGV[1])
return keyvalues
else
return 2 -- "Key doesn't exists"
end`)
并在 main()
中使用此脚本:
func main() {
...
reply, errS := rScript.Do(retryConn,
"JJNb324a680c35d11e6a1123c15c2d271f21481871788G",
"30000",
"SSF_lastAccessedDate", "1481627386",
"SSF_expiryDate", "2481657386")
...
}
此外,使用 table.remove 来简化脚本:
var rScript = redis.NewScript(1, `if redis.call("EXISTS", KEYS[1]) == 1 then
local keyvalues = redis.call("HGETALL", KEYS[1])
local expires = table.remove(ARGV, 1)
local res = redis.call("HMSET", KEYS[1], unpack(ARGV))
redis.call("EXPIRE", KEYS[1], expires)
return keyvalues
else
return 2 -- "Key doesn't exists"
end`)
使用redis.Strings将从服务器返回的 []byte slice 转换为字符串 slice :
reply, errS := redis.Strings(rScript.Do(retryConn,
"JJNb324a680c35d11e6a1123c15c2d271f21481871788G",
"30000",
"SSF_lastAccessedDate", "1481627386",
"SSF_expiryDate", "2481657386"))
打印此reply
将给出您期望的结果。
关于go - 从 redigo 调用 lua 脚本抛出错误参数数量错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41179478/
为了让我的代码几乎完全用 Jquery 编写,我想用 Jquery 重写 AJAX 调用。 这是从网页到 Tomcat servlet 的调用。 我目前情况的类似代码: var http = new
我想使用 JNI 从 Java 调用 C 函数。在 C 函数中,我想创建一个 JVM 并调用一些 Java 对象。当我尝试创建 JVM 时,JNI_CreateJavaVM 返回 -1。 所以,我想知
环顾四周,我发现从 HTML 调用 Javascript 函数的最佳方法是将函数本身放在 HTML 中,而不是外部 Javascript 文件。所以我一直在网上四处寻找,找到了一些简短的教程,我可以根
我有这个组件: import {Component} from 'angular2/core'; import {UserServices} from '../services/UserService
我正在尝试用 C 实现一个简单的 OpenSSL 客户端/服务器模型,并且对 BIO_* 调用的使用感到好奇,与原始 SSL_* 调用相比,它允许一些不错的功能。 我对此比较陌生,所以我可能会完全错误
我正在处理有关异步调用的难题: 一个 JQuery 函数在用户点击时执行,然后调用一个 php 文件来检查用户输入是否与数据库中已有的信息重叠。如果是这样,则应提示用户确认是否要继续或取消,如果他单击
我有以下类(class)。 public Task { public static Task getInstance(String taskName) { return new
嘿,我正在构建一个小游戏,我正在通过制作一个数字 vector 来创建关卡,该数字 vector 通过枚举与 1-4 种颜色相关联。问题是循环(在 Simon::loadChallenge 中)我将颜
我有一个java spring boot api(数据接收器),客户端调用它来保存一些数据。一旦我完成了数据的持久化,我想进行另一个 api 调用(应该处理持久化的数据 - 数据聚合器),它应该自行异
首先,这涉及桌面应用程序而不是 ASP .Net 应用程序。 我已经为我的项目添加了一个 Web 引用,并构建了各种数据对象,例如 PayerInfo、Address 和 CreditCard。但问题
我如何告诉 FAKE 编译 .fs文件使用 fsc ? 解释如何传递参数的奖励积分,如 -a和 -target:dll . 编辑:我应该澄清一下,我正在尝试在没有 MSBuild/xbuild/.sl
我使用下划线模板配置了一个简单的主干模型和 View 。两个单独的 API 使用完全相同的配置。 API 1 按预期工作。 要重现该问题,请注释掉 API 1 的 URL,并取消注释 API 2 的
我不确定什么是更好的做法或更现实的做法。我希望从头开始创建目录系统,但不确定最佳方法是什么。 我想我在需要显示信息时使用对象,例如 info.php?id=100。有这样的代码用于显示 Game.cl
from datetime import timedelta class A: def __abs__(self): return -self class B1(A):
我在操作此生命游戏示例代码中的数组时遇到问题。 情况: “生命游戏”是约翰·康威发明的一种细胞自动化技术。它由一个细胞网格组成,这些细胞可以根据数学规则生存/死亡/繁殖。该网格中的活细胞和死细胞通过
如果我像这样调用 read() 来读取文件: unsigned char buf[512]; memset(buf, 0, sizeof(unsigned char) * 512); int fd;
我用 C 编写了一个简单的服务器,并希望调用它的功能与调用其他 C 守护程序的功能相同(例如使用 ./ftpd start 调用它并使用 ./ftpd stop 关闭该实例)。显然我遇到的问题是我不知
在 dos 中,当我粘贴此命令时它会起作用: "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" https://google.
在 dos 中,当我粘贴此命令时它会起作用: "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" https://google.
我希望能够从 cmd 在我的 Windows 10 计算机上调用 python3。 我已重新安装 Python3.7 以确保选择“添加到路径”选项,但仍无法调用 python3 并使 CMD 启动 P
我是一名优秀的程序员,十分优秀!