当前位置: 首页 > news >正文

【redis 】string类型详解

string类型详解

    • 一、string类型的概念
    • 二、string类型的常用指令
      • 2.1 SET
      • 2.2 GET
      • 2.3 MSET
      • 2.4 MGET
      • 2.5 SETNX
      • 2.6 INCR
      • 2.7 INCRBY
      • 2.8 DECR
      • 2.9 DECRBY
      • 2.10 INCRBYFLOAT
      • 2.11 APPEND
      • 2.12 GETRANGE
      • 2.13 SETRANGE
      • 2.14 STRLEN
    • 三、string类型的命令小结
    • 四、string类型的内部编码
    • 五、string类型的典型使用场景

一、string类型的概念

字符串类型是 Redis 最基础的数据类型,关于字符串需要特别注意:

  1. ⾸先 Redis 中所有的键的类型都是字符串类型,⽽且其他⼏种数据结构也都是在字符串类似基础上构建的,例如列表和集合的元素类型是字符串类型,所以字符串类型能为其他 4 种数据结构的学习奠定基础。

在这里插入图片描述

  1. 如上图所⽰,字符串类型的值实际可以是字符串,包含⼀般格式的字符串或者类似 JSON、XML 格式的字符串;数字,可以是整型或者浮点型;甚⾄是⼆进制流数据,例如图⽚、⾳频、视频等。不过⼀个字符串的最⼤值不能超过 512 MB。

二、string类型的常用指令

2.1 SET

将 string 类型的 value 设置到 key 中。如果 key 之前存在,则覆盖,⽆论原来的数据类型是什么。之前关于此 key 的 TTL(键值对的过期时间) 也全部失效。

语法:

SET key value [EX seconds|PX milliseconds|KEEPTTL] [NX|XX]

[ ]内是选填项,其他的是必填项

  • EX seconds:以秒作为单位设置key的过期时间

  • PX milliseconds:以毫秒作为单位设置key的过期时间

  • KEEPTTL:保留设置前指定键的生存时间

  • NX:只在key不存在时才设置,如果设置前key已存在,则不执行

  • XX:只在key存在时才设置,如果设置前key不存在,则不执行

返回值:成功返回ok,失败返回nil

使用方法:

  • 当创建的value值没有空格时:可加引号可不加引号没有影响

  • 当创建的value值有空格时需要加引号,否则会报错

//不存在时创建
127.0.0.1:6379> set key nexit nx
OK
127.0.0.1:6379> get key
"nexit"//存在不创建
127.0.0.1:6379> set key look nx
(nil)//存在时创建
127.0.0.1:6379> set key exit xx
OK
127.0.0.1:6379> get key
"exit"//不存在不创建
127.0.0.1:6379> set key1 look xx
(nil)//设置key的过期时间为10127.0.0.1:6379> set key second ex 10
OK
127.0.0.1:6379> get key
"second"//十秒后key被销毁
127.0.0.1:6379> get key
(nil)

2.2 GET

获取 key 对应的 value。如果 key 不存在,返回 nil。如果 value 的数据类型不是 string,会报错。

语法:

GET key

返回值:key 对应的 value,或者 nil 当 key 不存在时

使用方法:

127.0.0.1:6379> set key hello
OK
127.0.0.1:6379> get key
"hello"//没创建key2,找不到
127.0.0.1:6379> get key2
(nil)//key3不是string类型,报错
127.0.0.1:6379> hset key3 name lx
(integer) 1
127.0.0.1:6379> get key3
(error) WRONGTYPE Operation against a key holding the wrong kind of value

2.3 MSET

⼀次性设置多个 key 的值

MSET key value [key value ...]

返回值:永远是 OK

使用方法:

127.0.0.1:6379> mset key1 'name' key2 'age'
OK
127.0.0.1:6379> get key1
"name"
127.0.0.1:6379> get key2
"age"

2.4 MGET

⼀次性获取多个 key 的值。如果对应的 key 不存在或者对应的数据类型不是 string,返回 nil

语法:

MGET key [key ...]

返回值:对应 value 的列表

使用方法:

127.0.0.1:6379> mset key1 'hello' key2 'world' key3 'redis'
OK
127.0.0.1:6379> mget key1 key2 key3
1) "hello"
2) "world"
3) "redis"

