redis变慢查询

Redis 通常是我们业务系统中一个重要的组件,比如:缓存、账号登录信息、排行榜等。

一旦 Redis 请求延迟增加,可能就会导致业务系统”雪崩”。

我在单身红娘婚恋类型互联网公司工作,在双十一推出下单就送女朋友的活动。

谁曾想,凌晨 12 点之后,用户量暴增,出现了一个技术故障,用户无法下单,当时老大火冒三丈!

获取不到连接资源,并且集群中的单台 Redis 连接量很高。

大量的流量没了 Redis 的缓存响应,直接打到了 MySQL,最后数据库也宕机了……

于是各种更改最大连接数、连接等待数,虽然报错信息频率有所缓解,但还是 持续报错

可以发现,一旦 Redis 延迟过高,会引发各种问题。

今天「码哥」跟大家一起来分析下如何确定 Redis 有性能问题和解决方案。

  • 延迟基线测量
  • 慢指令监控
  • 慢日志功能
  • Latency Monitoring
  • 网络通信导致的延迟
  • 慢指令导致的延迟
  • Fork 生成 RDB 导致的延迟
  • 内存大页(transparent huge pages)
  • swap:操作系统分页
  • 获取 Redis 实例 pid
  • 解决方案
  • AOF 和磁盘 I/O 导致的延迟
  • expires 淘汰过期数据
  • 解决方案
  • bigkey
  • 查找 bigkey
  • 解决方案

最大延迟是客户端发出命令到客户端收到命令的响应的时间,正常情况下 Redis 处理的时间极短,在微秒级别。

当 Redis 出现性能波动的时候,比如达到几秒到十几秒,这个很明显我们可以认定 Redis 性能变慢了。

有的硬件配置比较高,当延迟 0.6ms,我们可能就认定变慢了。硬件比较差的可能 3 ms 我们才认为出现问题。

❝那我们该如何定义 Redis 真的变慢了呢?

所以,我们需要对当前环境的 Redis 基线性能做测量,也就是在一个系统在低压力、无干扰情况下的基本性能。

当你发现 Redis 运行时时的延迟是基线性能的 2 倍以上,就可以判定 Redis 性能变慢了。

延迟基线测量

redis-cli 命令提供了 –intrinsic-latency 选项,用来监测和统计测试期间内的最大延迟(以毫秒为单位),这个延迟可以作为 Redis 的基线性能。

redis-cli --latency -h host -p port

比如执行如下指令:

redis-cli&#xA0;--intrinsic-latency&#xA0;100<br>Max&#xA0;latency&#xA0;so&#xA0;far:&#xA0;4&#xA0;microseconds.<br>Max&#xA0;latency&#xA0;so&#xA0;far:&#xA0;18&#xA0;microseconds.<br>Max&#xA0;latency&#xA0;so&#xA0;far:&#xA0;41&#xA0;microseconds.<br>Max&#xA0;latency&#xA0;so&#xA0;far:&#xA0;57&#xA0;microseconds.<br>Max&#xA0;latency&#xA0;so&#xA0;far:&#xA0;78&#xA0;microseconds.<br>Max&#xA0;latency&#xA0;so&#xA0;far:&#xA0;170&#xA0;microseconds.<br>Max&#xA0;latency&#xA0;so&#xA0;far:&#xA0;342&#xA0;microseconds.<br>Max&#xA0;latency&#xA0;so&#xA0;far:&#xA0;3079&#xA0;microseconds.<br><br>45026981&#xA0;total&#xA0;runs&#xA0;(avg&#xA0;latency:&#xA0;2.2209&#xA0;microseconds&#xA0;/&#xA0;2220.89&#xA0;nanoseconds&#xA0;per&#xA0;run).<br>Worst&#xA0;run&#xA0;took&#xA0;1386x&#xA0;longer&#xA0;than&#xA0;the&#xA0;average&#xA0;latency.

