相关依赖

  • 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

go~在阿里mse上使用redis.call的更多相关文章

  1. 阿里云部署安装redis无法访问

    ps:我在linux上安装redis后发现一直端口不通连接不上,折腾一晚上.后来在阿里云官方回复(机器人)中看到下面的回复:       2019/02/28 22:50 自己一试,过完是端口监听是本 ...

  2. Docker上安装Redis

    Docker可以很方便的进行服务部署和管理,下面我们通过docker来搭建Redis的单机模式.Redis主从复制.Redis哨兵模式.Redis-Cluster模式 一.在Docker上安装单机版R ...

  3. 从阿里云迁移分布式redis实例到华为云解决方案(详细)

    如果要换多数是经济因素啦- 一. 准备工作 先在华为云上买一台redis数据库,配置一定要注意多数要保持一致,至于4.0还是5.0倒问题不大亲测兼容 可用区要找现有ECS云主机中的相同的机器.记下:这 ...

  4. 云计算之路-阿里云上:从ASP.NET线程角度对“黑色30秒”问题的全新分析

    在这篇博文中,我们抛开对阿里云的怀疑,完全从ASP.NET的角度进行分析,看能不能找到针对问题现象的更合理的解释. “黑色30秒”问题现象的主要特征是:排队的请求(Requests Queued)突增 ...

  5. 云计算之路-阿里云上:Web服务器遭遇奇怪的“黑色30秒”问题

    今天下午访问高峰的时候,主站的Web服务器出现奇怪的问题,开始是2台8核8G的云服务器(ECS),后来又加了1台8核8G的云服务器,问题依旧. 而且3台服务器特地使用了不同的配置:1台是禁用了虚拟内存 ...

  6. 本地计算机 上的 Redis Server 服务启动后停止

    服务器上Redis服务安装正常..却启动不了.. 报错  :   本地计算机 上的 Redis Server 服务启动后停止.某些服务在未由其他服务或程序使用时将自动停止. 最后发现是Redis的配置 ...

  7. 云计算之路-阿里云上:遭遇CDN问题

    7月10日11:14接到一位用户反馈,访问园子时加载不了 common.cnblogs.com/script/jquery.js 这个文件. 由于这个域名用了阿里云CDN,所以我们判断可能是某个CDN ...

  8. centOS上安装redis

    1.安装tcl支持 yum install tcl 2.安装redis我们以最新的2.8.9为例 $ wget http://download.redis.io/releases/redis-2.8. ...

  9. Redis简介以及如何在Windows上安装Redis

    Redis简介 Redis是一个速度非常快的非关系型内存数据库. Redis提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erla ...

  10. 远程登录阿里云上的MySQL

    近期对云和server之类的感兴趣,想要将自己的数据什么的保存到远端server.研究了阿里云和百度云.今天算是有点进步吧. 我在阿里云上申请了个免费的云server(ECS),非常可惜仅仅能用5天. ...

随机推荐

  1. 如何快速使用LayUI MINI框架

    是什么 LayUI MINI是基于LayUI框架开发的一套最简洁.易用的后台框架模板,它已经是一个非常完整的脚手架,有现成的页面模板可以参考甚至是直接使用. 通常来说,如果我们准备开发一套管理系统的W ...

  2. C C++内功心法-基础篇

    大家好,今天给大家讲讲C C++的一些基础语法,小编整理了一些简单入门基础知识,对于我们编程也有很多的帮助. C++ cin C++中的cin是一个 istream对象,从标准输入中读取数据,在ios ...

  3. Unity3D常用方法

    1.StartCoroutine(Thread1()) 启动协程运行Thread1()方法. 注意是协程,不是线程,详情见:https://www.jianshu.com/p/6d923cb0c900 ...

  4. 【Azure Redis 缓存】Azure Redis 遇见的连接不上问题和数据丢失的情况解答

    问题描述 PHP应用再连接Azure Redis服务时,出现Connection Timed out.当通过升级提高Azure Redis的性能时候,发现之前的数据丢失了. 问题解答 当Redis服务 ...

  5. 【Azure API 管理】在 Azure API 管理中使用 OAuth 2.0 授权和 Azure AD 保护 Web API 后端,在请求中携带Token访问后报401的错误

    问题描述 在 Azure API 管理中使用 OAuth 2.0 授权和 Azure AD 保护 Web API 后端的文档中操作 "在开发人员门户中启用 OAuth 2.0 用户授权&qu ...

  6. Linux管理SpringBoot应用shell脚本实现

    ​ Liunx系统如何部署和管理SpringBoot项目应用呢?最简单的方法就是写个shell脚本. Spring Boot是Java的一个流行框架,用于开发企业级应用程序.下面我们将学习如何在Lin ...

  7. XAF Blazor 中使用 Blazor 组件

    前言 文章的标题是不是感觉有点奇怪,但实际我们在XAFBlazor中使用Blazor组件是很繁琐的,我们需要将Blazor组件封装成属性编辑器(PropertyEditor),再用非持久化对象(Non ...

  8. C语言中的强制转换

    许久没有遇到的问题   C语言真是博大精深,越使用它,就越发感觉到它的威力和恐怖,最近在做算法的时候,遇到了一个强转的错误,把人折腾的够受,这次要好好梳理一下了,希望下次不能再犯此类的问题. 强制转换 ...

  9. Grails批改默认启动端口

    Grails修改默认启动端口 Grails默认启动端口号是8080,有几种修改的方式: 一.在官网文档中有介绍: grails -Dserver.port=8090 run-app -Dserver. ...

  10. 2、Azure Devops之Azure Boards使用

    1.什么是Azure Boards 使用面板.积压工作.冲刺.查询管理项目的用户故事.待办事项.任务.特性和bug. 2.工作项(WorkItem) 工作项管理的可以管理和创建用户故事.特性.任务. ...