多次get 和单次mget的区别:

多次get会客户端会和服务器进行多次网络通信

在这里插入图片描述

单次mget客户端和服务器只进行一次网络通信

在这里插入图片描述

使⽤ mget / mset 由于可以有效地减少了⽹络时间,所以性能相较更⾼。假设⽹络耗时 1 毫秒,命令执⾏时间耗时 0.1 毫秒,则执⾏时间如表 所⽰

1000 次 get 和 1 次 mget 对⽐

操作时间
1000 次 get1000 x 1 + 1000 x 0.1 = 1100 毫秒
1 次 mget 1000 个键1 x 1 + 1000 x 0.1 = 101 毫秒

学会使⽤批量操作,可以有效提⾼业务处理效率,但是要注意,每次批量操作所发送的键的数量也不是⽆节制的,否则可能造成单⼀命令执⾏时间过⻓,导致 Redis 阻塞

2.5 SETNX

设置 key-value 但只允许在 key 之前不存在的情况下

语法:

SETNX key value

返回值:1 表⽰设置成功。0 表⽰没有设置

使用方法:

127.0.0.1:6379> setnx key 'hello'
(integer) 1
127.0.0.1:6379> setnx key 'nihao'
(integer) 0
127.0.0.1:6379> get key
"hello"

SET、SET NX 和 SET XX 的执⾏流程如图 :
在这里插入图片描述

2.6 INCR

将 key 对应的 string 表⽰的数字加⼀。如果 key 不存在,则视为 key 对应的 value 是 0。如果 key 对应的 string 不是⼀个整型或者范围超过了 64 位有符号整型,则报错

语法:

INCR key

返回值:integer 类型的加完后的数值

使用方法:

//key 不存在,0 + 1 = 1
127.0.0.1:6379> exists key
(integer) 0
127.0.0.1:6379> incr key
(integer) 1//整数类型,可以直接加1
127.0.0.1:6379> set key '20'
OK
127.0.0.1:6379> incr key
(integer) 21//超出了整数类型,报错
127.0.0.1:6379> set key '234293482390480948029348230948'
OK
127.0.0.1:6379> incr key
(error) ERR value is not an integer or out of range//不是整数类型,报错
127.0.0.1:6379> set key 'not a number'
OK
127.0.0.1:6379> incr key
(error) ERR value is not an integer or out of range

2.7 INCRBY

将 key 对应的 string 表⽰的数字加上对应的值。如果 key 不存在,则视为 key 对应的 value 是 0。如果 key 对应的 string 不是⼀个整型或者范围超过了 64 位有符号整型,则报错

语法:

INCRBY key decrement

返回值:integer 类型的加完后的数值

使用方法:

//key 不存在,0 + 1 = 1
127.0.0.1:6379> exists key
(integer) 0
127.0.0.1:6379> incrby key 3
(integer) 3//整数类型,可以直接加3
127.0.0.1:6379> set key '10'
OK
127.0.0.1:6379> incrby key 3
(integer) 13//不能使用非整数类型来加,报错
127.0.0.1:6379> incrby key 'not a number'
(error) ERR value is not an integer or out of range//所加以后的值超出整数类型,报错
127.0.0.1:6379> incrby key '234293482390480948029348230948'
(error) ERR value is not an integer or out of range//不能对非整数类型相加
127.0.0.1:6379> set key 'not a number'
OK
127.0.0.1:6379> incrby key 3
(error) ERR value is not an integer or out of range

2.8 DECR

将 key 对应的 string 表⽰的数字减⼀。如果 key 不存在,则视为 key 对应的 value 是 0。如果 key 对应的 string 不是⼀个整型或者范围超过了 64 位有符号整型,则报错

语法:

DECR key

返回值:integer 类型的减完后的数值

使用方法:

//对整数相减
127.0.0.1:6379> exists key
(integer) 0
127.0.0.1:6379> decr key
(integer) -1
127.0.0.1:6379> set key '10'
OK
127.0.0.1:6379> decr key
(integer) 9//超出整数范围,报错
127.0.0.1:6379> set key '234293482390480948029348230948'
OK
127.0.0.1:6379> decr key
(error) ERR value is not an integer or out of range//不是整数类型,报错
127.0.0.1:6379> set key 'not a number'
OK
127.0.0.1:6379> decr key
(error) ERR value is not an integer or out of range

