Jedis 使用教程总结

news2024/12/25 12:58:30

一、Redis 常用命令

1 连接操作命令

  • quit:关闭连接(connection)
  • auth:简单密码认证
  • help cmd: 查看 cmd 帮助,例如:help quit

2 持久化

  • save:将数据同步保存到磁盘
  • bgsave:将数据异步保存到磁盘
  • lastsave:返回上次成功将数据保存到磁盘的 Unix 时戳
  • shutdown:将数据同步保存到磁盘,然后关闭服务

3 远程服务控制

  • info:提供服务器的信息和统计
  • monitor:实时转储收到的请求
  • slaveof:改变复制策略设置
  • config:在运行时配置 Redis 服务器

4 对 key 操作的命令

  • exists(key):确认一个 key 是否存在
  • del(key):删除一个 key
  • type(key):返回值的类型
  • keys(pattern):返回满足给定 pattern 的所有 key
  • randomkey:随机返回 key 空间的一个
  • keyrename(oldname, newname):重命名 key
  • dbsize:返回当前数据库中 key 的数目
  • expire:设定一个 key 的活动时间(s)
  • ttl:获得一个 key 的活动时间
  • select(index):按索引查询
  • move(key, dbindex):移动当前数据库中的 key 到 dbindex 数据库
  • flushdb:删除当前选择数据库中的所有 key
  • flushall:删除所有数据库中的所有 key

5 String

  • set(key, value):给数据库中名称为 key 的 string 赋予值 value
  • get(key):返回数据库中名称为 key 的 string 的 value
  • getset(key, value):给名称为 key 的 string 赋予上一次的 value
  • mget(key1, key2,…, key N):返回库中多个 string 的 value
  • setnx(key, value):添加 string,名称为 key,值为 value
  • setex(key, time, value):向库中添加 string,设定过期时间 time
  • mset(key N, value N):批量设置多个 string 的值
  • msetnx(key N, value N):如果所有名称为 key i 的 string 都不存在
  • incr(key):名称为 key 的 string 增 1 操作
  • incrby(key, integer):名称为 key 的 string 增加 integer
  • decr(key):名称为 key 的 string 减 1 操作
  • decrby(key, integer):名称为 key 的 string 减少 integer
  • append(key, value):名称为 key 的 string 的值附加 value
  • substr(key, start, end):返回名称为 key 的 string 的 value 的子串

6 List

  • rpush(key, value):在名称为 key 的 list 尾添加一个值为 value 的元素
  • lpush(key, value):在名称为 key 的 list 头添加一个值为 value 的 元素
  • llen(key):返回名称为 key 的 list 的长度
  • lrange(key, start, end):返回名称为 key 的 list 中 start 至 end 之间的元素
  • ltrim(key, start, end):截取名称为 key 的 list
  • lindex(key, index):返回名称为 key 的 list 中 index 位置的元素
  • lset(key, index, value):给名称为 key 的 list 中 index 位置的元素赋值
  • lrem(key, count, value):删除 count 个 key 的 list 中值为 value 的元素
  • lpop(key):返回并删除名称为 key 的 list 中的首元素
  • rpop(key):返回并删除名称为 key 的 list 中的尾元素
  • blpop(key1, key2,… key N, timeout):lpop 命令的 block 版本。
  • brpop(key1, key2,… key N, timeout):rpop 的 block 版本。
  • rpoplpush(srckey, dstkey):返回并删除名称为 srckey 的 list 的尾元素,并将该元素添加到名称为 dstkey 的 list 的头部

7 Set

  • sadd(key, member):向名称为 key 的 set 中添加元素 member
  • srem(key, member) :删除名称为 key 的 set 中的元素 member
  • spop(key) :随机返回并删除名称为 key 的 set 中一个元素
  • smove(srckey, dstkey, member) :移到集合元素
  • scard(key) :返回名称为 key 的 set 的基数
  • sismember(key, member) :member 是否是名称为 key 的 set 的元素
  • sinter(key1, key2,…key N) :求交集
  • sinterstore(dstkey, (keys)) :求交集并将交集保存到 dstkey 的集合
  • sunion(key1, (keys)) :求并集
  • sunionstore(dstkey, (keys)) :求并集并将并集保存到 dstkey 的集合
  • sdiff(key1, (keys)) :求差集
  • sdiffstore(dstkey, (keys)) :求差集并将差集保存到 dstkey 的集合
  • smembers(key) :返回名称为 key 的 set 的所有元素
  • srandmember(key) :随机返回名称为 key 的 set 的一个元素

