阿里云Redis LUA脚本功能上线——轻量嵌入,极速扩展,业务轻松跨平台

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
简介: 阿里云Redis云数据库,全面支持LUA脚本功能,助力企业轻松迁移自建Redis数据库的业务逻辑,实现业务的跨平台复用,快速驱动业务上云。

    阿里云Redis云数据库,全面支持LUA脚本功能,助力企业轻松迁移自建Redis数据库的业务逻辑,实现业务的跨平台复用,快速驱动业务上云。LUA语言作为目前最流行的轻量级嵌入式脚本语言,凭借其语法简单、高效稳定、支持复杂数据结构以及自动内存管理等特点,已经在众多著名的游戏程序中大量被使用,如:愤怒的小鸟、星际争霸、魔兽世界等。



Redis支持LUA脚本的主要优势 

    LUA脚本的融合将使Redis数据库产生更多的使用场景,迸发更多新的优势:
  • 高效性:减少网络开销及时延,多次redis服务器网络请求的操作,使用LUA脚本可以用一个请求完成
  • 数据可靠性:Redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。
  • 复用性:LUA脚本执行后会永久存储在Redis服务器端,其他客户端可以直接复用
  • 便捷性:实现程序热更新
  • 可嵌入性:可嵌入JAVA,C#等多种编程语言,支持不同操作系统跨平台交互
  • 简单强大:小巧轻便,资源占用率低,支持过程化和对象化的编程语言
  • 免费开源:遵循MIT Licence协议,可免费商用化

Redis LUA脚本应用场景

游戏开发:Lua大量用于游戏开发中,实现热升级,提升应用扩展性
  • 活跃用户判断:判断一个游戏用户是否属于活跃用户,如果符合标准,则活跃用户人数+1
    Lua脚本(sha: 089ccf077629d371793d5e928a3f06e9e483eb08)
if redis.call("EXISTS",KEYS[1]) == 1 then
  return redis.call("INCRBY",KEYS[1],ARGV[1])
else
  return nil