2.9 DECRBY

将 key 对应的 string 表⽰的数字减去对应的值。如果 key 不存在,则视为 key 对应的 value 是 0。如果 key 对应的 string 不是⼀个整型或者范围超过了 64 位有符号整型,则报错。

语法:

DECRBY key decrement

返回值:integer 类型的减完后的数值

使用方法:

//对整数类型直接相减
127.0.0.1:6379> exists key
(integer) 0
127.0.0.1:6379> decrby key 3
(integer) -3
127.0.0.1:6379> set key '10'
OK
127.0.0.1:6379> decrby key 3
(integer) 7//不能使用非整数类型来减
127.0.0.1:6379> decrby key 'not a number'
(error) ERR value is not an integer or out of range//超出了整数类型,报错
127.0.0.1:6379> set key '234293482390480948029348230948'
OK
127.0.0.1:6379> decrby key
(error) ERR wrong number of arguments for 'decrby' command//对非整数类型相减,报错
127.0.0.1:6379> set key 'not a number'
OK
127.0.0.1:6379> decrby key 3
(error) ERR value is not an integer or out of range

2.10 INCRBYFLOAT

将 key 对应的 string 表⽰的浮点数加上对应的值。如果对应的值是负数,则视为减去对应的值。如果 key 不存在,则视为 key 对应的 value 是 0。如果 key 对应的不是 string,或者不是⼀个浮点数,则报错。允许采⽤科学计数法表⽰浮点数。

语法:

INCRBYFLOAT key increment

返回值:加/减完后的数值

使用方法:

//正数时,相加
127.0.0.1:6379> set key 10.10
OK
127.0.0.1:6379> incrbyfloat key 0.1
"10.2"负数时,相减
127.0.0.1:6379> incrbyfloat key -6
"4.2"
127.0.0.1:6379> set key 6.0e3
OK
127.0.0.1:6379> incrbyfloat key 2.0e3
"8000"

很多存储系统和编程语⾔内部使⽤ CAS 机制实现计数功能,会有⼀定的 CPU 开销,但在 Redis 中完全不存在这个问题,因为 Redis 是单线程架构,任何命令到了 Redis 服务端都要顺序执⾏

2.11 APPEND

语法:

APPEND KEY VALUE

返回值:追加完成之后 string 的⻓度

使用方法:

127.0.0.1:6379> get key
(nil)
127.0.0.1:6379> append key 'hello'
(integer) 5
127.0.0.1:6379> get key
"hello"
127.0.0.1:6379> append key 'world'
(integer) 10
127.0.0.1:6379> get key
"helloworld"

2.12 GETRANGE

返回 key 对应的 string 的⼦串,由 start 和 end 确定(左闭右闭)。可以使⽤负数表⽰倒数。-1 代表倒数第⼀个字符,-2 代表倒数第⼆个,其他的与此类似。超过范围的偏移量会根据 string 的⻓度调整成正确的值。

语法:

GETRANGE key start end

返回值:string 类型的⼦串

使用方法:

127.0.0.1:6379> set key 'this is a string'
OK
127.0.0.1:6379> getrange key 0 3
"this"
127.0.0.1:6379> getrange key -3 -1
"ing"
127.0.0.1:6379> getrange key 0 -1
"this is a string"

2.13 SETRANGE

覆盖字符串的⼀部分,从指定的偏移开始

语法:

SETRANGE key offset value

返回值:替换后的 string 的⻓度

使用方法:

127.0.0.1:6379> set key 'hello world'
OK
127.0.0.1:6379> setrange key 6 'redis'
(integer) 11
127.0.0.1:6379> get key
"hello redis"//如果key不存在,从零位置开始替换不会报错
127.0.0.1:6379> setrange key1 0 'hello'
(integer) 5
127.0.0.1:6379> get key1
"hello"//key不存在,从0以后的位置开始会报错
127.0.0.1:6379> set range key2 3 'hello'
(error) ERR syntax error

2.14 STRLEN

获取 key 对应的 string 的⻓度。当 key 存放的类似不是 string 时,报错

语法:

STRLEN key