8 Hash

  • hset(key, field, value):向名称为 key 的 hash 中添加元素 field
  • hget(key, field):返回名称为 key 的 hash 中 field 对应的 value
  • hmget(key, (fields)):返回名称为 key 的 hash 中 field i 对应的 value
  • hmset(key, (fields)):向名称为 key 的 hash 中添加元素 field
  • hincrby(key, field, integer):将名称为 key 的 hash 中 field 的 value 增加 integer
  • hexists(key, field):名称为 key 的 hash 中是否存在键为 field 的域
  • hdel(key, field):删除名称为 key 的 hash 中键为 field 的域
  • hlen(key):返回名称为 key 的 hash 中元素个数
  • hkeys(key):返回名称为 key 的 hash 中所有键
  • hvals(key):返回名称为 key 的 hash 中所有键对应的 value
  • hgetall(key):返回名称为 key 的 hash 中所有的键(field)及其对应的 value

键操作:

字符串操作:

整数和浮点数操作:

列表(List)操作:

集合(Set)操作:

哈希(Hash)操作:

有序集合(Zsort)操作:

排序操作:

二、相关实例

本例子使用 maven,需要添加如下依赖:

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.6.0</version> 
</dependency>

以下只是对数据的一些基本操作。

1、获取 Jedis 操作对象:

Jedis jedis;

@Before
public void connectionTest() {
    jedis = new Jedis("127.0.0.1", 6379);//redis的地址以及连接端口

    //开启密码验证(配置文件中为 requirepass helloworld)的时候需要执行该方法7
    //jedis.auth("helloworld");
}

2、Jedis 对 key 的操作:

@Test
public void keyTest() throws UnsupportedEncodingException {
    System.out.println(jedis.flushDB());// 清空数据
    System.out.println(jedis.echo("hello"));

    // 判断key否存在
    System.out.println(jedis.exists("foo"));

    jedis.set("key", "values");
    jedis.set("key2", "values");
    System.out.println(jedis.exists("key"));// 判断是否存在

    // 如果数据库没有任何key,返回nil,否则返回数据库中一个随机的key。
    String randomKey = jedis.randomKey();
    System.out.println("randomKey: " + randomKey);

    // 设置60秒后该key过期
    jedis.expire("key", 60);

    // key有效毫秒数
    System.out.println(jedis.pttl("key"));

    // 移除key的过期时间
    jedis.persist("key");

    // 获取key的类型, "string", "list", "set". "none" none表示key不存在
    System.out.println("type: " + jedis.type("key"));

    // 导出key的值
    byte[] bytes = jedis.dump("key");
    System.out.println(new String(bytes));

    // 将key重命名
    jedis.renamenx("key", "keytest");
    //判断是否存在
    System.out.println("key是否存在: " + jedis.exists("key"));
    //判断是否存在
    System.out.println("keytest是否存在: " + jedis.exists("keytest"));

    // 查询匹配的key
    // KEYS * 匹配数据库中所有 key 。
    // KEYS h?llo 匹配 hello , hallo 和 hxllo 等。
    // KEYS h*llo 匹配 hllo 和 heeeeello 等。
    // KEYS h[ae]llo 匹配 hello 和 hallo ,但不匹配 hillo 。
    // 特殊符号用 \ 隔开。
    Set<String> set = jedis.keys("k*");
    System.out.println(set);

    // 删除key
    jedis.del("key");
    System.out.println(jedis.exists("key"));
}

3、Jedis 对字符串 (String) 的相关操作:

@Test
public void stringTest() {
    jedis.set("hello", "hello");
    System.out.println(jedis.get("hello"));

    // 使用append 向字符串后面添加
    jedis.append("hello", " world");
    System.out.println(jedis.get("hello"));

    // set覆盖字符串
    jedis.set("hello", "123");
    System.out.println(jedis.get("hello"));

    // 设置过期时间
    jedis.setex("hello2", 2, "world2");
    System.out.println(jedis.get("hello2"));
    try {
        Thread.sleep(3000);
    } catch (InterruptedException e) {
    }
    System.out.println(jedis.get("hello2"));

    // 一次添加多个key-value对
    jedis.mset("a", "1", "b", "2");
    // 获取a和b的value
    List<String> valus = jedis.mget("a", "b");
    System.out.println(valus);

    // 批量删除
    jedis.del("a", "b");
    System.out.println(jedis.exists("a"));
    System.out.println(jedis.exists("b"));
}

4、Jedis 对链表 (Lists) 的操作:

@Test
public void listTest() {
    String key = "mylist";
    jedis.del(key);

    // 队列添加元素
    jedis.rpush(key, "aaaa");
    jedis.rpush(key, "aaaa");
    jedis.rpush(key, "bbbb");
    jedis.rpush(key, "cccc");
    jedis.rpush(key, "cccc");

    // 队列长度
    System.out.println("lenth: " + jedis.llen(key));

    // 打印队列,从索引0开始,到倒数第1个(全部元素)
    System.out.println("all elements: " + jedis.lrange(key, 0, -1));

    // 索引为1的元素
    System.out.println("index of 1: " + jedis.lindex(key, 1));

    // 设置队列里面一个元素的值,当index超出范围时会返回一个error。
    jedis.lset(key, 1, "aa22");
    System.out.println("index of 1: " + jedis.lindex(key, 1));

    // 从队列的右边入队一个元素
    jedis.rpush(key, "-2", "-1");// 先-2,后-1入队列
    System.out.println("all elements: " + jedis.lrange(key, 0, -1));

    // 从队列的左边入队一个或多个元素
    jedis.lpush(key, "second element", "first element");// 先second
    // element,后first
    // elementF入队列
    System.out.println("all elements: " + jedis.lrange(key, 0, -1));

    // 从队列的右边出队一个元素
    System.out.println(jedis.rpop(key));
    // 从队列的左边出队一个元素
    System.out.println(jedis.lpop(key));
    System.out.println("all elements: " + jedis.lrange(key, 0, -1));

    // count > 0: 从头往尾移除值为 value 的元素,count为移除的个数。
    // count < 0: 从尾往头移除值为 value 的元素,count为移除的个数。
    // count = 0: 移除所有值为 value 的元素。
    jedis.lrem(key, 1, "cccc");
    System.out.println("all elements: " + jedis.lrange(key, 0, -1));

    //即最右边的那个元素也会被包含在内,如果start比list的尾部下标大的时候,
    //会返回一个空列表。
    //如果stop比list的实际尾部大的时候,Redis会当它是最后一个元素的下标。
    System.out.println(jedis.lrange(key, 0, 2));
    System.out.println("all elements: " + jedis.lrange(key, 0, -1));

    // 删除区间以外的元素
    System.out.println(jedis.ltrim(key, 0, 2));
    System.out.println("all elements: " + jedis.lrange(key, 0, -1));
}

5、Jedis 对集合 (Sets) 的操作:

@Test
public void testSet() {
    // 清空数据
    System.out.println(jedis.flushDB());
    String key = "myset";
    String key2 = "myset2";

    // 集合添加元素
    jedis.sadd(key, "aaa", "bbb", "ccc");
    jedis.sadd(key2, "bbb", "ccc", "ddd");

    // 获取集合里面的元素数量
    System.out.println(jedis.scard(key));

    // 获得两个集合的交集,并存储在一个关键的结果集
    jedis.sinterstore("destination", key, key2);
    System.out.println(jedis.smembers("destination"));

    // 获得两个集合的并集,并存储在一个关键的结果集
    jedis.sunionstore("destination", key, key2);
    System.out.println(jedis.smembers("destination"));

    // key集合中,key2集合没有的元素,并存储在一个关键的结果集
    jedis.sdiffstore("destination", key, key2);
    System.out.println(jedis.smembers("destination"));

    // 确定某个元素是一个集合的成员
    System.out.println(jedis.sismember(key, "aaa"));

    // 从key集合里面随机获取一个元素
    System.out.println(jedis.srandmember(key));

    // aaa从key移动到key2集合
    jedis.smove(key, key2, "aaa");
    System.out.println(jedis.smembers(key));
    System.out.println(jedis.smembers(key2));

    // 删除并获取一个集合里面的元素
    System.out.println(jedis.spop(key));

    // 从集合里删除一个或多个元素
    jedis.srem(key2, "ccc", "ddd");
    System.out.println(jedis.smembers(key2));
}

