From b321622c95df21041ef7d8e5e9fb51cf8ea60949 Mon Sep 17 00:00:00 2001 From: hexiaoen <997135673@qq.com> Date: Wed, 3 Mar 2021 17:09:27 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9A=B4=E9=9C=B2redis=20EvalSha=20=20?= =?UTF-8?q?=E4=BB=A5=E5=8F=8AScriptLoad=E6=8E=A5=E5=8F=A3=20(#538)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: shanehe --- core/stores/redis/redis.go | 17 ++++++++++++++++- core/stores/redis/redis_test.go | 15 +++++++++++++-- 2 files changed, 29 insertions(+), 3 deletions(-) diff --git a/core/stores/redis/redis.go b/core/stores/redis/redis.go index 244f0732f..6c17be68e 100644 --- a/core/stores/redis/redis.go +++ b/core/stores/redis/redis.go @@ -250,6 +250,21 @@ func (s *Redis) Eval(script string, keys []string, args ...interface{}) (val int return } +// Eval is the implementation of redis eval command. +func (s *Redis) EvalSha(script string, keys []string, args ...interface{}) (val interface{}, err error) { + err = s.brk.DoWithAcceptable(func() error { + conn, err := getRedis(s) + if err != nil { + return err + } + + val, err = conn.EvalSha(script, keys, args...).Result() + return err + }, acceptable) + + return +} + // Exists is the implementation of redis exists command. func (s *Redis) Exists(key string) (val bool, err error) { err = s.brk.DoWithAcceptable(func() error { @@ -1672,7 +1687,7 @@ func (s *Redis) String() string { return s.Addr } -func (s *Redis) scriptLoad(script string) (string, error) { +func (s *Redis) ScriptLoad(script string) (string, error) { conn, err := getRedis(s) if err != nil { return "", err diff --git a/core/stores/redis/redis_test.go b/core/stores/redis/redis_test.go index 790e68b51..6d8af051d 100644 --- a/core/stores/redis/redis_test.go +++ b/core/stores/redis/redis_test.go @@ -947,13 +947,24 @@ func TestRedisString(t *testing.T) { func TestRedisScriptLoad(t *testing.T) { runOnRedis(t, func(client *Redis) { client.Ping() - _, err := NewRedis(client.Addr, "").scriptLoad("foo") + _, err := NewRedis(client.Addr, "").ScriptLoad("foo") assert.NotNil(t, err) - _, err = client.scriptLoad("foo") + _, err = client.ScriptLoad("foo") assert.NotNil(t, err) }) } +func TestRedisEvalSha(t *testing.T) { + runOnRedis(t, func(client *Redis) { + client.Ping() + scriptHash, err := client.ScriptLoad(`return redis.call("EXISTS", KEYS[1])`) + assert.Nil(t, err) + result, err := client.EvalSha(scriptHash, []string{"key1"}) + assert.Nil(t, err) + assert.Equal(t, int64(0), result) + }) +} + func TestRedisToPairs(t *testing.T) { pairs := toPairs([]red.Z{ {