Redis 列表操作实战(全)

news2024/12/26 22:59:51

目录

LINDEX 获取指定下标元素

LSET 指定下标添加元素

LPUSH 将元素插入列表头

LPUSHX

RPUSH 将元素插入列表尾

RPUSHX

LINSERT 将元素插入列表某位置之前

LLEN 列表长度

LPOP 取列表头元素

RPOP  取列表尾元素

BLPOP 阻塞式取列表头元素

BRPOP 阻塞式取列表尾元素

RPOPLPUSH 取尾元素插入头部

BRPOPPUSH 阻塞取尾元素插入头元素

LRANGE 返回指定区间元素

LREM 移除特定元素

LTRIM 保留特定区间元素


LINDEX 获取指定下标元素

LINDEX key index:返回列表 key 中,下标为 index 的元素。

  • index可以是正数:0为第一个,1为第二个,以此类推
  • index可以是负数:-1为最后一个,-2为倒数第二个元素,以此类推
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> lpush mylist apple
(integer) 1
127.0.0.1:6379> lpush mylist banana
(integer) 2
127.0.0.1:6379> lpush mylist orange
(integer) 3
127.0.0.1:6379> lpush mylist pear
(integer) 4

# 0取第一个
127.0.0.1:6379> lindex mylist 0
"pear"

# -1取最后一个
127.0.0.1:6379> lindex mylist -1
"apple"
127.0.0.1:6379> lindex mylist 20
(nil)

时间复杂订为O(N),N为下标index经过的元素数量。

返回值

  • 返回列表下标为index位置的值
  • 若index不在列表的区间范围内,返回nil

LSET 指定下标添加元素

LSET key index value:将列表 key 下标为 index 的元素的值设置为 value。

  • 当 index 参数超出范围,或对一个空列表( key 不存在)进行 LSET 时,返回一个错误
  • key必须存在
127.0.0.1:6379> flushdb
OK

# key不存在
127.0.0.1:6379> lset mylist 0 apple
(error) ERR no such key

# 初始化key 并插入值
127.0.0.1:6379> lpush mylist app
(integer) 1
127.0.0.1:6379> lindex mylist 0
"app"

# 用lset
127.0.0.1:6379> lset mylist 0 apple
OK
127.0.0.1:6379> lindex mylist 0
"apple"

时间复杂度为O(N)

  • 表头和表尾,复杂度为O(1)
  • 其它情况为O(N),N为列表的长度

返回值

  • 成功返回OK,否则返回错误信息

LPUSH 将元素插入列表头

LPUSH key value [value ...]:将一个或多个值 value 插入到列表 key 的表头

  • 如果有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到表头
  • 如果 key 不存在,一个空列表会被创建并执行 LPUSH 操作
  • 当 key 存在但不是列表类型时,返回一个错误
  • 允许重复插入
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> lpush mylist apple banana orange pear
(integer) 4

# 重复插入
127.0.0.1:6379> lpush mylist apple banana orange pear 
(integer) 8

# 查看列表数据
127.0.0.1:6379> lrange mylist 0 -1
1) "pear"
2) "orange"
3) "banana"
4) "apple"
5) "pear"
6) "orange"
7) "banana"
8) "apple"

时间复杂度为O(1)。

返回执行LPUSH后的列表长度。

LPUSHX

LPUSHX key value:将值 value 插入到列表 key 的表头,当且仅当 key 存在并且是一个列表。

  • 和 LPUSH相似, 不同的是,当 key 不存在时, LPUSHX 命令什么也不做
127.0.0.1:6379> flushdb
OK

# mylist不存在
127.0.0.1:6379> lpushx mylist apple banana orange pear 
(integer) 0

# 初始化mylist
127.0.0.1:6379> lpush mylist apple
(integer) 1

# lpushx操作
127.0.0.1:6379> lpushx mylist apple banana orange pear 
(integer) 5

# 查看mylist数据
127.0.0.1:6379> lrange mylist 0 -1
1) "pear"
2) "orange"
3) "banana"
4) "apple"
5) "apple"

时间复杂度为O(1)。

返回执行LPUSHX后的列表长度。

RPUSH 将元素插入列表尾

