joe 4 лет назад
Родитель
Сommit
b0c62a68ac
5 измененных файлов с 85 добавлено и 24 удалено
  1. 22 0
      rds/client_test.go
  2. 4 0
      rds/login.lua
  3. 24 24
      rds/script.go
  4. 34 0
      rds/script_test.go
  5. 1 0
      rds/test.lua

+ 22 - 0
rds/client_test.go

@@ -1 +1,23 @@
 package rds
+
+import (
+	"one.com/kettle/utl"
+	"testing"
+)
+
+const (
+	RDS_ADDR     = "127.0.0.1:6379"
+	RDS_PASSWORD = "123456"
+	RDS_DB       = 1
+)
+
+func TestRedis(t *testing.T) {
+	clt, err := Connect(RDS_ADDR, RDS_PASSWORD, RDS_DB)
+	utl.AssertNil(err, "redis connect", t)
+
+	r, err := clt.Set("hello", "test1", 0).Result()
+	utl.AssertNil(err, "clt.set", t)
+	t.Log("hello:", r)
+
+	clt.Close()
+}

+ 4 - 0
rds/login.lua

@@ -0,0 +1,4 @@
+-- 1 argv[1]
+local r = redis.call('set', 'name', KEYS[1])
+local r2 = redis.call('set', 'money', ARGV[1])
+return {r, r2}

+ 24 - 24
rds/script.go

@@ -3,6 +3,7 @@ package rds
 import (
 	"github.com/go-redis/redis"
 	"io/ioutil"
+	"one.com/kettle/utl"
 	"os"
 	"path/filepath"
 	"strings"
@@ -29,12 +30,6 @@ import (
 	名字不能重名
 */
 
-// LuaBlock
-type LuaBlock struct {
-	*redis.Script
-	name string
-}
-
 type luablocker interface {
 	Eval(script string, keys []string, args ...interface{}) *redis.Cmd
 	EvalSha(sha1 string, keys []string, args ...interface{}) *redis.Cmd
@@ -46,44 +41,48 @@ var _ luablocker = (*redis.Client)(nil)
 var _ luablocker = (*redis.Ring)(nil)
 var _ luablocker = (*redis.ClusterClient)(nil)
 
-func newLuaBlock(name, block string) *LuaBlock {
-	return &LuaBlock{
-		Script: redis.NewScript(block),
-		name:   name,
-	}
+type LuaSrc struct {
+	code, hash string
 }
 
 // LuaBlockManager
-type LuaScripts struct {
-	m map[string]*LuaBlock
+type LuaScriptManager struct {
+	m map[string]*LuaSrc
 	h luablocker
 }
 
-func NewLuaScripts(handle luablocker) *LuaScripts {
-	return &LuaScripts{
-		m: make(map[string]*LuaBlock),
+func NewLuaScriptManager(handle luablocker) *LuaScriptManager {
+	return &LuaScriptManager{
+		m: make(map[string]*LuaSrc),
 		h: handle,
 	}
 }
 
-func (self *LuaScripts) Exec(name string, keys []string, args ...interface{}) *redis.Cmd {
-	luablock, ok := self.m[name]
+func (self *LuaScriptManager) Exec(name string, keys []string, args ...interface{}) *redis.Cmd {
+	src, ok := self.m[name]
 	if !ok {
 		panic("not load lua script:" + name)
 	}
-	return luablock.EvalSha(self.h, keys, args)
+	return self.h.EvalSha(src.hash, keys, args...)
 }
 
-func (self *LuaScripts) LoadString(name string, block string) error {
-	_, err := self.h.ScriptLoad(block).Result()
+func (self *LuaScriptManager) LoadString(name string, src string) error {
+	hash, err := self.h.ScriptLoad(src).Result()
 	if err != nil {
 		return err
 	}
-	self.m[name] = newLuaBlock(name, block)
+	self.m[name] = &LuaSrc{
+		code: src,
+		hash: hash,
+	}
 	return nil
 }
 
-func (self *LuaScripts) LoadFile(f string) error {
+func (self *LuaScriptManager) LoadFile(f string) error {
+	ext := filepath.Ext(f)
+	if strings.ToLower(ext) != ".lua" {
+		return utl.ErrParameters
+	}
 	data, err := ioutil.ReadFile(f)
 	if err != nil {
 		return err
@@ -94,7 +93,7 @@ func (self *LuaScripts) LoadFile(f string) error {
 	return self.LoadString(name, string(data))
 }
 
-func (self *LuaScripts) LoadPath(p string) error {
+func (self *LuaScriptManager) LoadPath(p string) error {
 	err := filepath.Walk(p, func(path string, info os.FileInfo, err error) error {
 		if err != nil {
 			return err
@@ -106,6 +105,7 @@ func (self *LuaScripts) LoadPath(p string) error {
 		if fi.IsDir() {
 			return nil
 		}
+
 		return self.LoadFile(path)
 	})
 	return err

+ 34 - 0
rds/script_test.go

@@ -1 +1,35 @@
 package rds
+
+import (
+	"one.com/kettle/utl"
+	"testing"
+)
+
+func TestNewLuaScripts(t *testing.T) {
+	clt, err := Connect(RDS_ADDR, RDS_PASSWORD, RDS_DB)
+	utl.AssertNil(err, "redis connect", t)
+	defer clt.Close()
+
+	sc := NewLuaScriptManager(clt)
+
+	err = sc.LoadFile("login.lua")
+	utl.AssertNil(err, "load lua file", t)
+
+	err = sc.LoadFile("test.lua")
+	if err != nil {
+		t.Fatal(err)
+	}
+
+	//for k, v := range sc.m {
+	//	t.Log(k, "===", v)
+	//}
+
+	s, err := sc.Exec("test", []string{"jojo", "jo"}, 100, 200).Result()
+	if err != nil {
+		t.Fatal(err)
+	}
+	t.Log(s)
+	v, err := sc.Exec("login", []string{"kk"}, "jodan").Result()
+	utl.AssertNil(err, "exec login", t)
+	t.Log(v)
+}

+ 1 - 0
rds/test.lua

@@ -0,0 +1 @@
+return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}