2024.1.11 关于 Jedis 库操作 Redis 基本演示

news2024/11/16 5:34:25

目录

引言

通用命令

SET & GET

EXISTS & DEL

KEYS

EXPIRE & TTL

TYPE

String 类型命令

 MGET & MSET

GETRANGE & SETRANGE 

APPEND

INCR & DECR

List 类型命令

LPUSH & LRANG 

LPOP & LPOP

BLPOP & BRPOP

LLEN

Set 类型命令

SADD & SMEMBERS

SISMEMBERS

SCARD

SPOP

SINTER

SINTERSTORE

Hash 类型命令 

HSET & HGET

HEXISTS

HDEL

HKEYS & HVALS

HMGET & HMSET

 ZSet 类型命令

ZADD & ZRANGE

ZCARD

ZREM

ZSCORE

ZRANK


引言

  • Jedis 库的本质就是针对 Redis 的各种命令进行了封装
  • 调用某个方法就相当于在 Redis 客户端中敲下了对应的命令
  • 下文将介绍 Redis 命名在代码中的操作,但不会覆盖到所有的命令,只会挑一些比较重要的、代表性的命令

通用命令

SET & GET

public static void test1(Jedis jedis) {
        System.out.println("get 和 set 的使用");
//        先清空数据库,要避免上一组测试的残留数据影响到下一组测试的结果
        jedis.flushAll();

        jedis.set("key","111");
        jedis.set("key2","222");
//        通过创建 SetParams 的对象,给 set 命令设置参数和选项
        SetParams params = new SetParams();
        params.ex(10);
//        此处设置 XX 选项
//        表示只有当 key 存在时才设置,key 不存在时直接返回 nil
        params.xx();
//        注意此时 set 的 key 在上述代码中已经设置过了
        jedis.set("key","333",params);

        SetParams params2 = new SetParams();
        params2.ex(10);
        params2.xx();
//        注意此时 set 的 key4 并未在上述代码中设置过
        jedis.set("key4","444",params2);

        String value = jedis.get("key");
        System.out.println("此处预期 value = 333, 实际 value = " + value);

        String value4 = jedis.get("key4");
        System.out.println("此处预期 value4 = null, 实际 value4 = " + value4);
}

 运行结果:


EXISTS & DEL

public static void test2(Jedis jedis) {
        System.out.println("exists 和 del 的使用");
        jedis.flushAll();

        jedis.set("key","111");
        jedis.set("key2","222");
        jedis.set("key3","333");
//        判断 key 是否存在
        boolean result = jedis.exists("key");
        System.out.println("此处预期 result = ture, 实际 result = " + result);
//        在此处直接将 key 删除
        long result2 = jedis.del("key");
        System.out.println("此处预期 result2 = 1, 实际 result2 = " + result2);
//        重新判断 key 是否存在
        result = jedis.exists("key");
        System.out.println("此处预期 result = false, 实际 result =  " + result);
//        使用 del 方法删除多个 key (变长参数)
        result2 = jedis.del("key2","key3");
        System.out.println("此处预期 result2 = 2, 实际 result2 = " + result2);
}

运行结果:


KEYS

public static void test3(Jedis jedis) {
        System.out.println("keys 的使用");
        jedis.flushAll();

        jedis.set("key","111");
        jedis.set("key2","222");
        jedis.set("key3","333");
        jedis.set("key4","444");
//        使用 keys 方法直接获取到 redis 中所有键
        Set<String> keys = jedis.keys("*");
        System.out.println(keys);
}

运行结果:


EXPIRE & TTL

public static void test4(Jedis jedis) throws InterruptedException {
        System.out.println("expire 和 ttl 的使用");
        jedis.flushAll();

        jedis.set("key","111");
//        使用 expire 方法给 key 设置过期时间 10秒
        jedis.expire("key",10);
//        休眠 3秒,再继续执行代码
        Thread.sleep(3000);
//        使用 ttl 方法获取到 key 的过期时间
        long time = jedis.ttl("key");
        System.out.println("此处预期 time = 7, 实际 time =  " + time);
}

运行结果:


TYPE