❝注意:参数 100是测试将执行的秒数。我们运行测试的时间越长,我们就越有可能发现延迟峰值。
通常运行 100 秒通常是合适的,足以发现延迟问题了,当然我们可以选择不同时间运行几次,避免误差。

「码哥」运行的最大延迟是 3079 微秒,所以基线性能是 3079 (3 毫秒)微秒。

需要注意的是,我们要在 Redis 的服务端运行,而不是客户端。这样,可以 避免网络对基线性能的影响

可以通过 -h host -p port 来连接服务端,如果想监测网络对 Redis 的性能影响,可以使用 Iperf 测量客户端到服务端的网络延迟。

如果网络延迟几百毫秒,说明网络可能有其他大流量的程序在运行导致网络拥塞,需要找运维协调网络的流量分配。

慢指令监控

❝如何判断是否是慢指令呢?

看操作复杂度是否是 O(N)。官方文档对每个命令的复杂度都有介绍,尽可能使用 O(1) &#x548C; O(log N)命令。

涉及到集合操作的复杂度一般为 O(N),比如集合 全量查询 HGETALL&#x3001;SMEMBERS,以及集合的 聚合操作:SORT、LREM、 SUNION等。

❝有监控数据可以观测呢?代码不是我写的,不知道有没有人用了慢指令。

有两种方式可以排查到:

  • 使用 Redis 慢日志功能查出慢命令;
  • latency-monitor(延迟监控)工具。

此外,可以使用自己(top、htop、prstat 等)快速检查 Redis 主进程的 CPU 消耗。如果 CPU 使用率很高而流量不高,通常表明使用了慢速命令。

Redis 中的 slowlog 命令可以让我们快速定位到那些超出指定执行时间的慢命令,默认情况下命令若是执行时间超过 10ms 就会被记录到日志。

slowlog 只会记录其命令执行的时间,不包含 io 往返操作,也不记录单由网络延迟引起的响应慢。

我们可以 根据基线性能来自定义慢命令的标准(配置成基线性能最大延迟的 2 倍),调整触发记录慢命令的阈值。

可以在 redis-cli 中输入以下命令配置记录 6 毫秒以上的指令:

redis-cli&#xA0;CONFIG&#xA0;SET&#xA0;slowlog-log-slower-than&#xA0;6000

也可以在 Redis.config 配置文件中设置,以微秒为单位。

想要查看所有执行时间比较慢的命令,可以通过使用 Redis-cli 工具,输入 slowlog get 命令查看,返回结果的第三个字段以微秒位单位显示命令的执行时间。

假如只需要查看最后 2 个慢命令,输入 slowlog get 2 即可。

&#x793A;&#x4F8B;&#xFF1A;&#x83B7;&#x53D6;&#x6700;&#x8FD1;2&#x4E2A;&#x6162;&#x67E5;&#x8BE2;&#x547D;&#x4EE4;<br>127.0.0.1:6381>&#xA0;SLOWLOG&#xA0;get&#xA0;2<br>1)&#xA0;1)&#xA0;(integer)&#xA0;6<br>&#xA0;&#xA0;&#xA0;2)&#xA0;(integer)&#xA0;1458734263<br>&#xA0;&#xA0;&#xA0;3)&#xA0;(integer)&#xA0;74372<br>&#xA0;&#xA0;&#xA0;4)&#xA0;1)&#xA0;"hgetall"<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;2)&#xA0;"max.dsp.blacklist"<br>2)&#xA0;1)&#xA0;(integer)&#xA0;5<br>&#xA0;&#xA0;&#xA0;2)&#xA0;(integer)&#xA0;1458734258<br>&#xA0;&#xA0;&#xA0;3)&#xA0;(integer)&#xA0;5411075<br>&#xA0;&#xA0;&#xA0;4)&#xA0;1)&#xA0;"keys"<br>&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;2)&#xA0;"max.dsp.blacklist"<br>

