찾다
데이터 베이스RedisJava 생태계/Redis에서 Lua 스크립트를 사용하는 방법

1. LUA 설치

Mac에 LUA를 설치하는 것은 매우 간단합니다. brew 관련 명령을 사용하면 됩니다. brew相关命令;

brew install lua

Java 생태계/Redis에서 Lua 스크립트를 사용하는 방법

使用lua -v命令可以看到lua已经安装完毕。

1)简单使用

创建一个test.lua文件,内容为:

Java 생태계/Redis에서 Lua 스크립트를 사용하는 방법

执行命令:

lua test.lua

输出为:

Java 생태계/Redis에서 Lua 스크립트를 사용하는 방법

二、lua语法简介

Lua 提供了交互式编程和脚本式编程:

  • 交互式编程:直接在命令行中输入语法,可以立即执行并查看到执行效果。

  • 脚本是编程:编写脚本文件,然后再执行。

1、注释

lua提供两种注释方式:单行注释和多行注释

1)单行注释

使用两个减号;

--

2)多行注释
--[[
 多行注释
 多行注释
 --]]

2、关键字

下列为 Lua 的保留关键字,和Java一样 保留关键字不能作为常量或变量。

Java 생태계/Redis에서 Lua 스크립트를 사용하는 방법

3、变量

默认的情况下,定义一个变量都是全局变量;如果要用局部变量 需要声明为local

1)全局变量

全局变量不需要声明,给一个变量赋值后便创建了这个全局变量;

访问一个没有初始化的全局变量也不会出错,只不过会得到结果:nil

Java 생태계/Redis에서 Lua 스크립트를 사용하는 방법

只要将变量赋值为nil,就可以删除全局变量;换句话说,当且仅当变量为nil时,该变量不存在。

Java 생태계/Redis에서 Lua 스크립트를 사용하는 방법

此外,一般以下划线开头连接一串大写字母的名字(比如 _VERSION)被保留用于 Lua 内部全局变量。

2)局部变量
-- 局部变量赋值
local b=2

4、数据类型

Lua 是一个动态类型语言,变量不要类型定义,只需要为变量赋值。 值可以存储在变量中,作为参数传递或结果返回。

Lua 中有 8 个基本类型分别为:nil、boolean、number、string、userdata、function、thread 和 table。

Java 생태계/Redis에서 Lua 스크립트를 사용하는 방법

1)Lua数组

在Lua 数组中,索引值是从 1 开始,可以指定为从 0 开始。

Java 생태계/Redis에서 Lua 스크립트를 사용하는 방법

2)字符串操作
  • .. 连接两个字符串;

  • string.sub() 用于截取字符串;

string.sub(s, i [, j])
  • s:要截取的字符串;

  • i:截取开始位置;

  • j:截取结束位置,默认为 -1,最后一个字符;

string.find() 用于字符串查找

string.find (str, substr, [init, [plain]])
  • 在一个指定的目标字符串 str 中搜索指定的内容 substr,如果找到了一个匹配的子串,就会返回这个子串的起始索引和结束索引,不存在则返回 nil。

  • init 指定了搜索的起始位置,默认为 1,可以一个负数,表示从后往前数的字符个数。

  • plain 表示是否使用简单模式,默认为 false,true 只做简单的查找子串的操作,false 表示使用正则模式匹配。

5、if-else

条件表达式结果可以是任何值,Lua认为false和nil为假,true和非nil为真。

整体的if-else结构和我们使用的高级语言(Java、GO)类似,区别在于:LUA中的if()表达式满足之后想要做一些其余逻辑,需要紧跟then,并且流程控制以end

if(xxx) then
    print("xxx")
else if(xx) then
    print("xx")
else
   print("x")
end

Java 생태계/Redis에서 Lua 스크립트를 사용하는 방법

lua -v 명령을 사용하여 lua가 변경되었는지 확인하세요. 설치되었습니다.
1) 간단히

를 사용하여 다음 내용이 포함된 test.lua 파일을 만듭니다.

Java 생태학/Redis에서 Lua 스크립트를 사용하는 방법

실행 명령:

for var=exp1,exp2,exp3 do  
    <执行体>  
end

출력은 다음과 같습니다: Java 생태계/Redis에서 Lua 스크립트를 사용하는 방법