RPUSH key value [value ...]

  • 操作与LPUSH相似,只有一点不同是 RPUSH 是从尾部插入(LPUSH从头插入)

RPUSHX

RPUSHX key value

  • 操作与LPUS X相似,只有一点不同是 RPUSHX 是从尾部插入(LPUSHX从头插入)

LINSERT 将元素插入列表某位置之前

LINSERT key BEFORE|AFTER pivot value:将值 value 插入到列表 key 当中,位于值 pivot 之前或之后。

  • 当 pivot 不存在于列表 key 时,不执行任何操作
  • 当 key 不存在时, key 被视为空列表,不执行任何操作
  • 如果 key 不是列表类型,返回一个错误
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> lpush mylist apple
(integer) 1

# 插入到apple之前
127.0.0.1:6379> linsert mylist before apple banaba
(integer) 2
# 插入到apple
127.0.0.1:6379> linsert mylist after apple banaba
(integer) 3

# pivot不存在
127.0.0.1:6379> linsert mylist after pear banaba
(integer) -1

# 清空列表
127.0.0.1:6379> lpop mylist
"banaba"
127.0.0.1:6379> lpop mylist
"apple"
127.0.0.1:6379> lpop mylist
"banaba"
127.0.0.1:6379> lpop mylist
(nil)

# key为空或key不存在
127.0.0.1:6379> linsert mylist before apple banana
(integer) 0
127.0.0.1:6379> linsert mylist1 before apple banana
(integer) 0

时间复杂度O(N), N 为寻找 pivot 过程中经过的元素数量

返回执行后的列表长度

  • 若没有找到 pivot ,返回 -1
  • 若key 不存在或为空列表,返回 0

LLEN 列表长度

LLEN key:返回列表长度。

  • 若 key 不存在,则 key 被解释为一个空列表,返回 0
  • 若 key 不是列表类型,返回一个错误
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> lpush mylist apple banana orange pear 
(integer) 4
127.0.0.1:6379> llen mylist
(integer) 4

时间复杂度O(1)。

返回列表 key 的长度。

LPOP 取列表头元素

LPOP key:移除并返回列表 key 的头元素。

  • 若列表为空,返回nil
  • 若key不存在,返回nil
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> lpush mylist apple banana orange pear 
(integer) 4
127.0.0.1:6379> llen mylist
(integer) 4
127.0.0.1:6379> lpop mylist
"pear"

# 头元素已不存在
127.0.0.1:6379> lrange mylist 0 -1
1) "orange"
2) "banana"
3) "apple"

127.0.0.1:6379> lpop mylist
"orange"
127.0.0.1:6379> lpop mylist
"banana"
127.0.0.1:6379> lpop mylist
"apple"

# 列表为空 或 key不存在时
127.0.0.1:6379> lpop mylist
(nil)
127.0.0.1:6379> lpop mylist1
(nil)

时间复杂度为O(1)。

返回移除的头元素

  • 若列表为空 或 key不存在时,返回nil

RPOP  取列表尾元素

RPOP key:操作与LPOP相似

  • RPOP是从尾部移除,LPOP是从头部移除

BLPOP 阻塞式取列表头元素

BLPOP key [key ...] timeout:列表的阻塞式(blocking)弹出原语

  • timeout单位为秒,若为0 表示无限阻塞
  • 它是 LPOP 命令的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被 BLPOP 命令阻塞,直到等待超时或发现可弹出元素为止
  • 当给定多个 key 参数至少有一个不为空列表,按参数 key 的先后顺序依次检查各个列表,弹出第一个非空列表的头元素
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> lpush mylist apple # 初始化列表并添加一个元素
(integer) 1
127.0.0.1:6379> blpop mylist 10
1) "mylist"
2) "apple"
127.0.0.1:6379> blpop mylist 10
(nil)
(10.05s)    # 超时秒数,未取出数据退出
127.0.0.1:6379> lpush mylist apple # 添加一个元素
(integer) 1