public static void test5(Jedis jedis) throws InterruptedException {
        System.out.println("type 的使用");
        jedis.flushAll();

        jedis.set("key","111");
        String type = jedis.type("key");
        System.out.println("此处预期 type = sting , 实际 type =  " + type);

        jedis.lpush("key2","111","222","333");
        String type2 = jedis.type("key2");
        System.out.println("此处预期 type2 = list , 实际 type2 =  " + type2);

        jedis.hset("key3","f1","111");
        String type3 = jedis.type("key3");
        System.out.println("此处预期 type3 = hash , 实际 type3 =  " + type3);

        jedis.sadd("key4","111","222","333");
        String type4 = jedis.type("key4");
        System.out.println("此处预期 type4 = set , 实际 type4 =  " + type4);

        jedis.zadd("key5",10,"zhangsan");
        String type5 = jedis.type("key5");
        System.out.println("此处预期 type5 = zset , 实际 type5 =  " + type5);
}

运行结果:

String 类型命令

 MGET & MSET

public static void test1(Jedis jedis) {
        System.out.println("mget 和 mset 的使用");
        jedis.flushAll();

        jedis.mset("key1","111","key2","222","key3","333");
//        此处多个 key 得到的 value 的顺序都是和 key 匹配的
//        如果某个 key 在 redis 上不存在,对应的 value 使用 null 表示
        List<String> values = jedis.mget("key1","key2","key100","key3");
        System.out.println("values: " + values);
}

运行结果:


GETRANGE & SETRANGE 

public static void test2(Jedis jedis) {
        System.out.println("getrange 和 setrange 的使用");
        jedis.flushAll();

        jedis.set("key","abcdefghijk");
        String result = jedis.getrange("key",2,5);
        System.out.println("此处预期 result = cdef, 实际 result = " + result);

        jedis.setrange("key",2,"xyz");
        String value = jedis.get("key");
        System.out.println("此处预期 value = abxyzfghijk, 实际 value = " + value);
}

运行结果:


APPEND

public static void test3(Jedis jedis) {
        System.out.println("append 的使用");
        jedis.flushAll();

        jedis.set("key","abcdef");
        jedis.append("key","ghij");

        String value = jedis.get("key");
        System.out.println("此处预期 value = abcdefghij, 实际 value = " + value);
}

运行结果:


INCR & DECR

public static void test4(Jedis jedis) {
        System.out.println("incr 和 decr 的使用");
        jedis.flushAll();

        jedis.set("key","100");
        
        long result = jedis.incr("key");
        System.out.println("此处预期 result = 101, 实际 result = " + result);
        
        String value = jedis.get("key");
        System.out.println("此处预期 value = 101, 实际 value = " + value);

        result = jedis.decr("key");
        System.out.println("此处预期 result = 100, 实际 result = " + result);

        value = jedis.get("key");
        System.out.println("此处预期 value = 100, 实际 value = " + value);
}

运行结果:

List 类型命令

LPUSH & LRANG 

public static void test1(Jedis jedis) {
        System.out.println("lpush、rpush 和 lrange 的使用");
        jedis.flushAll();

        jedis.lpush("key","111","222","333");

        jedis.rpush("key2","111","222","333");

        List<String> result = jedis.lrange("key",0,-1);
        System.out.println("采用 lpush 的 result = " +result);

        List<String> result2 = jedis.lrange("key2",0,-1);
        System.out.println("采用 rpush 的 result = " + result2);
}

运行结果:


LPOP & LPOP

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

public class RedisDemoList {
    public static void test2(Jedis jedis) {
        System.out.println("lpop、rpop 的使用");
        jedis.flushAll();

        jedis.rpush("key","111","222","333");

        String result = jedis.lpop("key");
        System.out.println("采用 lpop 的预期 result = 111, 实际 result = " + result);

        result = jedis.rpop("key");
        System.out.println("采用 rpop 的预期 result = 333, 实际 result = " + result);
    }

    public static void main(String[] args) {
        JedisPool jedisPool = new JedisPool("tcp://127.0.0.1:8888");
        try (Jedis jedis = jedisPool.getResource()) {
            test2(jedis);
        }
    }
}

运行结果:


BLPOP & BRPOP

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

import java.util.List;

