• 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[1:]
    			}
    			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[1]
    local ttl = ARGV[1]
    
    redis.call('SET', key, 'value')
    redis.call('EXPIRE', key, ttl)
    
    return 'Key set with expiration time'
    

    在上面的示例中,首先通过KEYS[1]获取传入的键名,通过ARGV[1]获取传入的过期时间(以秒为单位)。然后使用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], 1, ARGV[1]) redis.call('ZINCRBY', KEYS[2], 1, ARGV[2]) redis.call('EXPIRE', KEYS[1], ARGV[3]) redis.call('EXPIRE', KEYS[2], ARGV[3]) return 1", 2, keyArr, valueArr, func(response resp.Value) {
    		if response.Integer() == 1 {
    			proxywasm.ResumeHttpRequest()
    		}
    	})
    	if err2 != nil {
    		return types.ActionContinue
        }
       return types.ActionPause
    
  • 相关阅读:
    Linux文本三剑客之首——awk
    网页在线打开PDF_网站中在线查看PDF之pdf.js
    ARM Linux DIY(十二)NES 游戏
    基于Dockerfile制作镜像
    Android studio run 手机或者模拟器安装失败,但是生成了debug.apk
    第二次授课内容
    多输入多输出 | MATLAB实现CNN-BiGRU卷积双向门控循环单元多输入多输出
    力扣:盛最多水的容器
    每个程序员必须掌握的常用英语词汇(建议收藏)
    drools项目中dmn文件调用自定义的java类
  • 原文地址:https://www.cnblogs.com/lori/p/18117303