# 而mylist2不存在 跳过;mylist存在且不为空,紧接着 command 列表的第一个元素被弹
127.0.0.1:6379> blpop mylist2 mylist 10
1) "mylist" # 弹出元素所属的列表
2) "apple"  # 弹出元素所属的值
  • 所给的key为空 或不存在,命令将阻塞连接
    • 直到等到超时退出
    • 或直到任何一个key有值为止

  • 多客户端执行相同命令时,多个客户端先后放到同一个阻塞队列中,某个key有数据时,先放入阻塞队列的客户端先获取元素

  • 在MULTI/EXEC事务的BLPOP中
    • 事务行为为了保证事务的原子性,是阻止对key进行push操作的,所以在MULTI/EXEC事务中BLPOP与LPOP一样不会阻塞,对空列表返回nil,对非空列表返回头元素
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> multi       # 开启个事务
OK
127.0.0.1:6379(TX)> blpop mylist mylist2 1000    # 对不存在key进行blpop
QUEUED
127.0.0.1:6379(TX)> exec    # 提交事务
1) (nil)                    # 不阻塞立即返回
127.0.0.1:6379> lpush mylist apple               # 创建mylist并初始化一个元素
(integer) 1
127.0.0.1:6379> multi       # 开启个事务
OK
127.0.0.1:6379(TX)> blpop mylist mylist2 1000    # 对非空列表进行blpop
QUEUED
127.0.0.1:6379(TX)> exec    # 提交事务
1) 1) "mylist"              # 返回元素所在的列表
   2) "apple"               # 返回元素
127.0.0.1:6379> multi       # 开启个事务
OK
127.0.0.1:6379(TX)> blpop mylist mylist2 1000    # 对空列表进行blpop
QUEUED
127.0.0.1:6379(TX)> exec    # 提交事务 
1) (nil)                    # 不阻塞直接返回nil

时间复杂度为o(1)。

返回

  • 返回一个含有两个元素的列表,第一个元素是被弹出元素所属的 key ,第二个元素是被弹出元素的值
  • 如果列表为空,返回一个 nil

BRPOP 阻塞式取列表尾元素

BRPOP key [key ...] timeout:操作与BLPOP相似

  • 不同点:BRPOP是取第一个非空列表的尾部元素;BLPOP是取第一个非空列表的头部元素。

RPOPLPUSH 取尾元素插入头部

RPOPLPUSH source destination:在一个原子时间内,执行以下两个动作

  • 取出source尾元素,并返回给客户端
  • 从source取出的元素插入到destination列表的头部
127.0.0.1:6379> flushdb
OK

# source和dectination均不存在
127.0.0.1:6379> rpoplpush mylist mylist2
(nil)

# 初始化一个列表 添加一个元素
127.0.0.1:6379> lpush mylist banana
(integer) 1
127.0.0.1:6379> rpoplpush mylist mylist2
"banana"
127.0.0.1:6379> lrange mylist2 0 -1    # 从mylist中出放入到了mylist2
1) "banana"
127.0.0.1:6379> lrange mylist 0 -1     # 已取出,mylist为空列表
(empty array)

127.0.0.1:6379> lpush mylist apple     # mylist再插入元素
(integer) 1
127.0.0.1:6379> rpoplpush mylist mylist2 # 再执行一次rpoplpush
"apple"
127.0.0.1:6379> lrange mylist2 0 -1    # 打印mylist2 证实是插入到表头
1) "apple"
2) "banana"

127.0.0.1:6379> rpoplpush mylist mylist2 # mylist为空时执行 rpoplpush 返回nil
(nil)
127.0.0.1:6379> set age 22
OK
127.0.0.1:6379> rpoplpush mylist age    # mylist为空,不管destination是什么数据结构,返回nil
(nil)

127.0.0.1:6379> lpush mylist apple
(integer) 1
127.0.0.1:6379> rpoplpush mylist age    # mylist非空,destination是字符串,报错
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> rpoplpush age mylist2   # age非队列,报错
(error) WRONGTYPE Operation against a key holding the wrong kind of value

时间复杂度O(1)。

返回:(RPOPLPUSH是先rpop 再 lpush)

  • source为空队列或source不存在时,返回nil(只执行rpop,不执行lpush)
  • source为非空队列,且destination不存在或为队列,返回source的尾元素,并插入到destination中(destination不存在就创建一个队列,执行rpop和lpush)
  • source存在且不是队列 或 source非空队列且destination不是队列,报错(对非队列key执行rpop)