以第一个 HGET 命令为例分析,每个 slowlog 实体共 4 个字段:

  • 字段 1:1 个整数,表示这个 slowlog 出现的序号,server 启动后递增,当前为 6。
  • 字段 2:表示查询执行时的 Unix 时间戳。
  • 字段 3:表示查询执行微秒数,当前是 74372 微秒,约 74ms。
  • 字段 4: 表示查询的命令和参数,如果参数很多或很大,只会显示部分参数个数。当前命令是 hgetall max.dsp.blacklist

Redis 在 2.8.13 版本引入了 Latency Monitoring 功能,用于以秒为粒度监控各种事件的发生频率。

启用延迟监视器的第一步是 设置延迟阈值(单位毫秒)。只有超过该阈值的时间才会被记录,比如我们根据基线性能(3ms)的 3 倍设置阈值为 9 ms。

可以用 redis-cli 设置也可以在 Redis.config 中设置;

CONFIG&#xA0;SET&#xA0;latency-monitor-threshold&#xA0;9

工具记录的相关事件的详情可查看官方文档:https://redis.io/topics/latency-monitor

如获取最近的 latency

127.0.0.1:6379>&#xA0;debug&#xA0;sleep&#xA0;2<br>OK<br>(2.00s)<br>127.0.0.1:6379>&#xA0;latency&#xA0;latest<br>1)&#xA0;1)&#xA0;"command"<br>&#xA0;&#xA0;&#xA0;2)&#xA0;(integer)&#xA0;1645330616<br>&#xA0;&#xA0;&#xA0;3)&#xA0;(integer)&#xA0;2003<br>&#xA0;&#xA0;&#xA0;4)&#xA0;(integer)&#xA0;2003

Redis 的数据读写由单线程执行,如果主线程执行的操作时间太长,就会导致主线程阻塞。

一起分析下都有哪些操作会阻塞主线程,我们又该如何解决?

网络通信导致的延迟

客户端使用 TCP/IP 连接或 Unix 域连接连接到 Redis。1 Gbit/s 网络的典型延迟约为 200 us。

redis 客户端执行一条命令分 4 个过程:

❝发送命令-〉 命令排队 -〉 命令执行-〉 返回结果

这个过程称为 Round trip time(简称 RTT, 往返时间),mget mset 有效节约了 RTT,但大部分命令(如 hgetall,并没有 mhgetall)不支持批量操作,需要消耗 N 次 RTT ,这个时候需要 pipeline 来解决这个问题。

Redis pipeline 将多个命令连接在一起来减少网络响应往返次数。redis-pipeline

慢指令导致的延迟

根据上文的慢指令监控查询文档,查询到慢查询指令。可以通过以下两种方式解决:

  • 比如在 Cluster 集群中,将聚合运算等 O(N) 操作运行在 slave 上,或者在客户端完成。
  • 使用高效的命令代替。使用增量迭代的方式,避免一次查询大量数据,具体请查看SCAN、SSCAN、HSCAN和ZSCAN命令。

除此之外,生产中禁用KEYS 命令,它只适用于调试。因为它会遍历所有的键值对,所以操作延时高。

Fork 生成 RDB 导致的延迟

Redis 使用操作系统的多进程 写时复制技术 COW(Copy On Write) 来实现快照持久化,减少内存占用。

写时复制技术保证快照期间数据可修改

但 fork 会涉及到复制大量链接对象,一个 24 GB 的大型 Redis 实例需要 24 GB / 4 kB * 8 = 48 MB 的页表。

执行 bgsave 时,这将涉及分配和复制 48 MB 内存。

此外, 从库加载 RDB 期间无法提供读写服务,所以主库的数据量大小控制在 2~4G 左右,让从库快速的加载完成

内存大页(transparent huge pages)

常规的内存页是按照 4 KB 来分配,Linux 内核从 2.6.38 开始支持内存大页机制,该机制支持 2MB 大小的内存页分配。