6、Jedis 对有序集合 (Sorted Sets) 的操作:

@Test
public void testSortSet() {
    // 清空数据
    System.out.println(jedis.flushDB());
    String key = "mysortset";

    Map<String, Double> scoreMembers = new HashMap<String, Double>();
    scoreMembers.put("aaa", 1001.0);
    scoreMembers.put("bbb", 1002.0);
    scoreMembers.put("ccc", 1003.0);

    // 添加数据
    jedis.zadd(key, 1004.0, "ddd");
    jedis.zadd(key, scoreMembers);

    // 获取一个排序的集合中的成员数量
    System.out.println(jedis.zcard(key));

    //返回的成员在指定范围内的有序集合,以0表示有序集第一个成员,
    //以1表示有序集第二个成员,以此类推。
    //负数下标,以-1表示最后一个成员,-2表示倒数第二个成员。
    Set<String> coll = jedis.zrange(key, 0, -1);
    System.out.println(coll);

    // 返回的成员在指定范围内的逆序集合
    coll = jedis.zrevrange(key, 0, -1);
    System.out.println(coll);

    // 元素下标
    System.out.println(jedis.zscore(key, "bbb"));

    // 删除元素
    System.out.println(jedis.zrem(key, "aaa"));
    System.out.println(jedis.zrange(key, 0, -1));

    // 给定值范围内的成员数
    System.out.println(jedis.zcount(key, 1002.0, 1003.0));
}

7、Jedis 对哈希 (Hashs) 的操作:

@Test
public void testHash() {
    // 清空数据
    System.out.println(jedis.flushDB());
    String key = "myhash";
    Map<String, String> hash = new HashMap<String, String>();
    hash.put("aaa", "11");
    hash.put("bbb", "22");
    hash.put("ccc", "33");

    // 添加数据
    jedis.hmset(key, hash);
    jedis.hset(key, "ddd", "44");

    // 获取hash的所有元素(key值)
    System.out.println(jedis.hkeys(key));

    // 获取hash中所有的key对应的value值
    System.out.println(jedis.hvals(key));

    // 获取hash里所有元素的数量
    System.out.println(jedis.hlen(key));

    // 获取hash中全部的域和值,以Map<String, String> 的形式返回
    Map<String, String> elements = jedis.hgetAll(key);
    System.out.println(elements);

    // 判断给定key值是否存在于哈希集中
    System.out.println(jedis.hexists(key, "bbb"));

    // 获取hash里面指定字段对应的值
    System.out.println(jedis.hmget(key, "aaa", "bbb"));

    // 获取指定的值
    System.out.println(jedis.hget(key, "aaa"));

    // 删除指定的值
    System.out.println(jedis.hdel(key, "aaa"));
    System.out.println(jedis.hgetAll(key));

    // 为key中的域 field 的值加上增量 increment
    System.out.println(jedis.hincrBy(key, "bbb", 100));
    System.out.println(jedis.hgetAll(key));
}

8、Jedis 操作事务:

@Test
public void testTransaction() {
    Transaction t = jedis.multi();
    t.set("hello", "world");
    Response<String> response = t.get("hello");

    t.zadd("foo", 1, "barowitch");
    t.zadd("foo", 0, "barinsky");
    t.zadd("foo", 0, "barikoviev");
    //返回全部相应并以有序集合的方式返回
    Response<Set<String>> sose = t.zrange("foo", 0, -1);
    System.out.println(response);
    System.out.println(sose);
    t.exec(); // 此行注意,不能缺少

    String foolbar = response.get(); // Response.get() 可以从响应中获取数据

    int soseSize = sose.get().size(); // sose.get() 会立即调用set方法
    System.out.println(foolbar);
    System.out.println(sose.get());
}

9、Jedis 操作管道:

@Test
public void testTransactionPipeling() {
    Pipeline p = jedis.pipelined();//开一个管道

    p.set("fool", "bar");
    p.zadd("foo", 1, "barowitch");
    p.zadd("foo", 0, "barinsky");
    p.zadd("foo", 0, "barikoviev");
    Response<String> pipeString = p.get("fool");
    Response<Set<String>> sose = p.zrange("foo", 0, -1);
    System.out.println(pipeString);
    System.out.println(sose);

    p.sync();//提交

    System.out.println("==========");
    System.out.println(p.get("fool"));
    System.out.println(p.zrange("foo", 0, -1));

    int soseSize = sose.get().size();
    Set<String> setBack = sose.get();

    System.out.println(soseSize);
    System.out.println(setBack);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/43420.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

设计模式之原型模式

文章目录1.前言概念使用场景2.原型模式核心组成UML图3.浅拷贝与深拷贝基本类型与引用类型浅拷贝代码演示深拷贝代码演示4.原型模式的优点与缺点1.前言 概念 原型模式&#xff08;Prototype Pattern&#xff09;是用于创建重复的对象&#xff0c;同时又能保证性能。这种类型的…

Cpp知识点系列-类型转换

前言 在做题的时候发现了需要用到类型转换&#xff0c;于是在这里进行了简单的记录。 历史原因&#xff0c;慢慢整理着发现类型转换也能写老大一篇文章了。又花了时间来梳理一下就成了本文了。 cpp 之前使用的环境是DEV-C 5.4&#xff0c;而对应的GCC版本太低了。支持c11需要…

【CSS】重点知识梳理,这样上手无压力

推荐前端学习路线如下&#xff1a; HTML、CSS、JavaScript、noodJS、组件库、JQuery、前端框架&#xff08;Vue、React&#xff09;、微信小程序和uniapp、TypeScript、webpack 和 vite、Vue 和 React 码源、NextJS、React Native、后端内容。。。。。。 CSS定义&#xff1a; …

docker入门到精通一文搞定

文章目录前言一、Docker概述1.Docker为什么会出现&#xff1f;2.Docker相比VM技术3.Docker 能做什么&#xff1f;3.1 比较Docker和虚拟机技术的不同&#xff1a;3.2 DevOps (开发、运维)&#xff1a;4个特点二、Docker安装1.dokcer架构图&#xff1a;2.Docker基本组成&#xff…

python+django体质测试数据分析及可视化设计

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 B/S架构 4 本选题则旨在通过标签分类管理等方式&#xff0c;实现管理员&#xff1a;管理员&#xff1a;首页、个…

11.前端笔记-CSS盒子模型-外边距margin

1、margin 1.1 margin的语法 盒子与盒子之间的距离 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewpor…

linux 系统的磁盘 mbr 转gpt方法

linux磁盘用fdisk格式化挂盘的格式都为mbr, 不支持大于2T的磁盘扩容&#xff0c;需要用parted转化。 查询磁盘格式 输入&#xff1a; fdisk -l 看Disk label type 的值&#xff0c;是dos 的为mbr 是gpt的为gpt 当前&#xff0c;因挂盘时&#xff0c;用的fdisk方式选gpt,挂…

基于STM32的u8g2移植以及学习

实验硬件&#xff1a;STM32F103C8T6&#xff1b;0.96寸OLED&#xff08;12864&#xff09; U8g2库开源网址&#xff1a;https://github.com/olikraus/u8g2 一、u8g2库知识 1.1 什么是u8g2&#xff1f; U8g2是嵌入式设备的单色图形库。主要应用于嵌入式设备&#xff0c;包括我…

正大国际期货:投资外盘期货如何运用K线图中十字星形态?

很多人都明白&#xff0c;做外盘期货需要学会看线图。那么K线图上面的一根两根的柱子代表的什么意思呢&#xff1f;其中星星点点的十字星又是什么意思&#xff1f;下面正大IxxxuanI详细给大家讲解一下&#xff01; 1、什么是多头十字星形态&#xff1f; 多头十字星是一种经典…

KEITHLEY 吉时利2601B源表产品技术参数

KEITHLEY 2601B 吉时利 2601B 源表让您可以比以前更快、更轻松、更经济地进行精密直流、脉冲和低频交流源测量测试。Keithley 2601B 通过结合以下特性&#xff0c;为 IV 功能测试提供竞争产品 2 到 4 倍的测试速度&#xff1a; 吉时利的高速第三代源测量单元 (SMU) 设计 嵌…

【Python】八、函数的使用

文章目录实验目的一、定义函数二、调用函数三、参数的传递和函数的返回值四、编写函数&#xff0c;输入不同的参数&#xff0c;绘制不同的科赫曲线参考代码实验截图实验目的 掌握函数的定义和调用&#xff1b;掌握函数的用法&#xff1b;理解递归&#xff1b;培养学生动手查阅资…

开源:分享4个非常经典的CMS开源项目

❤️作者主页&#xff1a;IT技术分享社区 ❤️作者简介&#xff1a;大家好,我是IT技术分享社区的博主&#xff0c;从事C#、Java开发九年&#xff0c;对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉&#xff1a; 数据库领域优质创作者&#x1f3c6;&#x…

Spark系列之Spark安装部署

title: Spark系列 第二章 Spark安装部署 2.1 版本选择 下载地址&#xff1a; https://archive.apache.org/dist/spark 四大主要版本 Spark-0.X Spark-1.X&#xff08;主要Spark-1.3和Spark-1.6&#xff09; Spark-2.X&#xff08;最新Spark-2.4.8&#xff09; Spark-3.x&a…

降级、熔断和限流———一看就会

设定&#xff1a;A上游系统、B本系统、C下游系统 服务降级 服务降级是从整个系统B的负荷情况出发和考虑的&#xff0c;对某些负荷会比较高的情况&#xff0c;为了预防某些功能&#xff08;业务场景&#xff09;出现负荷过载或者响应慢的情况&#xff0c;在B其内部暂时舍弃对一…

【Mybatis编程:统计相册表中的数据的数量】

目录 1. 书写SQL语句 2.在AlbumMapper.java接口中添加抽象方法 3. 在AlbumMapper.xml中配置SQL语句 4. 在AlbumMapperTests.java中编写并执行测试 1. 书写SQL语句 需要执行的SQL语句大致是&#xff1a; select count(*) from pms_album 在设计抽象方法时&#xff0c;如果要…

【三维重建补充知识-0】视差、深度概念及其转换

一、基本概念 把手指放在眼前&#xff0c;分别闭上左、右眼&#xff0c;我们会发现手指与后边物体的相对位置是不同的&#xff0c;也即两眼所识别的两幅图像之间存在视觉差异&#xff0c;我们通过“视差”这一概念来表示这种差别。 该过程也可以通过两个处于同一平面的相机来模…

Ajax学习:Ajax请求基本操作

点击按钮&#xff0c;发送请求&#xff08;前端页面和服务端页面信息交流 但是不刷新页面&#xff09; 注意使用谷歌浏览器 服务器端打开&#xff1a;使用nodemon //1、导入express const expressrequire(express) //2、创建应用对象 创建web服务器 const appexpress() //3、…

软考高级系统架构师_计算机组成与结构02_高速缓存_磁盘结构_输入输出技术_总线结构_可靠性_---软考高级系统架构师005

1.Cache是Cpu与主存储器之间的速度比主存储器要块10倍左右,因为cpu用的说主存储器中的地址, 而cpu速度很快,主存储器速度慢,所以中间加了这个cache,那么这里就涉及到,怎么把cache地址转化成主存储器的地址,cpu使用地址的时候首先访问主存储器地址,但是访问的是cache,所以这个时…

第十二周学习总结 Progress Lack

关于计划的制定 FlowUs计划链接&#xff1a; 点击我进入计划 发现不足&#xff1a;首先&#xff0c;制定计划经验不足&#xff0c;制定计划应该是具体的、有任务量、完成时间。 其次任务应该是可衡量的&#xff08;比如&#xff0c;我阅读李升波老师的网站文章&#xff0c;应…

【WAX链游】发布一个免费开源的Alien Worlds【外星世界】合约脚本TLM

前言 《链游Farmers World【农民世界】爆火&#xff0c;发布一个免费开源的脚本》 在之前的文章中&#xff0c;我们分享了一个开源的农民世界(Farmers World)脚本 【OpenFarmer】&#xff1a;https://github.com/encoderlee/OpenFarmer 经过这段时间以来的不断学习&#xff…