BRPOPPUSH 阻塞取尾元素插入头元素

BRPOPLPUSH source destination timeout:是 RPOPLPUSH 的阻塞版本

  • 若source为空,则阻塞,直到超时
  • timeout以秒为单位,0表示无限超时
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> brpoplpush mylist mylist2 10 # source不存在或空队列,阻塞超时
(nil)
(10.09s)
127.0.0.1:6379> lpush mylist apple
(integer) 1
127.0.0.1:6379> brpoplpush mylist mylist2 10 # source为非空队列,取出并lpush到mylist2中
"apple"
127.0.0.1:6379> set age 22
OK
127.0.0.1:6379> brpoplpush age mylist mylist2 10    # source不是队列
(error) ERR wrong number of arguments for 'brpoplpush' command
127.0.0.1:6379> brpoplpush mylist2 age 10           # source非空队列,dectination不是队列
(error) WRONGTYPE Operation against a key holding the wrong kind of value
  • 阻塞期间有别的客户端插入元素

时间复杂度O(1)。

返回:

  • source为空队列或source不存在时阻塞,直到超时返回nil 和 超时时间(只执行rpop,不执行lpush);或者有别的客户端向source 插入数据才返回元素 和 等待时间(执行rpop 和 lpush)
  • source为非空队列,且destination不存在或为队列,返回source的尾元素,并插入到destination中(destination不存在就创建一个队列,执行rpop和lpush)
  • source存在且不是队列 或 source非空队列且destination不是队列,报错(对非队列key执行rpop)

LRANGE 返回指定区间元素

LRANGE key start stop:返回列表 key 中指定区间内的元素,区间以偏移量 start 和 stop 指定

  • 0表示第一个元素,1表示第二个元素,以此类推
  • -1表示最后一个元素,-2表示倒数第二个元素,以此类推
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> brpoplpush mylist mylist2 0
"banana"
(12.53s)
127.0.0.1:6379> lrange mylist2 0 -1
1) "banana"
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> lpush mylist apple banana orange pear
(integer) 4
127.0.0.1:6379> lrange mylist 0 1
1) "pear"
2) "orange"
127.0.0.1:6379> lrange mylist -2 -1
1) "banana"
2) "apple"
127.0.0.1:6379> lrange mylist 1 0    # start 大于 stop 
(empty array)
127.0.0.1:6379> lrange mylist -1 -2  # start 大于 stop 
(empty array)
127.0.0.1:6379> lrange mylist 100 110 # start 大于列表长度
(empty array)

时间复杂度为O(S+N),S为偏移量 start , N 为指定区间内元素的数量。

返回:

  • 若start 小于等于 stop,返回[start, stop] 区间的元素
  • 若start 大于 stop,返回空列表

LREM 移除特定元素

LREM key count value:根据参数 count 的值,移除列表中与参数 value 相等的元素

  • count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count
  • count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值
  • count = 0 : 移除表中所有与 value 相等的值
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> lrem mylist 0 apple
(integer) 0
127.0.0.1:6379> lpush mylist apple banana apple orange apple pear apple #插入4个apple
(integer) 7
127.0.0.1:6379> lrem mylist 2 apple    # 移除2个apple
(integer) 2
127.0.0.1:6379> lrange mylist 0 -1     # 还剩2个apple
1) "pear"
2) "orange"
3) "apple"
4) "banana"
5) "apple"
127.0.0.1:6379> lrem mylist 0 apple    # 移除所有apple
(integer) 2
127.0.0.1:6379> lrange mylist 0 -1     # 剩0 个apple
1) "pear"
2) "orange"
3) "banana"
127.0.0.1:6379> set age 22
OK
127.0.0.1:6379> lrem age 0 apple       # 对非队列执行lrem
(error) WRONGTYPE Operation against a key holding the wrong kind of value

时间复杂度O(N), N 为列表的长度

返回:

  • 被移除元素的数量
  • 若key不存在,则key视为空列表,返回0
  • 若key存在且不为列表,对非列表执行lrem报错

LTRIM 保留特定区间元素