🎜Java 생태학/Redis에서 Lua 스크립트를 사용하는 방법🎜🎜2. Lua 구문 소개🎜🎜Lua는 대화형 프로그래밍과 스크립트 프로그래밍을 제공합니다.🎜
  • 🎜대화형 프로그래밍: 명령줄에 구문을 직접 입력하면 즉시 실행하여 실행 효과를 확인할 수 있습니다. 🎜
  • 🎜스크립팅은 프로그래밍입니다. 스크립트 파일을 작성한 다음 실행합니다. 🎜
  • 🎜1. 댓글🎜🎜lua는 한 줄 주석과 여러 줄 주석이라는 두 가지 주석 방법을 제공합니다.🎜🎜1) 한 줄 주석🎜🎜두 개의 빼기 기호를 사용하세요.🎜🎜 --🎜🎜2) 여러 줄 주석🎜<pre class='brush:php;toolbar:false;'>--打印数组a的所有值 a = {&quot;one&quot;, &quot;two&quot;, &quot;three&quot;} for i, v in ipairs(a) do print(i, v) end</pre>🎜2. 키워드🎜🎜다음은 Lua의 예약어입니다. 예약어는 Java와 마찬가지로 상수나 변수로 사용할 수 없습니다. 🎜🎜<img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/887/227/168571687129252.png?x-oss-process=image/resize,p_40" class="lazy" alt="Java 생태학/Redis에서 Lua 스크립트를 사용하는 방법">🎜🎜3 . 변수 🎜🎜기본적으로 변수 정의는 전역 변수이며, 지역 변수를 사용하려면 <code>local로 선언해야 합니다. 🎜🎜1) 전역 변수는 🎜🎜전역 변수입니다. 선언할 필요는 없으며 변수를 제공합니다. 이 전역 변수는 할당 후에 생성됩니다. 🎜🎜초기화되지 않은 전역 변수에 액세스할 때 오류는 발생하지 않지만 결과는 다음과 같습니다: nil🎜🎜Java Ecology/Redis에서 Lua 스크립트를 사용하는 방법🎜🎜변수가 nil에 할당되어 있는 한 전역 변수는 삭제될 수 있습니다. 즉, 변수가 nil인 경우에만 해당 변수가 존재하지 않습니다. 🎜🎜Java 생태학/Redis에서 Lua 스크립트를 사용하는 방법🎜🎜🎜 게다가 일반적으로 밑줄로 시작하고 그 뒤에 대문자 문자열(예: _VERSION)이 오는 이름은 Lua 내부 전역 변수용으로 예약되어 있습니다. 🎜🎜🎜2) 지역 변수🎜
    while(condition)
    do
       statements
    end
    🎜4. 데이터 유형🎜🎜Lua는 동적 유형 언어입니다. 변수는 유형을 지정할 필요가 없으며 변수에만 값을 할당하면 됩니다. 값은 변수에 저장되거나 인수로 전달되거나 결과로 반환될 수 있습니다. 🎜🎜Lua에는 nil, boolean, number, string, userdata, function, thread 및 table의 8가지 기본 유형이 있습니다. 🎜🎜Java 생태학/Redis에서 Lua 스크립트를 사용하는 방법🎜🎜1 ) Lua 배열🎜🎜Lua 배열에서는 인덱스 값이 1부터 시작하며 0부터 시작하도록 지정할 수 있습니다. 🎜🎜Java Ecology/Redis에서 Lua 스크립트를 사용하는 방법🎜🎜2 ) 문자열 작업 🎜
    • 🎜.. 두 문자열 연결 🎜
    • 🎜string.sub () 는 문자열을 가로채는 데 사용됩니다. 🎜
    --[[ 函数返回两个值的最大值 --]]
    function max(num1, num2)
       if (num1 > num2) then
          result = num1;
       else
          result = num2;
       end
       return result; 
    end
    -- 调用函数
    print("两值比较最大值为 ",max(10,4))
    print("两值比较最大值为 ",max(5,6))
    • 🎜s: 가로채는 문자열 🎜
    • 🎜i: 차단 시작 위치; 🎜
    • 🎜j: 차단 끝 위치, 기본값은 -1, 마지막 문자 🎜
    🎜string. )는 문자열 검색에 사용됩니다🎜
    <dependency>
        <groupId>org.luaj</groupId>
        <artifactId>luaj-jse</artifactId>
        <version>3.0.1</version>
    </dependency>
    • 🎜지정된 대상 문자열 str에서 지정된 내용 substr을 검색합니다. 일치하는 부분 문자열이 발견되면 시작 부분 하위 문자열의 인덱스와 끝 인덱스가 반환됩니다. 존재하지 않으면 nil이 반환됩니다. 🎜
    • 🎜init는 검색 시작 위치를 지정합니다. 기본값은 1입니다. 음수일 수 있으며 뒤에서 앞으로 세는 문자 수를 나타냅니다. 🎜
    • 🎜plain은 단순 모드를 사용할지 여부를 나타내며, 기본값은 false이고, true는 하위 문자열에 대한 단순 검색만 ​​수행하고, false는 일반 패턴 일치를 사용함을 나타냅니다. 🎜
    🎜5. if-else🎜🎜 조건식의 결과는 어떤 값이든 가능합니다. Lua는 false와 nil을 false로 간주하고 true와 non-nil을 true로 간주합니다. 🎜🎜전체 if-else 구조는 우리가 사용하는 고급 언어(Java, GO)와 유사합니다. 차이점은 LUA의 if() 표현식이 만족된 후에 다른 논리를 수행하려는 경우 then을 따라야 하며 흐름 제어는 end로 끝납니다. 🎜
    package com.saint.base.lua;
    
    import org.luaj.vm2.Globals;
    import org.luaj.vm2.LuaValue;
    import org.luaj.vm2.lib.jse.JsePlatform;
    
    public class LuaString {
        public static void main(String[] args) {
            String luaStr = "print &#39;Saint is best man&#39;";
            Globals globals = JsePlatform.standardGlobals();
            LuaValue luaValue = globals.load(luaStr);
            luaValue.call();
        }
    }
    🎜6. 루프🎜🎜1) for 루프🎜🎜Lua 프로그래밍 언어에는 두 가지 주요 범주가 있습니다: 배열 for 루프와 일반 for 루프🎜🎜1> 배열 for 루프🎜🎜🎜문법 형식: 🎜🎜
    package com.saint.base.lua;
    
    import org.luaj.vm2.Globals;
    import org.luaj.vm2.LuaValue;
    import org.luaj.vm2.lib.jse.JsePlatform;
    
    import java.io.FileNotFoundException;
    
    public class LuaFile {
        public static void main(String[] args) throws FileNotFoundException {
            // lua脚本的文件路径
            String luaPath = "/xxxx/javaTest.lua";
            Globals globals = JsePlatform.standardGlobals();
            //加载脚本文件login.lua,并编译
            globals.loadfile(luaPath).call();
            LuaValue func1 = globals.get(LuaValue.valueOf("print1"));
            func1.call();
    
            LuaValue func2 = globals.get(LuaValue.valueOf("print2"));
            String luaResp = func2.call(LuaValue.valueOf("saint-input-param")).toString();
            System.out.println("lua file return is : " + luaResp);
        }
    }
    🎜 var는 exp1에서 exp2로 변경됩니다. 각 변경은 단계 크기로 exp3을 사용하여 var를 증가시키고 "실행 본문"을 한 번 실행합니다. exp3은 선택 사항이며 지정하지 않은 경우 기본값은 1입니다. 🎜🎜🎜🎜

    2> 泛型for循环

    通过一个迭代器函数来遍历所有值,类似 java 中的 foreach 语句;

    语法格式:

    --打印数组a的所有值  
    a = {"one", "two", "three"}
    for i, v in ipairs(a) do
        print(i, v)
    end
    • i 是数组索引值,v 是对应索引的数组元素值。

    • ipairs是Lua提供的一个迭代器函数,用来迭代数组。

    Java 생태계/Redis에서 Lua 스크립트를 사용하는 방법

    2)while循环

    while 循环语句在判断条件为 true 时会重复执行循环体语句。

    语法格式:

    while(condition)
    do
       statements
    end
    • statements(循环体语句) 可以是一条或多条语句,condition(条件) 可以是任意表达式;

    • 在 condition(条件) 为 true 时执行循环体语句。

    Java 생태계/Redis에서 Lua 스크립트를 사용하는 방법

    3)break提前退出循环

    和Java中的break一个作用,用于退出当前循环或语句;

    7、函数

    在Lua中,函数是对语句和表达式进行抽象的主要方法。类似于Java中的方法。

    Lua 函数主要有两种用途:

    • 完成指定的任务,这种情况下函数作为调用语句使用;

    • 计算并返回值,这种情况下函数作为赋值语句的表达式使用;

    函数的编写方式如下:

    --[[ 函数返回两个值的最大值 --]]
    function max(num1, num2)
       if (num1 > num2) then
          result = num1;
       else
          result = num2;
       end
       return result; 
    end
    -- 调用函数
    print("两值比较最大值为 ",max(10,4))
    print("两值比较最大值为 ",max(5,6))

    Java 생태계/Redis에서 Lua 스크립트를 사용하는 방법

    三、Java中执行Lua脚本

    Java中执行Lua脚本有两种方式:字符串的方式、文件的方式;

    Java中想要执行LUA脚本,首先需要在pom中引入相关依赖:

    <dependency>
        <groupId>org.luaj</groupId>
        <artifactId>luaj-jse</artifactId>
        <version>3.0.1</version>
    </dependency>

    1、字符串方式

    对于简单的lua脚本,可以直接用java字符串写;

    package com.saint.base.lua;
    
    import org.luaj.vm2.Globals;
    import org.luaj.vm2.LuaValue;
    import org.luaj.vm2.lib.jse.JsePlatform;
    
    public class LuaString {
        public static void main(String[] args) {
            String luaStr = "print &#39;Saint is best man&#39;";
            Globals globals = JsePlatform.standardGlobals();
            LuaValue luaValue = globals.load(luaStr);
            luaValue.call();
        }
    }

    控制台输出:

    Java 생태계/Redis에서 Lua 스크립트를 사용하는 방법

    2、文件方式

    对于一些比较常用的、复杂的脚本可以选择存放在文件中,在Java中再调用lua文件;

    package com.saint.base.lua;
    
    import org.luaj.vm2.Globals;
    import org.luaj.vm2.LuaValue;
    import org.luaj.vm2.lib.jse.JsePlatform;
    
    import java.io.FileNotFoundException;
    
    public class LuaFile {
        public static void main(String[] args) throws FileNotFoundException {
            // lua脚本的文件路径
            String luaPath = "/xxxx/javaTest.lua";
            Globals globals = JsePlatform.standardGlobals();
            //加载脚本文件login.lua,并编译
            globals.loadfile(luaPath).call();
            LuaValue func1 = globals.get(LuaValue.valueOf("print1"));
            func1.call();
    
            LuaValue func2 = globals.get(LuaValue.valueOf("print2"));
            String luaResp = func2.call(LuaValue.valueOf("saint-input-param")).toString();
            System.out.println("lua file return is : " + luaResp);
        }
    }

    lua脚本文件:

    Java 생태계/Redis에서 Lua 스크립트를 사용하는 방법

    控制台输出:

    Java 생태계/Redis에서 Lua 스크립트를 사용하는 방법

    3、Luaj概述

    Luaj在包装执行具体的Lua代码时, 有三种不同的模式;

    • 纯脚本解析执行(不选用任何Compiler)

    • To Lua字节码(LuaC, lua-to-lua-bytecode compiler)(默认选用)

    • To Java字节码(LuaJC, lua-to-java-bytecode compiler)

    Luaj中的Globals对象不是线程安全的, 因此最佳实践是每个线程一个Globals对象。

    事实上, 可以采用ThreadLocal的方式来存储该对象。

    2)性能问题

    Lua脚本在JAVA中运行,相比于直接运行Java代码会慢很多,大约1000倍。

    四、Redis + Lua(EVAL命令)

    在使用Redisson、Jedis+Lua时,我们可以通过redis客户端集成的、手写的LUA脚本来保证一系列命令在Redis中可以"原子执行"。

    在redis执行lua脚本时,相当于一个redis级别的锁,不能执行其他操作,类似于原子操作,这也是redisson实现的一个关键点。

    比如Redisson中的lua脚本:

    Java 생태계/Redis에서 Lua 스크립트를 사용하는 방법

    Redisson如何实现分布式锁,可以看文章:https://www.yisu.com/article/277312.htm

    lua脚本中有如下几个概念:

    • redis.call():执行redis命令。

    • KEYS[n]:指脚本中第n个参数,比如KEYS[1]指脚本中的第一个参数。

    • ARGV[n]:指脚本中第n个参数的值,比如ARGV[1]指脚本中的第一个参数的值。

    • 返回值中nil与false同一个意思。

    1、EVAL命令

    redis2.6.0版本起 采用内置的Lua解释器 通过EVAL命令去执行脚本;

    redis中的EVAL命令可以用于执行一段lua代码。命令格式如下:

    Java 생태계/Redis에서 Lua 스크립트를 사용하는 방법

    • 第一个参数script:表示lua脚本的内容;

    • 第二参数numkeys:表示有多少个键值对。

    • 其余参数:先把numkeys个key列出来,再把numkeys个arg列出来。

    Lua脚本中可以使用2个函数调用redis命令;

    • redis.call()

    • redis.pcall()

    redis.call()与redis.pcall()相似,二者唯一不同之处:

    • 如果执行的redis命令执行失败,redis.call()将产生一个Lua error,从而迫使EVAL命令返回一个错误给命令的调用者;

    • 然而redis.pcall()将会捕捉这个错误,并返回代表这个错误的Lua表。

    有那么一段逻辑;

    • 如果Redis某个key的整数值 和 某个value相等,则将key对应的整数值 + 1000;否则将key的值设置为9999;

    lua脚本执行命令如下:

    EVAL "if redis.call(&#39;get&#39;, KEYS[1]) == ARGV[1] then return redis.call(&#39;INCRBY&#39;, KEYS[1], 1000); else redis.call(&#39;set&#39;, KEYS[1], 9999); return nil; end;" 1 test 100

    根据test值的不同,不同的执行结果如下:

    Java 생태계/Redis에서 Lua 스크립트를 사용하는 방법

    위 내용은 Java 생태계/Redis에서 Lua 스크립트를 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명
    이 기사는 亿速云에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제
    Redis : 기능과 기능을 탐색합니다Redis : 기능과 기능을 탐색합니다Apr 19, 2025 am 12:04 AM

    Redis는 고속, 다양성 및 풍부한 데이터 구조로 인해 두드러집니다. 1) Redis는 문자열, 목록, 컬렉션, 해시 및 주문 컬렉션과 같은 데이터 구조를 지원합니다. 2) 메모리를 통해 데이터를 저장하고 RDB 및 AOF 지속성을 지원합니다. 3) Redis 6.0에서 시작하여 멀티 스레드 I/O 작업이 도입되어 동시 동시성 시나리오에서 성능이 향상되었습니다.

    Redis는 SQL 또는 NOSQL 데이터베이스입니까? 대답이 설명되었습니다Redis는 SQL 또는 NOSQL 데이터베이스입니까? 대답이 설명되었습니다Apr 18, 2025 am 12:11 AM

    redisisclassifiedasanoSqldatabaseBecauseItuseSakey-valuedatamodelinsteadofThraditionalRelationalDatabasemodel.Itoffersspeedandflexibility, makingIdealforreal-timeApplicationsandcaching, butitmaynotbesuitableforscenariosrequiringstrictaintetaintetaintetaintetaintetaintetaintegry

    REDIS : 응용 프로그램 성능 및 확장 성 향상REDIS : 응용 프로그램 성능 및 확장 성 향상Apr 17, 2025 am 12:16 AM

    Redis는 데이터를 캐싱하여 분산 잠금 및 데이터 지속성을 구현하여 응용 프로그램 성능 및 확장 성을 향상시킵니다. 1) 캐시 데이터 : Redis를 사용하여 데이터 액세스 속도를 향상시키기 위해 자주 액세스하는 데이터를 캐시합니다. 2) 분산 잠금 : Redis를 사용하여 분산 된 잠금 장치를 구현하여 분산 환경에서 작동의 보안을 보장합니다. 3) 데이터 지속성 : 데이터 손실을 방지하기위한 RDB 및 AOF 메커니즘을 통한 데이터 보안을 보장합니다.

    Redis : 데이터 모델과 구조 탐색Redis : 데이터 모델과 구조 탐색Apr 16, 2025 am 12:09 AM

    Redis의 데이터 모델 및 구조에는 5 가지 주요 유형이 포함됩니다. 1. 문자열 : 텍스트 또는 이진 데이터를 저장하는 데 사용되며 원자 연산을 지원합니다. 2. 목록 : 정렬 된 요소 컬렉션, 대기열 및 스택에 적합합니다. 세트 : 세트 작동을 지원하는 비 순차 고유 요소 세트. 4. 순서 세트 (SortedSet) : 순위에 적합한 점수가있는 고유 한 요소 세트. 5. 해시 테이블 (HASH) : 객체를 저장하는 데 적합한 키 값 쌍 모음.

    REDIS : 데이터베이스 접근 방식을 분류합니다REDIS : 데이터베이스 접근 방식을 분류합니다Apr 15, 2025 am 12:06 AM

    Redis의 데이터베이스 방법에는 메모리 인 데이터베이스 및 키 값 저장소가 포함됩니다. 1) Redis는 메모리에 데이터를 저장하고 빠르게 읽고 쓰고 있습니다. 2) 키 값 쌍을 사용하여 데이터를 저장하고 캐시 및 NOSQL 데이터베이스에 적합한 목록, 컬렉션, 해시 테이블 및 주문 컬렉션과 같은 복잡한 데이터 구조를 지원합니다.

    왜 Redis를 사용합니까? 혜택과 장점왜 Redis를 사용합니까? 혜택과 장점Apr 14, 2025 am 12:07 AM

    Redis는 빠른 성능, 풍부한 데이터 구조, 고 가용성 및 확장 성, 지속성 기능 및 광범위한 생태계 지원을 제공하기 때문에 강력한 데이터베이스 솔루션입니다. 1) 매우 빠른 성능 : Redis의 데이터는 메모리에 저장되며 동시성이 높고 대기 시간이 낮은 응용 프로그램에 적합한 빠른 읽기 및 쓰기 속도를 가지고 있습니다. 2) 풍부한 데이터 구조 : 다양한 시나리오에 적합한 목록, 컬렉션 등과 같은 여러 데이터 유형을 지원합니다. 3) 고 가용성 및 확장 성 : 마스터 슬레이브 복제 및 클러스터 모드를 지원하여 고 가용성 및 수평 확장 성을 달성합니다. 4) 지속성 및 데이터 보안 : 데이터 지속성은 RDB 및 AOF를 통해 달성되어 데이터 무결성 및 신뢰성을 보장합니다. 5) 광범위한 생태계 및 지역 사회 지원 : 거대한 생태계와 활동적인 커뮤니티,

    NOSQL 이해 : Redis의 주요 기능NOSQL 이해 : Redis의 주요 기능Apr 13, 2025 am 12:17 AM

    Redis의 주요 기능에는 속도, 유연성 및 풍부한 데이터 구조 지원이 포함됩니다. 1) 속도 : Redis는 메모리 내 데이터베이스이며, 읽기 및 쓰기 작업은 거의 순간적이며 캐시 및 세션 관리에 적합합니다. 2) 유연성 : 복잡한 데이터 처리에 적합한 문자열, 목록, 컬렉션 등과 같은 여러 데이터 구조를 지원합니다. 3) 데이터 구조 지원 : 다양한 비즈니스 요구에 적합한 문자열, 목록, 컬렉션, 해시 테이블 등을 제공합니다.

    REDIS : 기본 기능을 식별합니다REDIS : 기본 기능을 식별합니다Apr 12, 2025 am 12:01 AM

    Redis의 핵심 기능은 고성능 인 메모리 데이터 저장 및 처리 시스템입니다. 1) 고속 데이터 액세스 : Redis는 메모리에 데이터를 저장하고 마이크로 초 수준 읽기 및 쓰기 속도를 제공합니다. 2) 풍부한 데이터 구조 : 문자열, 목록, 컬렉션 등을 지원하며 다양한 응용 프로그램 시나리오에 적응합니다. 3) 지속성 : RDB 및 AOF를 통해 디스크에 데이터를 지속하십시오. 4) 구독 게시 : 메시지 대기열 또는 실시간 통신 시스템에서 사용할 수 있습니다.

    See all articles

    핫 AI 도구

    Undresser.AI Undress

    Undresser.AI Undress

    사실적인 누드 사진을 만들기 위한 AI 기반 앱

    AI Clothes Remover

    AI Clothes Remover

    사진에서 옷을 제거하는 온라인 AI 도구입니다.

    Undress AI Tool

    Undress AI Tool

    무료로 이미지를 벗다

    Clothoff.io

    Clothoff.io

    AI 옷 제거제

    AI Hentai Generator

    AI Hentai Generator

    AI Hentai를 무료로 생성하십시오.

    뜨거운 도구

    mPDF

    mPDF

    mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

    SublimeText3 영어 버전

    SublimeText3 영어 버전

    권장 사항: Win 버전, 코드 프롬프트 지원!

    SublimeText3 중국어 버전

    SublimeText3 중국어 버전

    중국어 버전, 사용하기 매우 쉽습니다.

    Dreamweaver Mac版

    Dreamweaver Mac版

    시각적 웹 개발 도구

    VSCode Windows 64비트 다운로드

    VSCode Windows 64비트 다운로드

    Microsoft에서 출시한 강력한 무료 IDE 편집기