返回值:string 的⻓度。或者当 key 不存在时,返回 0

使用方法:

127.0.0.1:6379> set key 'hello world'
OK
127.0.0.1:6379> strlen key
(integer) 11
127.0.0.1:6379> strlen nonexisting
(integer) 0

三、string类型的命令小结

命令执⾏效果时间复杂度
set key value [key value…]设置 key 的值是 valueO(k), k 是键个数
get key获取 key 的值O(1)
del key [key …]删除指定的 keyO(k), k 是键个数
mset key value [key value …]批量设置指定的 key 和 valueO(k), k 是键个数
mget key [key …]批量获取 key 的值O(k), k 是键个数
incr key指定的 key 的值 +1O(1)
decr key指定的 key 的值 -1O(1)
incrby key n指定的 key 的值 +nO(1)
decrby key n指定的 key 的值 -nO(1)
incrbyfloat key n指定的 key 的值 +nO(1)
append key value指定的 key 的值追加 valueO(1)
strlen key获取指定 key 的值的⻓度O(1)
setrange key offset value覆盖指定 key 的从 offset 开始的部分值O(n),n 是字符串⻓度, 通常视为 O(1)
getrange key start end获取指定 key 的从 start 到 end 的部分值O(n),n 是字符串⻓度, 通常视为 O(1)

四、string类型的内部编码

字符串类型的内部编码有 3 种:

  1. int:8 个字节的⻓整型。

  2. embstr:⼩于等于 39 个字节的字符串

  3. raw:⼤于 39 个字节的字符串

Redis 会根据当前值的类型和⻓度动态决定使⽤哪种内部编码实现

整型类型⽰例如下:

127.0.0.1:6379> set key 6379
OK
127.0.0.1:6379> object encoding key
"int"

短字符串⽰例如下:

//⼩于等于 39 个字节的字符串
127.0.0.1:6379> set key "hello"
OK
127.0.0.1:6379> object encoding key
"embstr"

⻓字符串⽰例如下:

//⼤于 39 个字节的字符串
127.0.0.1:6379> set key "one string greater than 39 bytes ........"
OK
127.0.0.1:6379> object encoding key
"raw"

五、string类型的典型使用场景

缓存(Cache)功能

  • 下图 是⽐较典型的缓存使⽤场景,其中 Redis 作为缓冲层,MySQL 作为存储层,绝⼤部分请求的数据都是从 Redis 中获取。由于 Redis 具有⽀撑⾼并发的特性,所以缓存通常能起到加速读写和降低后端压⼒的作⽤

计数(Counter)功能

  • 许多应⽤都会使⽤ Redis 作为计数的基础⼯具,它可以实现快速计数、查询缓存的功能,同时数据可以异步处理或者落地到其他数据源。例如视频⽹站的视频播放次数可以使⽤ Redis 来完成:⽤⼾每播放⼀次视频,相应的视频播放数就会⾃增 1

共享会话(Session)

  • ⼀个分布式 Web 服务将⽤⼾的 Session 信息(例如⽤⼾登录信息)保存在各⾃的服务器中,但这样会造成⼀个问题:出于负载均衡的考虑,分布式服务会将⽤⼾的访问请求均衡到不同的服务器上,并且通常⽆法保证⽤⼾每次请求都会被均衡到同⼀台服务器上,这样当⽤⼾刷新⼀次访问是可能会发现需要重新登录,这个问题是⽤⼾⽆法容忍的

⼿机验证码

  • 很多应⽤出于安全考虑,会在每次进⾏登录时,让⽤⼾输⼊⼿机号并且配合给⼿机发送验证码,然后让⽤⼾再次输⼊收到的验证码并进⾏验证,从⽽确定是否是⽤⼾本⼈。为了短信接⼝不会频繁访问,会限制⽤⼾每分钟获取验证码的频率,例如⼀分钟不能超过 5 次

以上介绍了使⽤ Redis 的字符串数据类型可以使⽤的⼏个场景,但其适⽤场景远不⽌于此 。

相关文章:

【redis 】string类型详解

