首页 > 数据库 >go~在阿里mse上使用redis.call

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

时间:2024-04-06 12:11:57浏览次数:24  
标签:redis ARGV EXPIRE call str go

相关依赖

  • 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

标签:redis,ARGV,EXPIRE,call,str,go
From: https://www.cnblogs.com/lori/p/18117303

相关文章

  • Go:标准库log设计哲学与并发安全探讨
    Go语言的标准库中,log包是一个处理日志记录的库,提供了基础的日志记录功能。在深入探讨log包之前,我们需要了解什么是日志以及日志在软件开发中的重要性。日志记录是一种在软件运行时记录信息的手段,可以用于调试、监控软件行为、性能分析以及确保软件运行的透明性。良好的日志......
  • Golang Context是什么
    一、这篇文章我们简要讨论Golang的Context有什么用1、首先说一下Context的基本作用,然后在讨论他的实现(1)数据传递,子Context只能看到自己的和父Context的数据,子Context是不能看到孙Context添加的数据。(2)父子协程的协同,比如同时取消父子协程。2、基本数据结构Context......
  • Redis缓存三兄弟
    Redis缓存的问题都是因为缓存过期,导致大量请求打到数据库,给数据库添加了压力。以下是典型的三个缓存问题。缓存穿透概念缓存穿透:频繁请求缓存和数据库中没有的数据,导致数据库的压力过大解决方案规则校验:增加对key的规则校验,防止恶意请求设默认值:数据库中没有数据时,给该......
  • Redis从入门到精通(七)Redis实战(四)库存超卖、一人一单与Redis分布式锁
    ↑↑↑请在文章开头处下载测试项目源代码↑↑↑文章目录前言4.3优惠券秒杀4.3.4库存超卖问题及其解决4.3.4.1问题分析4.3.4.2问题解决4.3.5一人一单需求4.3.5.1需求分析4.3.5.2代码实现4.3.5.3并发问题4.3.5.4悲观锁解决并发问题4.3.5.5集群环境下的并发问题......
  • Golang和Java的对决:从设计理念到工具链的全面比较
    文章目录使用率排名Golang和Java设计理念语法和类型系统并发处理资源消耗生态系统和工具链结语使用率排名据最新的2024年3月Tiobe编程语言排行榜,目前Golang的使用率排名为第8呈上升趋势,Java的使用率排名为第4呈下降趋势2024年3月2023年3月排名变化编程语言......
  • Go 正则表达式学习
    正则是用于处理文本的利器之一。关于正则的基础知识及应用,之前写过几篇文章,读者可以阅读文后的相关资料作一基本了解。本文主要学习Go的正则。正则表达式学习,可以分为三个子部分:正则API;正则语法;正则匹配策略。正则API第一个要学习的,就是Go正则API。API是通往......
  • raft算法和etcd代码解析-4.两个模块,两个goroutine
    etcd是什么存储:Kubernetes集群所有的配置信息和状态数据都会被持久化存储在etcd中,包括节点信息、Pods、ReplicaSets、Services、ConfigMaps、Secrets等各类资源对象。协调:通过Raft协议,etcd集群中的各个节点达成一致,确保任何时候集群状态的变更都是原子性的、一致的,并且在节点故......
  • 详解 Redis 在 Ubuntu 系统上的安装
    在Ubuntu20.04安装Redis1.先切换到root用户在Ubuntu20.04中,可以通过以下步骤切换到root用户:输入以下命令,以root用户身份登录:sudosu-按回车键,并输入当前用户的密码(即具有sudo权限的用户的密码)如果密码正确,将会切换到root用户,并且提示符会变为以r......
  • Redis中惰性策略的启发和流量包应用设计
    引言    在技术领域,许多中间件之所以获得巨大成功,部分原因在于它们所采用的思想之先进。这些思想解决了一个个世纪难题,接下来我将讲述一个我学习到的思想,并将其应用至工作中的案例。        惰性策略在日常编码中随处可见,但究竟什么是惰性策略呢?简而言之,惰性......
  • What is the difference between Mysql InnoDB B+ tree index and hash index? Why do
    原文:WhatisthedifferencebetweenMysqlInnoDBB+treeindexandhashindex?WhydoesMongoDBuseB-tree?|byMinaAyoub|MediumThemostimportantdifferencebetweenB-treeandB+treeisthatB+treeonlyhasleafnodestostoredata,andothernodes......