使用lua脚本好处
- 主要优势: 减少网络开销:多个请求通过脚本一次发送,减少网络延迟
- 原子操作:将脚本作为一个整体执行,中间不会插入其他命令,无需使用事务
- 复用:客户端发送的脚本永久存在redis中,其他客户端可以复用脚本
- 可嵌入性:可嵌入JAVA,C#等多种编程语言,支持不同操作系统跨平台交互
redis调用脚本命令
1、EVAL
- EVAL script numkeys key [key …] arg [arg …]
127.1:8379> EVAL 'return "hello world"' 0
"hello world"
127.1:8379> EVAL 'return redis.call("set", KEYS[1], "bar")' 1 foo
OK
127.1:8379> get foo
"bar"
2、SCRIPT
- script flush:清除所有的脚本缓存
- script load:将脚本装入脚本缓存,不立即运行并返回其校验和
- script exists:根据指定脚本校验和,检查脚本是否存在于缓存
- script kill:杀死当前正在运行的脚本(防止脚本运行缓存,占用内存)
127.1:8379> script load "return 'hello world'"
"5332031c6b470dc5a0dd9b4bf2030dea6d65de91"
127.1:8379> script exists 5332031c6b470dc5a0dd9b4bf2030dea6d65de91
1) (integer) 1
127.1:8379> evalsha 5332031c6b470dc5a0dd9b4bf2030dea6d65de91 0
"hello world"
127.1:8379> script flush
OK
127.1:8379> script exists 5332031c6b470dc5a0dd9b4bf2030dea6d65de91
1) (integer) 0
redigo客户端调用lua
main.go
package main
import (
"fmt"
"github.com/gomodule/redigo/redis"
"io/ioutil"
"time"
)
func main() {
// 测试redis连接是否正常
dial, err := redis.Dial("tcp", "10.157.89.90:8379")
if err != nil {
panic(err)
return
}
dial.Close()
pool := &redis.Pool{
Dial: func() (redis.Conn, error) {
c, err := redis.Dial("tcp", "10.157.89.90:8379")
if err != nil {
fmt.Println(err)
return nil, err
}
return c, nil