风雨同行 发表于 2024-5-16 11:52:37

go~在阿里mse上利用redis.call

相关依赖


[*]github.com/higress-group/proxy-wasm-go-sdk
[*]github.com/alibaba/higress/plugins/wasm-go
标准的redis

下面是一个读取redis指定key的方法,利用了higress的wasm-go组件实现的
        err := config.Client.SMembers("online", func(response resp.Value) {
                for _, item := range response.Array() {
                        str := item.String()
                        if strings.HasPrefix(str, "\"") {
                                str = str
                        }
                        if strings.HasSuffix(str, "\"") {
                                str = str[:len(str)-1]
                        }
                        if str == val {
                                msg := fmt.Sprintf("your %v (%v) is illegality.", blackType, val)
                                fmt.Println(msg)
                                ctx.SetContext("X-Blacklist-Reason", msg)
                                proxywasm.SendHttpResponse(ERROR_CODE, nil, []byte(msg), -1)
                                break
                        }
                }
                proxywasm.ResumeHttpRequest() // 恢复
        })扩展的Lua方式

在Redis的Lua脚本中,可以利用redis.call来实行Redis命令。如果需要在Lua脚本中设置键的过期时间,可以通过调用EXPIRE命令来实现。
下面是一个示例,演示如安在Lua脚本中利用redis.call实行EXPIRE命令来设置键的过期时间:
local key = KEYS
local ttl = ARGV

redis.call('SET', key, 'value')
redis.call('EXPIRE', key, ttl)

return 'Key set with expiration time'在上面的示例中,首先通过KEYS获取传入的键名,通过ARGV获取传入的过期时间(以秒为单位)。然后利用redis.call('SET', key, 'value')设置键值对,并利用redis.call('EXPIRE', key, ttl)设置键的过期时间为ttl秒。最后返回一个提示信息。
通过这种方式,你可以在Lua脚本中利用redis.call实行EXPIRE命令来设置键的过期时间。
github.com/alibaba/higress/plugins/wasm-go中的Eval

阿里封装的wasm-go插件,在2024-03-18这一天支持了redis,同时也支持利用redis.call,你可以调用wasm-go中的Eval方法

[*]方法原型
Eval(script string, numkeys int, keys, args []interface{}, callback RedisResponseCallback) error

[*]开发人员调用它
        redisKey := "business:username"
        redisKey2 := "business:session_state"
        var keyArr []interface{}
        keyArr = append(keyArr, redisKey, redisKey2)
        var valueArr []interface{}
        valueArr = append(valueArr, logger.Username, logger.Username+"_"+logger.SessionState, 60*60*24*30)
        err2 := config.Client.Eval("redis.call('ZINCRBY', KEYS, 1, ARGV) redis.call('ZINCRBY', KEYS, 1, ARGV) redis.call('EXPIRE', KEYS, ARGV) redis.call('EXPIRE', KEYS, ARGV) return 1", 2, keyArr, valueArr, func(response resp.Value) {
                if response.Integer() == 1 {
                        proxywasm.ResumeHttpRequest()
                }
        })
        if err2 != nil {
                return types.ActionContinue
    }
   return types.ActionPause
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: go~在阿里mse上利用redis.call