ToB企服应用市场:ToB评测及商务社交产业平台

标题: go~在阿里mse上利用redis.call [打印本页]

作者: 风雨同行    时间: 2024-5-16 11:52
标题: go~在阿里mse上利用redis.call
相关依赖

标准的redis

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

在Redis的Lua脚本中,可以利用redis.call来实行Redis命令。如果需要在Lua脚本中设置键的过期时间,可以通过调用EXPIRE命令来实现。
下面是一个示例,演示如安在Lua脚本中利用redis.call实行EXPIRE命令来设置键的过期时间:
  1. local key = KEYS[1]
  2. local ttl = ARGV[1]
  3. redis.call('SET', key, 'value')
  4. redis.call('EXPIRE', key, ttl)
  5. 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方法
  1. Eval(script string, numkeys int, keys, args []interface{}, callback RedisResponseCallback) error
复制代码
  1.         redisKey := "business:username"
  2.         redisKey2 := "business:session_state"
  3.         var keyArr []interface{}
  4.         keyArr = append(keyArr, redisKey, redisKey2)
  5.         var valueArr []interface{}
  6.         valueArr = append(valueArr, logger.Username, logger.Username+"_"+logger.SessionState, 60*60*24*30)
  7.         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) {
  8.                 if response.Integer() == 1 {
  9.                         proxywasm.ResumeHttpRequest()
  10.                 }
  11.         })
  12.         if err2 != nil {
  13.                 return types.ActionContinue
  14.     }
  15.    return types.ActionPause
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4