也就是当数据被修改的时候,Redis 会复制一份这个数据,再进行修改。

采用了内存大页,生成 RDB 期间,即使客户端修改的数据只有 50B 的数据,Redis 需要复制 2MB 的大页。当写的指令比较多的时候就会导致大量的拷贝,导致性能变慢。

使用以下指令禁用 Linux 内存大页即可:

echo&#xA0;never&#xA0;>&#xA0;/sys/kernel/mm/transparent_hugepage/enabled

swap:操作系统分页

当物理内存(内存条)不够用的时候,将部分内存上的数据交换到 swap 空间上,以便让系统不会因内存不够用而导致 oom 或者更致命的情况出现。

当某进程向 OS 请求内存发现不足时,OS 会把内存中暂时不用的数据交换出去,放在 SWAP 分区中,这个过程称为 SWAP OUT。

当某进程又需要这些数据且 OS 发现还有空闲物理内存时,又会把 SWAP 分区中的数据交换回物理内存中,这个过程称为 SWAP IN。

内存 swap 是操作系统里将内存数据在内存和磁盘间来回换入和换出的机制,涉及到磁盘的读写。

❝触发 swap 的情况有哪些呢?

对于 Redis 而言,有两种常见的情况:

  • Redis 使用了比可用内存更多的内存;
  • 与 Redis 在同一机器运行的其他进程在执行大量的文件读写 I/O 操作(包括生成大文件的 RDB 文件和 AOF 后台线程),文件读写占用内存,导致 Redis 获得的内存减少,触发了 swap。

❝码哥,我要如何排查是否因为 swap 导致的性能变慢呢?

Linux 提供了很好的工具来排查这个问题,所以当怀疑由于交换导致的延迟时,只需按照以下步骤排查。

$&#xA0;redis-cli&#xA0;info&#xA0;|&#xA0;grep&#xA0;process_id<br>process_id:13160

进入此进程的 /proc 文件系统目录:

cd&#xA0;/proc/13160

在这里有一个 smaps 的文件,该文件描述了 Redis 进程的内存布局,运行以下指令,用 grep 查找所有文件中的 Swap 字段。

$&#xA0;cat&#xA0;smaps&#xA0;|&#xA0;egrep&#xA0;'^(Swap|Size)'<br>Size:&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;316&#xA0;kB<br>Swap:&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;0&#xA0;kB<br>Size:&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;4&#xA0;kB<br>Swap:&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;0&#xA0;kB<br>Size:&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;8&#xA0;kB<br>Swap:&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;0&#xA0;kB<br>Size:&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;40&#xA0;kB<br>Swap:&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;0&#xA0;kB<br>Size:&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;132&#xA0;kB<br>Swap:&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;0&#xA0;kB<br>Size:&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;720896&#xA0;kB<br>Swap:&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;&#xA0;12&#xA0;kB

每行 Size 表示 Redis 实例所用的一块内存大小,和 Size 下方的 Swap 对应这块 Size 大小的内存区域有多少数据已经被换出到磁盘上了。

如果 Size == Swap 则说明数据被完全换出了。

可以看到有一个 720896 kB 的内存大小有 12 kb 被换出到了磁盘上(仅交换了 12 kB),这就没什么问题。

Redis 本身会使用很多大小不一的内存块,所以,你可以看到有很多 Size 行,有的很小,就是 4KB,而有的很大,例如 720896KB。不同内存块被换出到磁盘上的大小也不一样。

敲重点了

如果 Swap 一切都是 0 kb,或者零星的 4k ,那么一切正常。

当出现百 MB,甚至 GB 级别的 swap 大小时,就表明,此时,Redis 实例的内存压力很大,很有可能会变慢。

AOF 和磁盘 I/O 导致的延迟