string类型详解 一、string类型的概念二、string类型的常用指令2.1 SET2.2 GET2.3 MSET2.4 MGET2.5 SETNX2.6 INCR2.7 INCRBY2.8 DECR2.9 DECRBY2.10 INCRBYFLOAT2.11 APPEND2.12 GETRANGE2.13 SETRANGE2.14 STRLEN 三、string类型的命令小结四、string类型的内部编码五、strin…...

Vue.js 学习总结(13)—— Vue3 version 计数介绍

前言 Vue3.5 提出了两个重要概念:version计数和双向链表,作为在内存和计算方面性能提升的最大功臣。既然都重要,那就单挑 version 计数来介绍,它在依赖追踪过程中,起到快速判断依赖项有没有更新的作用,所以…...

【数据结构】【线性表】一文讲完队列(附C语言源码)

队列 队列的基本概念基本术语基本操作 队列的顺序实现顺序队列结构体的创建顺序队列的初始化顺序队列入队顺序队列出队顺序队列存在的问题分析循环队列代码汇总 队列的链式实现链式队列的创建链式队列初始化-不带头结点链式队列入队-不带头节点链式队列出队-不带头结点带头结点…...

2024年11月最新 Alfred 5 Powerpack (MACOS)下载

在现代数字化办公中,我们常常被繁杂的任务所包围,而时间的高效利用成为一项核心需求。Alfred 5 Powerpack 是一款专为 macOS 用户打造的高效工作流工具,以其强大的定制化功能和流畅的用户体验,成为众多效率爱好者的首选。 点击链…...

ODBC连接PostgreSQL数据库后,网卡DOWN后,客户端进程阻塞问题解决方法

问题现象:数据库客户端进程数据库连接成功后,再把跟数据库交互的网卡down掉,客户端进程就会阻塞,无法进行其他处理。该问题跟TCP keepalive机制有关。 可以在odbc.ini文件中增加相应的属性来解决,在odbc.ini 增加如下…...

VsCode使用git提交很慢(一直显示在提交)_vscode commit很慢解决方法

VsCode使用git提交很慢(一直显示在提交)_vscode commit很慢...

linux从0到1——shell编程9

声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&a…...

计算机网络技术专业,热门就业方向和就业前景

前言 在数字化飞速发展的今天,计算机网络技术专业成为了众多学子和职场人士关注的焦点。这一专业不仅涵盖了计算机硬件、软件和网络通信等多个领域的知识,更在就业市场上展现出强大的竞争力。本文将带您一探计算机网络技术专业的就业方向和就业前景&…...

C++中定义类型名的方法

什么是 C 中的类型别名和 using 声明? 类型别名与using都是为了提高代码的可读性。 有两种方法可以定义类型别名 一种是使用关键字typedef起别名使用别名声明来定义类型的别名,即使用using. typedef 关键字typedef作为声明语句中的基本数据类型的一…...

从零开始学习 sg200x 多核开发之 camera-sensor 添加与测试

sg2002 集成了 H.264 视频压缩编解码器, H.265 视频压缩编码器和 ISP;支持 HDR 宽动态、3D 降噪、除雾、镜头畸变校正等多种图像增强和矫正算法。 sophpi 中没有提供相关图像 sensor。本次实验是在 milkv-duo256m 上添加 GC2083。 GC2083 格科微的 GC2083 是一款…...

前端三剑客(二):CSS

目录 1. CSS 基础 1.1 什么是 CSS 1.2 语法格式 1.3 引入方式 1.3.1 行内样式 1.3.2 内部样式 1.3.3 外部样式 1.4 CSS 编码规范 2. 选择器 2.1 标签选择器 2.2 id 选择器 2.3 class 选择器(类选择器) 2.4 复合选择器 2.5 通配符选择器 3. 常用 CSS 样式 3.1 c…...

国土变更调查拓扑错误自动化修复工具的研究

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 一、拓扑错误的形成原因 1.边界不一致 2.不规则图形 3.尖锐角 4.局部狭长 5.细小碎面 6.更新层相互重叠 二、修复成果展示 1.边界不一致 2.不规则图形 3.尖锐角 4.局部狭…...

深度学习图像视觉 RKNN Toolkit2 部署 RK3588S边缘端 过程全记录