end
        游戏用户示例信息如下:
    > evalsha f74dd5c086898b8a3d69655334b94fa7e006a9b1 1 activeusers 1  (nil)
    > set activeusers 0 OK
    > evalsha f74dd5c086898b8a3d69655334b94fa7e006a9b1 1 activeusers 1  (integer) 1
    > evalsha f74dd5c086898b8a3d69655334b94fa7e006a9b1 1 activeusers 2  (integer) 3
    • 简单DDOS防护:限制n秒内同ip的访问次数
          Lua脚本(sha: 089ccf077629d371793d5e928a3f06e9e483eb08)
    local cnt = redis.call('INCR', KEYS[1])
    if cnt > tonumber(ARGV[1])
    then
      return 1
    end
    if cnt == 1
    then
      redis.call('PEXPIRE', KEYS[1], ARGV[2])
    end
    return 0
         示例信息如下: 10秒内192.168.1.1访问是否超过了5次
    > evalsha 089ccf077629d371793d5e928a3f06e9e483eb08 1 ratelimit:192.168.1.1 5 10000  (integer) 0
    > evalsha 089ccf077629d371793d5e928a3f06e9e483eb08 1 ratelimit:192.168.1.1 5 10000  (integer) 0
    > evalsha 089ccf077629d371793d5e928a3f06e9e483eb08 1 ratelimit:192.168.1.1 5 10000  (integer) 0
    > evalsha 089ccf077629d371793d5e928a3f06e9e483eb08 1 ratelimit:192.168.1.1 5 10000  (integer) 0
    > evalsha 089ccf077629d371793d5e928a3f06e9e483eb08 1 ratelimit:192.168.1.1 5 10000  (integer) 0
    > evalsha 089ccf077629d371793d5e928a3f06e9e483eb08 1 ratelimit:192.168.1.1 5 10000  (integer) 1
    • 用户游戏社区判断:判断当前用户是否在多个游戏社区中
         Lua脚本(Sha:d7550c872f553141096d5134c027af5eeed283db)
    for i=1,#KEYS do
      if redis.call('sismember', KEYS[i], ARGV[1]) == 1 then
        return 1
      end
    end
    return 0
          示例信息如下:
    > sadd users alice bob  (integer) 2
    > sadd admin jenny  (integer) 1
    > evalsha d7550c872f553141096d5134c027af5eeed283db 2 users admin alice  (integer) 1
    > evalsha d7550c872f553141096d5134c027af5eeed283db 3 users admin guests jenny  (integer) 1
    > evalsha d7550c872f553141096d5134c027af5eeed283db 2 users admin abner  (integer) 0
    • 获取游戏商店中的货品:取出hash表中符合条件的对象
         Lua脚本(SHA:700c06c5ce9835bf9eef2198c8bc4d268b3b5095)
    local fields = redis.call("SMEMBERS", KEYS[2])
    local values = redis.call("HMGET", KEYS[1], unpack(fields))
    local result = {}
    for i,k in ipairs(fields) do result[i] = {k, values[i]} end
    return result
         示例信息如下 :取出所有在produce集合中的对象在hash表groceries中的值
    > hset groceries bread 2  (integer) 1
    > hset groceries apples 5  (integer) 1
    > hset groceries oranges 6  (integer) 1
    > hset groceries broccoli 1  (integer) 1
    > sadd produce apples oranges broccoli  (integer) 3
    > evalsha 700c06c5ce9835bf9eef2198c8bc4d268b3b5095 2 groceries produce
    1) 1) "apples"
       2) "5"
    2) 1) "broccoli"
       2) "1"
    3) 1) "oranges"
       2) "6"

    数据分析:通过Lua脚本实现数据格式化,提供给软件平台通用接口能力
    • 实时平均值统计
          Lua脚本(sha:399fddde578fd9cb924edce746c783e8340d8251)
    local currentval = tonumber(redis.call('get', KEYS[1])) or 0
    local count = redis.call('incr', KEYS[2])
    
    currentval = tostring(currentval * (count - 1)/count + (ARGV[1]/count))
    
    redis.call('set', KEYS[1], currentval)
    return currentval
         示例如下:
    > evalsha 399fddde578fd9cb924edce746c783e8340d8251 2 score:avg score:count 80  "80"
    > evalsha 399fddde578fd9cb924edce746c783e8340d8251 2 score:avg score:count 100  "90"
    > evalsha 399fddde578fd9cb924edce746c783e8340d8251 2 score:avg score:count 75  "85"
    > evalsha 399fddde578fd9cb924edce746c783e8340d8251 2 score:avg score:count 98  "88.25"
    > evalsha 399fddde578fd9cb924edce746c783e8340d8251 2 score:avg score:count 98  "90.2"
    > evalsha 399fddde578fd9cb924edce746c783e8340d8251 2 score:avg score:count 98  "91.5"
    > get score:avg  "91.5"
    > get score:count  "6"


    阿里云Redis LUA脚本安全保障
    • 全局环境保护:阿里云Redis对Lua环境中的全局环境进行保护,禁止用户添加全局变量到Lua环境中
    • 外部代码防护:为了防止用户从外部文件引入不安全的代码,阿里云Redis不提供Loadfile等函数
    • 沙箱机制防护:阿里云Redis Lua不提供访问外部系统或者执行系统调用功能
    • 开通功能限制:为保证用户数据安全,阿里云Redis 仅对申请用户开通Lua脚本功能,用户可以通过工单开通
    相关文章
    |
    6月前
    |
    存储 NoSQL Redis
    采用Redis的Bitmaps实现类似Github连续提交状态的功能。
    在现实世界的应用开发中,实现类似于Github提交跟踪系统时,还可能需要考虑用户时区、闰年等日期相关的边界条件,以及辅助数据的存储和查询优化,例如对活跃用户的即时查询和统计等。不过这些都可以在Bitmaps的基础功能之上通过额外的代码逻辑来实现。
    147 0
    |
    8月前
    |
    缓存 NoSQL 算法
    高并发秒杀系统实战(Redis+Lua分布式锁防超卖与库存扣减优化)
    秒杀系统面临瞬时高并发、资源竞争和数据一致性挑战。传统方案如数据库锁或应用层锁存在性能瓶颈或分布式问题,而基于Redis的分布式锁与Lua脚本原子操作成为高效解决方案。通过Redis的`SETNX`实现分布式锁,结合Lua脚本完成库存扣减,确保操作原子性并大幅提升性能(QPS从120提升至8,200)。此外,分段库存策略、多级限流及服务降级机制进一步优化系统稳定性。最佳实践包括分层防控、黄金扣减法则与容灾设计,强调根据业务特性灵活组合技术手段以应对高并发场景。
    2317 7
    |
    9月前
    |
    消息中间件 缓存 NoSQL
    基于Spring Data Redis与RabbitMQ实现字符串缓存和计数功能(数据同步)
    总的来说,借助Spring Data Redis和RabbitMQ,我们可以轻松实现字符串缓存和计数的功能。而关键的部分不过是一些"厨房的套路",一旦你掌握了这些套路,那么你就像厨师一样可以准备出一道道饕餮美食了。通过这种方式促进数据处理效率无疑将大大提高我们的生产力。
    309 32
    |
    9月前
    |
    存储 监控 NoSQL
    使用Redis实现延迟消息发送功能
    使用 Redis 的密码认证功能,为实例设置密码以防止未授权访问。为消息提供适当加密,确保消息内容在网络传输过程中不被窃取或篡改。
    367 16
    |
    9月前
    |
    缓存 NoSQL 关系型数据库
    美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
    美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
    美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
    |
    4月前
    |
    缓存 负载均衡 监控
    135_负载均衡:Redis缓存 - 提高缓存命中率的配置与最佳实践
    在现代大型语言模型(LLM)部署架构中,缓存系统扮演着至关重要的角色。随着LLM应用规模的不断扩大和用户需求的持续增长,如何构建高效、可靠的缓存架构成为系统性能优化的核心挑战。Redis作为业界领先的内存数据库,因其高性能、丰富的数据结构和灵活的配置选项,已成为LLM部署中首选的缓存解决方案。
    |
    5月前
    |
    存储 缓存 NoSQL
    Redis专题-实战篇二-商户查询缓存
    本文介绍了缓存的基本概念、应用场景及实现方式,涵盖Redis缓存设计、缓存更新策略、缓存穿透问题及其解决方案。重点讲解了缓存空对象与布隆过滤器的使用,并通过代码示例演示了商铺查询的缓存优化实践。
    274 1
    Redis专题-实战篇二-商户查询缓存
    |
    4月前
    |
    缓存 运维 监控
    Redis 7.0 高性能缓存架构设计与优化
    🌟蒋星熠Jaxonic,技术宇宙中的星际旅人。深耕Redis 7.0高性能缓存架构,探索函数化编程、多层缓存、集群优化与分片消息系统,用代码在二进制星河中谱写极客诗篇。
    |
    9月前
    |
    缓存 NoSQL Java
    Redis+Caffeine构建高性能二级缓存
    大家好,我是摘星。今天为大家带来的是Redis+Caffeine构建高性能二级缓存,废话不多说直接开始~
    1306 0
    |
    5月前
    |
    缓存 NoSQL 关系型数据库
    Redis缓存和分布式锁
    Redis 是一种高性能的键值存储系统,广泛用于缓存、消息队列和内存数据库。其典型应用包括缓解关系型数据库压力,通过缓存热点数据提高查询效率,支持高并发访问。此外,Redis 还可用于实现分布式锁,解决分布式系统中的资源竞争问题。文章还探讨了缓存的更新策略、缓存穿透与雪崩的解决方案,以及 Redlock 算法等关键技术。

    相关产品

  • 云数据库 Tair(兼容 Redis)