public class RedisDemoList {
    public static void test3(Jedis jedis) {
        System.out.println("blpop 的使用");
        jedis.flushAll();

//        返回结果是一个 "二元组" 有个是从哪个 key 对应的 list 中删除的,一个删除的元素是什么
        List<String> results = jedis.blpop(100,"key");
        System.out.println("results.get(0) = " + results.get(0));
        System.out.println("results.get(1) = " + results.get(1));
    }

    public static void main(String[] args) {
        JedisPool jedisPool = new JedisPool("tcp://127.0.0.1:8888");
        try (Jedis jedis = jedisPool.getResource()) {
            test3(jedis);
        }
    }
}

运行结果:


LLEN

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

public class RedisDemoList {
    public static void test4(Jedis jedis) {
        System.out.println("llen 的使用");
        jedis.flushAll();

        jedis.rpush("key","111","222","333");
        long len = jedis.llen("key");
        System.out.println("此处预期 len = 3, 实际 len = " + len);
    }

    public static void main(String[] args) {
        JedisPool jedisPool = new JedisPool("tcp://127.0.0.1:8888");
        try (Jedis jedis = jedisPool.getResource()) {
//            test3(jedis);
            test4(jedis);
        }
    }
}

运行结果:

Set 类型命令

SADD & SMEMBERS

public static void test1(Jedis jedis) {
        System.out.println("sadd 和 smembers 的使用");
        jedis.flushAll();

        jedis.sadd("key","111","222","333");
        Set<String> result = jedis.smembers("key");
        System.out.println("result: " + result);
}

运行结果:


SISMEMBERS

public static void test2(Jedis jedis) {
        System.out.println("sismembers 的使用");
        jedis.flushAll();

        jedis.sadd("key","111","222","333");
        boolean result = jedis.sismember("key","111");
        System.out.println("此处预期 result = true, 实际 result = " + result);
        result = jedis.sismember("key","100");
        System.out.println("此处预期 result = false, 实际 result = " + result);
}

运行结果:


SCARD

public static void test3(Jedis jedis) {
        System.out.println("scard 的使用");
        jedis.flushAll();

        jedis.sadd("key","111","222","333");
        long result = jedis.scard("key");
        System.out.println("此处预期 result = 3, 实际 result = " + result);
}

运行结果:


SPOP

public static void test4(Jedis jedis) {
        System.out.println("spop 的使用");
        jedis.flushAll();

        jedis.sadd("key","111","222","333","444","555");
        String result = jedis.spop("key");
        System.out.println("此处将随机删除一个元素, result = " + result);
}

运行结果:


SINTER

public static void test4(Jedis jedis) {
        System.out.println("spop 的使用");
        jedis.flushAll();

        jedis.sadd("key","111","222","333","444","555");
        String result = jedis.spop("key");
        System.out.println("此处将随机删除一个元素, result = " + result);
}

运行结果:


SINTERSTORE

public static void test6(Jedis jedis) {
        System.out.println("sinterstore 的使用");
        jedis.flushAll();

        jedis.sadd("key","111","222","333");
        jedis.sadd("key2","111","222","444");

        long len = jedis.sinterstore("key3","key","key2");
        System.out.println("此处预期 len = 2, 实际 len = " + len);

        Set<String> result = jedis.smembers("key3");
        System.out.println("result = " + result);
}

运行结果:

Hash 类型命令 

HSET & HGET

public static void test1(Jedis jedis) {
        System.out.println("hset 和 hget 的使用");
        jedis.flushAll();
//        一次性设置单个
        jedis.hset("key","f1","111");
//        一次性设置多个
        HashMap<String,String> fields = new HashMap<>();
        fields.put("f2","222");
        fields.put("f3","333");
        jedis.hset("key",fields);

        String result = jedis.hget("key","f1");
        System.out.println("此处预期 result = 111, 实际 result = " + result);

        result = jedis.hget("key","f100");
        System.out.println("此处预期 result = null, 实际 result = " + result);
}

运行结果:


HEXISTS

public static void test2(Jedis jedis) {
        System.out.println("hexists 的使用");
        jedis.flushAll();

        jedis.hset("key","f1","111");
        jedis.hset("key","f2","222");
        jedis.hset("key","f3","333");

        boolean result = jedis.hexists("key","f1");
        System.out.println("此处预期 result = ture, 实际 result = " + result);

        result = jedis.hexists("key","f100");
        System.out.println("此处预期 result = false, 实际 result = " + result);
}