LTRIM key start stop:只保留指定区间 [start, stop] 内的元素,不在指定区间之内的元素都将被删除

127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> ltrim mylist 0 5    # 不存在的key似为空列表
OK
127.0.0.1:6379> lpush mylist 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
(integer) 15
127.0.0.1:6379> ltrim mylist 0 5    # 保存区间 [0, 5] 的元素
OK
127.0.0.1:6379> lrange mylist 0 -1  # 查看列表元素
1) "15"
2) "14"
3) "13"
4) "12"
5) "11"
6) "10"
127.0.0.1:6379> set age 22           # 对非列表执行ltrim
OK
127.0.0.1:6379> ltrim age 0 5        # 对非列表执行ltrim
(error) WRONGTYPE Operation against a key holding the wrong kind of value

时间复杂度为O(N),N 为被移除的元素的数量

返回:

  • 对列表或不存在key执行ltrim,返回OK
  • 对非列表执行ltrim,报错

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

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

相关文章

精品Python医院挂号信息管理系统

《[含文档PPT源码等]精品基于Python实现的医院挂号信息管理系统》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程等 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;python 使用框架&#xff1a;Django 前端技术&#xff1a;JavaScript、…

智能指针解读(2)

前面一篇文章&#xff0c;我讲解了智能指针的原理&#xff0c;并实现了一个简单的智能指针。为了加深对智能指针的理解&#xff0c;在这篇文章中&#xff0c;我把C中的几个智能指针讲解下&#xff1a;auto_ptr, unique_ptr, shared_ptr, weak_ptr。 1、auto_ptr 前面的文章我…

在服务器上创建git仓库

1、在服务器上创建git仓库 选择一个创建文件夹的地方&#xff0c;这个地方不会将源码存放在这里&#xff0c;只用于版本控制 # 创建一个专门放置git的文件夹&#xff0c;也可以叫其它名 mkdir git && cd git # 创建自己项目的文件夹&#xff0c;文件夹后面要带 .git…

电工三级证(高级)实战项目:信号交通灯的PLC控制

实训目的 掌握比较指令掌握时钟指令掌握时间同步的方法 控制要求 PLC设备:Siemens S7-200 要求:按下起动按钮SB1后&#xff0c;东西方向绿灯亮20s&#xff0c;之后再闪烁绿灯3s&#xff0c;之后黄灯亮3s&#xff0c;最后红灯亮26s&#xff1b;同时&#xff0c;南北方向红灯亮…

Winscp--使用技巧

原文网址&#xff1a;Winscp--使用技巧_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Winscp的使用技巧。 保持连接 有时经常自动断开&#xff0c;需要重新连接&#xff0c;解决方法如下&#xff1a; 修改默认目录 每次连接后会自动定位到如下目录&#xff1a;本地Windows的Do…

2023最新安装微信小程序开发软件安装教程

一&#xff0c;安装开发者工具 我们在开发小程序之前&#xff0c;首先需要安装小程序开发者工具&#xff0c;今天就来教大家安装小程序开发者工具。 微信开放文档 (qq.com)https://developers.weixin.qq.com/miniprogram/dev/framework/ 官网工具下载地址&#xff1a; 微信…

Linux 进程相关命令

输入 ps aux后里面有个STAT参数 kill -9 进程ID 或者kill -9 SIGKILL 进程ID强制杀死

76、SpringBoot 整合 MyBatis------使用 sqlSession 作为 Dao 组件(就是ssm那一套,在 xml 写sql)

就是 ssm 那套&#xff0c;在xml 上面写sql ★ 基于SqlSession来实现DAO组件的方式 - MyBatis提供的Starter会自动在Spring容器中配置SqlSession&#xff08;其实SqlSessionTemplate实现类&#xff09;、并将它注入其他组件&#xff08;如DAO组件&#xff09;- DAO组件可直接…

SpringBoot整合Mybatis-Plus分页插件的使用

&#x1f9d1;‍&#x1f4bb;作者名称&#xff1a;DaenCode &#x1f3a4;作者简介&#xff1a;CSDN实力新星&#xff0c;后端开发两年经验&#xff0c;曾担任甲方技术代表&#xff0c;业余独自创办智源恩创网络科技工作室。会点点Java相关技术栈、帆软报表、低代码平台快速开…

