@@ -11,6 +11,8 @@ import (
1111type Scripter interface {
1212 Eval (ctx context.Context , script string , keys []string , args ... interface {}) * Cmd
1313 EvalSha (ctx context.Context , sha1 string , keys []string , args ... interface {}) * Cmd
14+ EvalRO (ctx context.Context , script string , keys []string , args ... interface {}) * Cmd
15+ EvalShaRO (ctx context.Context , sha1 string , keys []string , args ... interface {}) * Cmd
1416 ScriptExists (ctx context.Context , hashes ... string ) * BoolSliceCmd
1517 ScriptLoad (ctx context.Context , script string ) * StringCmd
1618}
@@ -50,10 +52,18 @@ func (s *Script) Eval(ctx context.Context, c Scripter, keys []string, args ...in
5052 return c .Eval (ctx , s .src , keys , args ... )
5153}
5254
55+ func (s * Script ) EvalRO (ctx context.Context , c Scripter , keys []string , args ... interface {}) * Cmd {
56+ return c .EvalRO (ctx , s .src , keys , args ... )
57+ }
58+
5359func (s * Script ) EvalSha (ctx context.Context , c Scripter , keys []string , args ... interface {}) * Cmd {
5460 return c .EvalSha (ctx , s .hash , keys , args ... )
5561}
5662
63+ func (s * Script ) EvalShaRO (ctx context.Context , c Scripter , keys []string , args ... interface {}) * Cmd {
64+ return c .EvalShaRO (ctx , s .hash , keys , args ... )
65+ }
66+
5767// Run optimistically uses EVALSHA to run the script. If script does not exist
5868// it is retried using EVAL.
5969func (s * Script ) Run (ctx context.Context , c Scripter , keys []string , args ... interface {}) * Cmd {
@@ -63,3 +73,13 @@ func (s *Script) Run(ctx context.Context, c Scripter, keys []string, args ...int
6373 }
6474 return r
6575}
76+
77+ // RunRO optimistically uses EVALSHA_RO to run the script. If script does not exist
78+ // it is retried using EVAL_RO.
79+ func (s * Script ) RunRO (ctx context.Context , c Scripter , keys []string , args ... interface {}) * Cmd {
80+ r := s .EvalShaRO (ctx , c , keys , args ... )
81+ if err := r .Err (); err != nil && strings .HasPrefix (err .Error (), "NOSCRIPT " ) {
82+ return s .EvalRO (ctx , c , keys , args ... )
83+ }
84+ return r
85+ }
0 commit comments