可以使用 appendfsync 配置将 AOF 配置为以三种不同的方式在磁盘上执行 write 或者 fsync (可以在运行时使用 CONFIG SET命令修改此设置,比如: redis-cli CONFIG SET appendfsync no)。

  • no:Redis 不执行 fsync,唯一的延迟来自于 write 调用,write 只需要把日志记录写到内核缓冲区就可以返回。
  • everysec:Redis 每秒执行一次 fsync。使用后台子线程异步完成 fsync 操作。最多丢失 1s 的数据。
  • always:每次写入操作都会执行 fsync,然后用 OK 代码回复客户端(实际上 Redis 会尝试将同时执行的许多命令聚集到单个 fsync 中),没有数据丢失。在这种模式下,性能通常非常低,强烈建议使用快速磁盘和可以在短时间内执行 fsync 的文件系统实现。

我们通常将 Redis 用于缓存,数据丢失完全恶意从数据获取,并不需要很高的数据可靠性,建议设置成 no 或者 everysec。

除此之外,避免 AOF 文件过大, Redis 会进行 AOF 重写,生成缩小的 AOF 文件。

可以把配置项 no-appendfsync-on-rewrite设置为 yes,表示在 AOF 重写时,不进行 fsync 操作。

也就是说,Redis 实例把写命令写到内存后,不调用后台线程进行 fsync 操作,就直接返回了。

expires 淘汰过期数据

Redis 有两种方式淘汰过期数据:

  • 惰性删除:当接收请求的时候发现 key 已经过期,才执行删除;
  • 定时删除:每 100 毫秒删除一些过期的 key。

定时删除的算法如下:

ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP默认设置为 20,每秒执行 10 次,删除 200 个 key 问题不大。

如果触发了第二条,就会导致 Redis 一致在删除过期数据去释放内存。 而删除是阻塞的。

❝码哥,触发条件是什么呀?

也就是大量的 key 设置了相同的时间参数。同一秒内,大量 key 过期,需要重复删除多次才能降低到 25% 以下。

简而言之:大量同时到期的 key 可能会导致性能波动。

如果一批 key 的确是同时过期,可以在 EXPIREATEXPIRE 的过期时间参数上, 加上一个一定大小范围内的随机数,这样,既保证了 key 在一个邻近时间范围内被删除,又避免了同时过期造成的压力。

bigkey

通常我们会将含有较大数据或含有大量成员、列表数的 Key 称之为大 Key,下面我们将用几个实际的例子对大 Key 的特征进行描述:

  • 一个 STRING 类型的 Key,它的值为 5MB(数据过大)
  • 一个 LIST 类型的 Key,它的列表数量为 10000 个(列表数量过多)
  • 一个 ZSET 类型的 Key,它的成员数量为 10000 个(成员数量过多)
  • 一个 HASH 格式的 Key,它的成员数量虽然只有 1000 个但这些成员的 value 总大小为 10MB(成员体积过大)

bigkey 带来问题如下:

使用 redis-rdb-tools 工具以定制化方式找出大 Key。

如将一个含有数万成员的 HASH Key 拆分为多个 HASH Key,并确保每个 Key 的成员数量在合理范围,在 Redis Cluster 结构中,大 Key 的拆分对 node 间的内存平衡能够起到显著作用。

Redis 自 4.0 起提供了 UNLINK 命令,该命令能够以非阻塞的方式缓慢逐步的清理传入的 Key,通过 UNLINK,你可以安全的删除大 Key 甚至特大 Key。

如下检查清单,帮助你在遇到 Redis 性能变慢的时候能高效解决问题。