ExoPlayer实现本地视频播放器

最近单位项目不太忙&#xff0c;决定写个Demo实现一个自己的本地视频播放器&#xff0c;界面参考了完美视频播放器 本地视频播放器 架构简单&#xff0c;功能简单 MVVMkotlinexoplayer实现 当前实现点&#xff1a; 扫描本地视频并以文件夹&#xff08;视频列表&#xff09;形…

Cpp/Qt-day030919Qt

目录 完成文本编辑器的保存工作 头文件&#xff1a;widget.h: #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QFontDialog> //字体对话框 #include <QFont> //字体类 #include <QMessageBox> //消息对话框 #include <QDe…

Vue的详细教程--基础语法【上】

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Vue的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.插值 1.文本 2.html 3.属性&class绑…

Blender关键帧动画简明教程

Blender 3D 是一款能够创建令人惊叹的动画的免费软件。 Blender 中的大多数动画都使用所谓的关键帧。 Blender 中关键帧的介绍将涵盖开始制作动画所需的一切&#xff01; 推荐&#xff1a;用 NSDT编辑器 快速搭建可编程3D场景 1、什么是关键帧&#xff1f; 在计算机出现之前&a…

玩玩“小藤”开发者套件 Atlas 200I DK A2 之挂载 m2 硬盘

玩玩“小藤”开发者套件 Atlas 200I DK A2 之挂载 m2 硬盘 0. 背景1. 列出所有可用块设备的信息2. 格式化磁盘3. 创建 XFS 文件系统4. 挂载格式化的卷 0. 背景 总所周知&#xff0c;英伟达的GPU供不应求&#xff0c;还各种限制。华为推出了升腾AI可以提供AI算力&#xff0c;那…

【pytest】 标记冒烟用例 @pytest.mark.smoke

1. 使用 pytest.mark.smoke 标记用例 import pytest class Test_Smoke:def test_01(self):assert 112pytest.mark.smokedef test_02(self):assert 121pytest.mark.smokedef test_03(self):assert 1 2 3 2.配置文件pytest.ini [pytest] markers smoke 3. 运行指定标签 运…

从李佳琦到背后的商业逻辑再到游戏行业

引言 前阵子&#xff0c;李佳琦在直播间带货某牌子的眉笔时&#xff0c;被网友质疑越来越贵&#xff0c;对此李佳琦回应表示&#xff0c;79的眉笔不贵&#xff0c;国货品牌很难的&#xff0c;买不起的话&#xff0c;要找找自己的原因并反思这么多年有没有涨工资&#xff0c;有…

保存在本地的程序被删除了,咋恢复~

我在项目上&#xff0c;习惯在本地写一些工具代码。 大部分都是复制粘贴过来改吧改吧。 前段时间清理本地乱七八糟的程序&#xff0c;删了很多&#xff0c;当输入zlm**某个tcode后&#xff0c;提示没有&#xff0c;我擦发现&#xff0c;误删了~~ 好吧&#xff0c;难道只能重写&…

HTB靶机064-Arctic-WP

Arctic windows easy IP :10.10.10.11 端口扫描 简易端口扫描 ┌──(xavier㉿kali)-[~/Desktop/HTB/064-Arctic] └─$ sudo nmap -F 10.10.10.11 -T4 Starting Nmap 7.93 ( https://nmap.org ) at 2023-09-13 23:30 CST Nmap scan report for 10…

力扣 -- 394. 字符串解码

解题方法&#xff1a; 参考代码&#xff1a; class Solution{ public:string decodeString(string s){stack<string> sst;stack<int> dst;//防止字符串栈为空的时候再追加字符串到栈顶元素sst.push("");int n s.size();int i 0;while(i<n)//最好不…

JUC第四讲:Java中的锁

Java提供了种类丰富的锁&#xff0c;每种锁因其特性的不同&#xff0c;在适当的场景下能够展现出非常高的效率。本文是JUC第4讲&#xff0c;旨在对锁相关源码&#xff08;本文中的源码来自JDK 8和Netty 3.10.6&#xff09;、使用场景进行举例&#xff0c;为读者介绍主流锁的知识…