运行结果:


HDEL

public static void test3(Jedis jedis) {
        System.out.println("hdel 的使用");
        jedis.flushAll();

        jedis.hset("key","f1","111");
        jedis.hset("key","f2","222");
        jedis.hset("key","f3","333");

        long result = jedis.hdel("key","f1","f2");
        System.out.println("此处预期 result = 1, 实际 result = " + result);

        boolean exists = jedis.hexists("key","f1");
        System.out.println("此处预期 exists = false, 实际 exists = " + exists);
        exists = jedis.hexists("key","f2");
        System.out.println("此处预期 exists = false, 实际 exists = " + exists);
}

运行结果:


HKEYS & HVALS

public static void test4(Jedis jedis) {
        System.out.println("hkeys 和 hvals 的使用");
        jedis.flushAll();

        jedis.hset("key","f1","111");
        jedis.hset("key","f2","111");
        jedis.hset("key","f3","333");

        Set<String> fields = jedis.hkeys("key");
        System.out.println("fields = " + fields);

        List<String> vals = jedis.hvals("key");
        System.out.println("vals = " + vals);
}

运行结果:


HMGET & HMSET

public static void test5(Jedis jedis) {
        System.out.println("hmget 和 hmset 的使用");
        jedis.flushAll();

        HashMap<String,String> map = new HashMap<>();
        map.put("f1","111");
        map.put("f2","222");
        map.put("f3","333");
        jedis.hmset("key",map);

        List<String> vals = jedis.hmget("key","f3","f1","f2");
//        此时返回元素的顺序一定为 我们自己所指定 field 的先后顺序
        System.out.println("此处预期 vals = [333,111,222], 实际 vals = " + vals);
}

运行结果:

 ZSet 类型命令

ZADD & ZRANGE

public static void test1(Jedis jedis) {
        System.out.println("zadd 和 zrange 的使用");
        jedis.flushAll();

        jedis.zadd("key",10,"zhangsan");
        Map<String,Double> map = new HashMap<>();
        map.put("lisi",20.0);
        map.put("wangwu",30.0);
        jedis.zadd("key",map);

        List<String> members = jedis.zrange("key",0,-1);
        System.out.println("members = " + members);

        List<Tuple> membersWithScore = jedis.zrangeWithScores("key",0,-1);
        System.out.println("membersWithScore = " + membersWithScore);

        String member = membersWithScore.get(0).getElement();
        double score = membersWithScore.get(0).getScore();
        System.out.println("member = " + member + ", score" + score);
}

运行结果:


ZCARD

public static void test2(Jedis jedis) {
        System.out.println("zcard 的使用");
        jedis.flushAll();

        jedis.zadd("key",10,"zhangsan");
        jedis.zadd("key",20,"lisi");
        jedis.zadd("key",30,"wangwu");

        long len = jedis.zcard("key");
        System.out.println("此处预期 len = 3, 实际 len = " + len);
}

运行结果:


ZREM

public static void test3(Jedis jedis) {
        System.out.println("zrem 的使用");
        jedis.flushAll();

        jedis.zadd("key",10,"zhangsan");
        jedis.zadd("key",20,"lisi");
        jedis.zadd("key",30,"wangwu");

        long n = jedis.zrem("key","zhangsan");
        System.out.println("此处预期 n = 1, 实际 n = " + n);

        List<Tuple> membersWithScore = jedis.zrangeWithScores("key",0,-1);
        System.out.println("membersWithScore = " + membersWithScore);
}

运行结果:


ZSCORE

public static void test4(Jedis jedis) {
        System.out.println("zscore 的使用");
        jedis.flushAll();

        jedis.zadd("key",10,"zhangsan");
        jedis.zadd("key",20,"lisi");
        jedis.zadd("key",30,"wangwu");

        Double score = jedis.zscore("key","zhangsan");
        System.out.println("此处预期 score = 10.0, 实际 n = " + score);

        score = jedis.zscore("key","zhaoliu");
        System.out.println("此处预期 score = null, 实际 n = " + score);
}

