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

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
简介: 阿里云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
AI 代码解读
        游戏用户示例信息如下:
    > evalsha f74dd5c086898b8a3d69655334b94fa7e006a9b1 1 activeusers 1  (nil)
    > set activeusers 0 OK
    > evalsha f74dd5c086898b8a3d69655334b94fa7e006a9b1 1 activeusers 1  (integer) 1
    > evalsha f74dd5c086898b8a3d69655334b94fa7e006a9b1 1 activeusers 2  (integer) 3
    AI 代码解读
    • 简单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
    AI 代码解读
         示例信息如下: 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
    AI 代码解读
    • 用户游戏社区判断:判断当前用户是否在多个游戏社区中
         Lua脚本(Sha:d7550c872f553141096d5134c027af5eeed283db)
    for i=1,#KEYS do
      if redis.call('sismember', KEYS[i], ARGV[1]) == 1 then
        return 1
      end
    end
    return 0
    AI 代码解读
          示例信息如下:
    > 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
    AI 代码解读
    • 获取游戏商店中的货品:取出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
    AI 代码解读
         示例信息如下 :取出所有在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"
    AI 代码解读

    数据分析:通过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
    AI 代码解读
         示例如下:
    > 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"
    AI 代码解读


    阿里云Redis LUA脚本安全保障
    • 全局环境保护:阿里云Redis对Lua环境中的全局环境进行保护,禁止用户添加全局变量到Lua环境中
    • 外部代码防护:为了防止用户从外部文件引入不安全的代码,阿里云Redis不提供Loadfile等函数
    • 沙箱机制防护:阿里云Redis Lua不提供访问外部系统或者执行系统调用功能
    • 开通功能限制:为保证用户数据安全,阿里云Redis 仅对申请用户开通Lua脚本功能,用户可以通过工单开通
    相关实践学习
    基于Redis实现在线游戏积分排行榜
    本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
    云数据库 Redis 版使用教程
    云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
    目录
    打赏
    0
    0
    0
    1
    9563
    分享
    相关文章
    Redis压测脚本及持久化机制
    Redis压测脚本及持久化机制简介: Redis性能压测通过`redis-benchmark`工具进行,可评估读写性能。持久化机制包括无持久化、RDB(定期快照)和AOF(操作日志),以及两者的结合。RDB适合快速备份与恢复,但可能丢失数据;AOF更安全,记录每次写操作,适合高数据安全性需求。两者结合能兼顾性能与安全性,建议同时开启并定期备份RDB文件以确保数据安全。
    40 9
    【📕分布式锁通关指南 03】通过Lua脚本保证redis操作的原子性
    本文介绍了如何通过Lua脚本在Redis中实现分布式锁的原子性操作,避免并发问题。首先讲解了Lua脚本的基本概念及其在Redis中的使用方法,包括通过`eval`指令执行Lua脚本和通过`script load`指令缓存脚本。接着详细展示了如何用Lua脚本实现加锁、解锁及可重入锁的功能,确保同一线程可以多次获取锁而不发生死锁。最后,通过代码示例演示了如何在实际业务中调用这些Lua脚本,确保锁操作的原子性和安全性。
    84 6
    【📕分布式锁通关指南 03】通过Lua脚本保证redis操作的原子性
    |
    5月前
    |
    Redis 脚本
    10月更文挑战第18天
    57 3
    Redis 功能扩展 Lua 脚本 对Redis扩展 eval redis.call redis.pcall
    通过本文的介绍,我们详细讲解了 Lua 脚本在 Redis 中的作用、`eval` 命令的使用方法以及 `redis.call` 和 `redis.pcall` 的区别和用法。通过合理使用 Lua 脚本,可以实现复杂的业务逻辑,确保操作的原子性,并减少网络开销,从而提高系统的性能和可靠性。
    94 13
    |
    3月前
    |
    公司用什么软件监控电脑:Lua 脚本在监控软件扩展功能的应用
    在企业环境中,电脑监控软件对保障信息安全、提升效率至关重要。Lua 脚本在此类软件中用于扩展功能,如收集系统信息、监控软件使用时长及文件操作,向指定服务器发送数据,支持企业管理和运营。
    67 6
    |
    5月前
    |
    大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁
    大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁
    116 3
    大数据-50 Redis 分布式锁 乐观锁 Watch SETNX Lua Redisson分布式锁 Java实现分布式锁
    大数据-43 Redis 功能扩展 Lua 脚本 对Redis扩展 eval redis.call redis.pcall
    大数据-43 Redis 功能扩展 Lua 脚本 对Redis扩展 eval redis.call redis.pcall
    67 2
    Redis命令——脚本
    Redis 脚本使用 Lua 解释器来执行脚本。 Reids 2.6 版本通过内嵌支持 Lua 环境。执行脚本的常用命令为 EVAL。
    1415 0
    redis必杀命令:脚本
    题记: Redis 脚本使用 Lua 解释器来执行脚本。 Reids 2.6 版本通过内嵌支持 Lua 环境。执行脚本的常用命令为 EVAL。
    1289 0
    Redis--缓存击穿、缓存穿透、缓存雪崩
    缓存击穿、缓存穿透和缓存雪崩是Redis使用过程中可能遇到的常见问题。理解这些问题的成因并采取相应的解决措施,可以有效提升系统的稳定性和性能。在实际应用中,应根据具体场景,选择合适的解决方案,并持续监控和优化缓存策略,以应对不断变化的业务需求。
    61 29

    数据库

    +关注

    相关产品

  • 云数据库 Tair(兼容 Redis)