Original: https://www.cnblogs.com/liliuguang/p/15990542.html
Author: 李留广
Title: redis变慢查询

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/529282/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • sublime text里面中文字体显示异常解决方案

    sublime text下载之后一开始转成中文之后,会出现中文显示异常的问题,比如下图中”门”字显示异常 通过如下的设置可以解决该问题: 首选项&#8211…

    Linux 2023年6月13日
    0201
  • 抑制stable_secret读取关键信息

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月7日
    0115
  • ABCD四个顺序执行方法,拓展性延申

    今天在群里,有人问 &#x6709;&#x51E0;&#x4E2A;void&#x8FD4;&#x56DE;&#x503C;&amp…

    Linux 2023年6月7日
    0132
  • Vue3 封装 Element Plus Menu 无限级菜单组件

    本文分别使用 SFC(模板方式)和 tsx 方式对 Element Plus el-menu 组件进行二次封装,实现配置化的菜单,有了配置化的菜单,后续便可以根据路由动态渲染菜单。…

    Linux 2023年6月7日
    0148
  • 等保测评2.0:Windows安全审计

    1、应启用安全审计功能,审计覆盖到每个用户,对重要的用户行为和重要安全事件进行审计 方案: 在管理工具打开本地安全策略,打开路径:安全设置\本地策略\审核策略,将全部审核策略配置为…

    Linux 2023年6月8日
    087
  • 了解Redis这个核心数据类型

    string 字符串 tring 类型是二进制安全的,即 string&#xA0;中可以包含任何数据。 Redis 中的普通 string 采用 raw encoding …

    Linux 2023年5月28日
    0100
  • redis分布式之codis,twemproxy

    一、codis 1.什么是Codis? Codis 是一个分布式 Redis 解决方案, 对于上层的应用来说, 连接到 Codis Proxy 和连接原生的 Redis Serve…

    Linux 2023年5月28日
    089
  • 用 shell 脚本做 tcp 协议模拟

    问题背景 公司有一套消息推送系统(简称GCM),由于人事变动接手了其中的客户端部分。看了一下文档,仅通讯协议部分有几页简单的说明,代码呢又多又乱,一时理不出一个头绪。由于消息是从后…

    Linux 2023年6月6日
    0144
  • 高等代数:6 二次型 矩阵的合同

    6 二次型 (\cdot) 矩阵的合同 1、定义1:数域K上一个 n元二次型是系数在K中的n个变量的二次齐次多项式,它的一般形式是 [\begin{aligned} &f(…

    Linux 2023年6月8日
    0124
  • podman(无根用户管理podman)

    用户操作在允许没有root特权的用户运行Podman之前,管理员必须安装或构建Podman并完成以下配置cgroup V2Linux内核功能允许用户限制普通用户容器可以使用的资源,…

    Linux 2023年6月7日
    089
  • Celery异步任务

    情景: 用户发起request,并等待response返回。在本些views中,可能需要执行一段耗时的程序,那么用户就会等待很长时间,造成不好的用户体验,比如发送邮件、手机验证码等…

    Linux 2023年6月8日
    091
  • Fastadmin前台Getshell漏洞复现

    Fastadmin前台Getshell漏洞复现 一、简介 FastAdmin是一款基于ThinkPHP5+Bootstrap开发的极速后台开发框架。FastAdmin基于Apach…

    Linux 2023年5月28日
    0125
  • [20210930]bbed读取数据块7 fffext.sh.txt

    [20210930]bbed读取数据块7 fffext.sh.txt –//一般bash shell脚本很少考虑执行效率,仅仅考虑利用它快速解决工作中遇到的问题. &#…

    Linux 2023年6月13日
    089
  • linux中软件的安装方式

    linux中软件的安装方式 四种方式 ​ 源码编译安装 ​ rpm安装 ​ yum安装 解压、配置(hadoop、hive等) 1.源码编译安装 1.为了编译nginx源码 yum…

    Linux 2023年6月11日
    096
  • Shell实现:基本功能

    独立博客阅读地址:https://panqiincs.me/2017/02/26/write-a-shell-basic-functionality/ Shell的功能 Shell…

    Linux 2023年6月7日
    0137
  • linux版的查毒工具 ClamAv 安装脚本

    /bin/bash 安装linux版的查毒工具 clamav 用root执行 保证服务器能访问外网 yum源最好是最新的 创建用户和组 groupadd clamavuseradd…

    Linux 2023年6月13日
    0108
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球