运行结果:


ZRANK

public static void test5(Jedis jedis) {
        System.out.println("zrank 的使用");
        jedis.flushAll();

        jedis.zadd("key",10,"zhangsan");
        jedis.zadd("key",20,"lisi");
        jedis.zadd("key",30,"wangwu");

        Long rank = jedis.zrank("key","zhangsan");
        System.out.println("此处预期 score = 1, 实际 n = " + rank);

        rank = jedis.zrank("key","zhaoliu");
        System.out.println("此处预期 score = null, 实际 n = " + rank);
}

运行结果:

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

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

相关文章

Shutter Encoder多媒体转换v17.8

软件介绍 多媒体包含种类繁多的各种文件格式&#xff0c;每种格式都有其不同的特征和所谓的“怪癖”。 因此&#xff0c;如果使用多种图像、视频或音频格式&#xff0c;找到一个集中的软件来从一个地方处理所有这些格式可能会非常棘手。 这就是 Shutter Encoder 基本上允许做的…

科研绘图(二)气泡图

气泡矩阵图&#xff08;Bubble Matrix Plot&#xff09;&#xff0c;通常用于显示三个变量之间的关系。这种图表类型将数据点表示为气泡的形式&#xff0c;其中气泡的大小通常表示第三个数值变量的大小。图表的X轴和Y轴代表两个分类或定量变量。颜色可能代表另一个分类变量或是…

计算机缺失msvcp120.dll的最新解决方法,实测可以完美修复

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“msvcp120.dll丢失”。msvcp120.dll是Microsoft Visual C Redistributable Package的一部分&#xff0c;它是运行许多基于Windows操作系统的应用程序所必需的动态链接库文件之一。如果计算机…

矿山无人驾驶方案

矿山无人驾驶运输系统&#xff0c;可实现露天矿采煤装载运输的无人化&#xff0c;满足智能矿山安全、高效、绿色、环保等目标。 无人驾驶应用的总体技术架构包括“车端、场端、云端”三个层面以及相应的安全保障体系&#xff0c;其中车端的智能矿卡具备车辆感知、通信、决策和执…

数字信号处理教程学习笔记1-第2章时域中的离散信号和系统

信号处理的任务示意方框图 模拟信号和数字信号分别是啥样的,有啥区别

【AI视野·今日CV 计算机视觉论文速览 第286期】Tue, 9 Jan 2024

AI视野今日CS.CV 计算机视觉论文速览 Tue, 9 Jan 2024 Totally 121 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computer Vision Papers Dr$^2$Net: Dynamic Reversible Dual-Residual Networks for Memory-Efficient Finetuning Authors Chen Zhao, Shuming Li…

富唯智能新研发的复合机器人,轻松破解汽车底盘零配件生产中的难题

随着汽车工业的快速发展&#xff0c;对于底盘零配件的需求也日益增长。为了满足市场需求&#xff0c;智能物流解决方案在汽车底盘零配件生产中扮演着越来越重要的角色。如何实现高效、准确的生产和物流管理&#xff0c;以满足市场快速变化的需求&#xff0c;成为了汽车生产商亟…

日期类的实现|运算符重载的复用

前言 通过前面C入门与类与对象的学习&#xff0c;今天我们将运用所学的知识点完成一个Date类。 本节目标 运用所学知识完成Date类。详细讲解运算符各种重载。理解运算符重载的复用。 一、Date类的六个默认成员函数 六个成员函数&#xff0c;Date类只需要自己实现构造函数即可…

比尔盖茨:如果只能解决一个问题,我的答案总是营养不良

谷禾健康 当地时间12月19日&#xff0c;微软联合创始人、亿万富翁比尔盖茨发布了对来年的年度预测&#xff0c;称 2024 年将是一个“转折点”。 在这封长达 10 页的信中他展示了对人工智能领域的更多创新、婴儿营养不良问题的突破、气候变化谈判的进展等多方面的期待。 人工智能…

vue-virtual-scroll-list(可单选、多选、搜索查询、创建条目)