深度学习图像视觉 RKNN Toolkit2 部署 RK3588S边缘端 过程全记录 认识RKNN Toolkit2 工程文件学习路线: Anaconda Miniconda安装.condarc 文件配置镜像源自定义conda虚拟环境路径创建Conda虚拟环境 本地训练环境本地转换环境安装 RKNN-Toolkit2:添加 lin…...

Linux应用编程(C语言编译过程)

目录 1. 举例 2.预处理 2.1 预处理命令 2.2 .i文件内容解读 3.编译 4.汇编 5.链接 5.1 链接方式 5.1.1 静态链接 5.1.2 动态链接 5.1.3 混合链接 1. 举例 Linux的C语言开发,一般选择GCC工具链进行编译,通过下面的例子来演示GCC如何使用&#…...

ssm实战项目──哈米音乐(二)

目录 1、流派搜索与分页 2、流派的添加 3、流派的修改 4、流派的删除 接上篇:ssm实战项目──哈米音乐(一),我们完成了项目的整体搭建,接下来进行后台模块的开发。 首先是流派模块: 在该模块中采用分…...

Python 获取微博用户信息及作品(完整版)

在当今的社交媒体时代,微博作为一个热门的社交平台,蕴含着海量的用户信息和丰富多样的内容。今天,我将带大家深入了解一段 Python 代码,它能够帮助我们获取微博用户的基本信息以及下载其微博中的相关素材,比如图片等。…...

Flink学习连载第二篇-使用flink编写WordCount(多种情况演示)

使用Flink编写代码,步骤非常固定,大概分为以下几步,只要牢牢抓住步骤,基本轻松拿下: 1. env-准备环境 2. source-加载数据 3. transformation-数据处理转换 4. sink-数据输出 5. execute-执行 DataStream API开发 //n…...

拉格朗日乘子(Lagrange Multiplier)是数学分析中用于解决带有约束条件的优化问题的一种重要方法,特别是SVM

拉格朗日乘子(Lagrange Multiplier)是数学分析中用于解决带有约束条件的优化问题的一种重要方法,也称为拉格朗日乘数法。 例如之前博文写的2月7日 SVM&线性回归&逻辑回归在支持向量机(SVM)中,为了…...

鸿蒙征文|鸿蒙心路旅程:始于杭研所集训营,升华于横店

始于杭研所 在2024年7月,我踏上了一段全新的旅程,前往风景如画的杭州,参加华为杭研所举办的鲲鹏&昇腾集训营。这是一个专门为开发者设计的培训项目,中途深入学习HarmonyOS相关技术。对于我这样一个对技术充满热情的学生来说&…...

c语言数据结构与算法--简单实现线性表(顺序表+链表)的插入与删除

老规矩,点赞评论收藏关注!!! 目录 线性表 其特点是: 算法实现: 运行结果展示 链表 插入元素: 删除元素: 算法实现 运行结果 线性表是由n个数据元素组成的有限序列&#xff…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

作为测试我们应该关注redis哪些方面

1、功能测试 数据结构操作&#xff1a;验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化&#xff1a;测试aof和aof持久化机制&#xff0c;确保数据在开启后正确恢复。 事务&#xff1a;检查事务的原子性和回滚机制。 发布订阅&#xff1a;确保消息正确传递。 2、性…...

C语言中提供的第三方库之哈希表实现

一. 简介 前面一篇文章简单学习了C语言中第三方库&#xff08;uthash库&#xff09;提供对哈希表的操作&#xff0c;文章如下&#xff1a; C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...

JS红宝书笔记 - 3.3 变量

要定义变量&#xff0c;可以使用var操作符&#xff0c;后跟变量名 ES实现变量初始化&#xff0c;因此可以同时定义变量并设置它的值 使用var操作符定义的变量会成为包含它的函数的局部变量。 在函数内定义变量时省略var操作符&#xff0c;可以创建一个全局变量 如果需要定义…...

2025年低延迟业务DDoS防护全攻略:高可用架构与实战方案

一、延迟敏感行业面临的DDoS攻击新挑战 2025年&#xff0c;金融交易、实时竞技游戏、工业物联网等低延迟业务成为DDoS攻击的首要目标。攻击呈现三大特征&#xff1a; AI驱动的自适应攻击&#xff1a;攻击流量模拟真实用户行为&#xff0c;差异率低至0.5%&#xff0c;传统规则引…...