element-ui-解决下拉框数据量过多问题&#xff08;vue-virtual-scroll-list&#xff09;_element-ui下拉框数据太多如何优化-CSDN博客 的升级版 参考链接&#xff1a;封装el-select&#xff0c;实现虚拟滚动,可单选、多选、搜索查询、创建条目-CSDN博客 1.封装组件 select.v…

计算机组成原理-计算机的发展(计算机系统 硬件发展 软件发展 微处理器和微计算机的发展 摩尔定律 发展趋势)

文章目录 总览什么是计算机系统软件硬件的发展第一代第二代第三代第四代微处理器的发展相关人物摩尔定律 软件的发展目前的发展趋势小结 总览 什么是计算机系统 软件 语言处理程序就是编译程序之类的 调试代码就是服务程序 硬件的发展 第一代 逻辑元件&#xff1a;处理电信…

通达信波动指数指标公式,识别盘整还是趋势

波动指数(Choppiness Index)是由澳大利亚商品交易员E.W. Dreiss开发的技术指标&#xff0c;用来判断市场是盘整还是趋势。该指标属于非方向性指标&#xff0c;不用于判断市场方向&#xff0c;而仅用于识别市场趋势。 指标的取值范围为0到100&#xff0c;数值越高&#xff0c;表…

Linux进程管理、ps命令、kill命令

每一个程序在运行的时候都会被操作系统注册为系统中的一个进程 补充一下操作系统的内容&#xff1a; 进程实体&#xff08;又称进程映像&#xff09;&#xff1a;程序段、相关数据段、PCB三部分构成 进程是进程实体的运行过程&#xff0c;是系统进行资源分配的一个独立单位 …

xtdrone用键盘控制无人机飞行 无法起飞

运行案例 解锁无人机螺旋桨转动但无法起飞 也未报错 解决方法&#xff1a; 在QGC中修改&#xff1a;PX4飞控EKF配置 将PX4使用的EKF配置为融合GPS的水平位置与气压计高度。 如果我们想使用视觉定位&#xff0c;就需要把修改配置文件。 此修改意味着EKF融合来自mavros/vision_…

【QUARTZ】springboot+quartz动态配置定时任务

Quartz 介绍 Quartz 定时任务可分为Trigger&#xff08;触发器&#xff09;、Job&#xff08;任务&#xff09;和Scheduler&#xff08;调度器&#xff09;&#xff0c;定时任务的逻辑大体为&#xff1a;创建触发器和任务&#xff0c;并将其加入到调度器中&#xff0c;如下图所…

【Android+物联网】Android封装MQTT连接阿里云物联网平台

前言&#xff1a; 亲测可行&#xff0c;本文实现Android封装MQTT连接阿里云物联网平台。将MQTT协议和连接阿里云平台的操作通过Android studio写入APP中&#xff0c;并简单设计UI。实现手机APP远程控制单片机LED灯亮灭的功能。 关于《Android软件开发》&#xff0c;见如下专栏…

Unity填坑-灯光烘焙相关

Unity填坑-灯光烘焙相关 文章目录 Unity填坑-灯光烘焙相关前言一、Light的模式二、光的效果分类三、各种Light模式与烘焙的说明1.Realtime,实时光2.baked,烘焙光3.mixed,混合 四、实时全局光五、其他说明1.动态物体的全局光照效果2.手机使用烘焙注意的点3.其他设置 前言 项目组…

gem5学习(12):理解gem5 统计信息和输出——Understanding gem5 statistics and output

目录 一、config.ini 二、config.json 三、stats.txt 官方教程&#xff1a;gem5: Understanding gem5 statistics and output 在运行 gem5 之后&#xff0c;除了仿真脚本打印的仿真信息外&#xff0c;还会在根目录中名为 m5out 的目录中生成三个文件&#xff1a; config.i…

Mr_HJ / form-generator项目学习-增加自定义的超融组件(二)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; https://gitee.com/nbacheng/n…

【pwn】cmcc_simplerop --rop链的构造

程序保护情况检查 32位程序&#xff0c;堆栈不可执行 主函数&#xff1a; 左边又是一堆函数&#xff0c;file看一下 发现是静态链接&#xff0c;那ret2libc不用考虑了&#xff0c;接着看一下有没有int 80 那可以考虑利用rop链调用execve函数&#xff0c;用系统调用的函数参数是…