【redis】hash和list常用命令

news2025/1/12 23:17:13

hash类型

Redis自身已经是键值对结构了。Redis自身的键值对就是通过哈希的方式来组织的。

把key这一层组织完成之后,到了value这一层。value的其中一种类型还可以再是哈希。哈希类型中的映射关系通常称为field-value,用于区分Redis整体的键值对(key-value)。注意这里的 value 是指 field 对应的值,不是键(key)对应的值,请注意 value 在不同上下文的作用。

redis命令官网查询

查询命令:

image-20240416153541597

hset hget hexists hdel

hset hget:

hset:设置hash中指定的字段(field)的值(value)。

语法:HSET key field value [field value …]

时间复杂度:插入一组field为0(1),插入N组field为O(N)

返回值:添加的字段的个数。

hget:获取hash中指定字段的值。

语法:HGET key field

时间复杂度:0(1)

返回值:字段对应的值或者nil。

127.0.0.1:6379> flushall
OK
127.0.0.1:6379> hset key f1  111
(integer) 1
127.0.0.1:6379> hset key f2  222 f3 333 f4 444
(integer) 3
127.0.0.1:6379> hget key f1
"111"
127.0.0.1:6379> hget key f2
"222"
127.0.0.1:6379> hget key f100
(nil)
127.0.0.1:6379> hget key2 f1
(nil)

hexists hdel:

hexists:判断hash中是否有指定的字段。

语法:HEXISTS key field

时间复杂度:0(1)

返回值:1表示存在,0表示不存在。

hdel:删除hash中指定的字段。

时间复杂度:删除一个元素为O(1).删除N个元素为O(N).

返回值:本次操作删除的字段个数。

-- hexists 命令
127.0.0.1:6379> hexists key f1
(integer) 1
127.0.0.1:6379> hexists key f2
(integer) 1
127.0.0.1:6379> hexists key f100
(integer) 0
127.0.0.1:6379> hexists key2 f1
(integer) 0
-- hdel命令
127.0.0.1:6379> hdel key f1
(integer) 1
127.0.0.1:6379> hexists key f1
(integer) 0
127.0.0.1:6379> hdel key f2 f3
(integer) 2
127.0.0.1:6379> hget key f4
"444"
127.0.0.1:6379> hget key f3
(nil)
127.0.0.1:6379> hget key f2
(nil)
127.0.0.1:6379> hdel key f1
(integer) 0

注意区分hdel和del.

del是删除整个键值对。hdel只是删除一个键值中值是hash类型的一个键值对。

hkeys hvals

hkeys:获取hash中的所有字段。

语法:HKEYS key

时间复杂度:O(N),N为field的个数.

返回值:字段列表。

hvals:和hkeys相对。能够获取到hash中的所有value

语法:HVALS key

时间复杂度:O(N),N为field的个数.

返回值:所有的值。

127.0.0.1:6379> flushall
OK
127.0.0.1:6379> hset key f1 111 f2 222 f3 333 f4 444
(integer) 4
127.0.0.1:6379> hkeys key
1) "f1"
2) "f2"
3) "f3"
4) "f4"
127.0.0.1:6379> hvals key
1) "111"
2) "222"
3) "333"
4) "444"

hgetall hmget

hgetall:获取hash中的所有字段以及对应的值。

语法:HGETALL key

时间复杂度:O(N),N为field的个数.

返回值:字段和对应的值。

hmget:一次获取hash中多个字段的值。

语法:HMGET key field [field …]

时间复杂度:只查询一个元素为0(1),查询多个元素为O(N),N为了查询元素个数。

返回值:字段对应的值或者nil。

127.0.0.1:6379> hgetall key
1) "f1"
2) "111"
3) "f2"
4) "222"
5) "f3"
6) "333"
7) "f4"
8) "444"
127.0.0.1:6379> hmget key f1 f2 f3
1) "111"
2) "222"
3) "333"

有没有hmset,一次设置多个field和value呢?答案是又的,但是,并不需要使用.hset已经支持一次设置多个field和value了。

上述hkeys,hvals,hgetall都是存在一定风险的.hash的元素个数太多,执行的耗时会比较长,从而阻塞redis。可以采用,hscan遍历redis的hash.但是它属于"渐进式遍历"。

hlen hsetnx

hlen

语法:hlen key

获取 hash 的元素个数,不需要遍历的

返回值:hash 的元素个数

hsetnx

语法:hsetnx key field value

类似于setnx.不存在的时候,才能设置成功.如果存在,则失败.

返回值:1 - 成功 0 - 失败

127.0.0.1:6379> hlen key
(integer) 4
127.0.0.1:6379> hgetall key
1) "f1"
2) "111"
3) "f2"
4) "222"
5) "f3"
6) "333"
7) "f4"
8) "444"
-- hsetnx.不存在的时候,才能设置成功.如果存在,则失败.
127.0.0.1:6379> hsetnx key f5 555
(integer) 1
127.0.0.1:6379> hsetnx key f5 666
(integer) 0
127.0.0.1:6379> hget key f5
"555"

hincrby hincrbyfloat

hash 这里的 value,也可以当做数字来处理,hincrby 就可以加减整数。hincrbyfloat 就可以加减小数。使用频率不算很高,redis 没有提供类似于 incr decr。

127.0.0.1:6379> hincrby key f1 10
(integer) 121
127.0.0.1:6379> hincrby key f1 -20
(integer) 101
127.0.0.1:6379> hget key f1
"101"
127.0.0.1:6379> hincrbyfloat key f1 0.5
"101.5"
127.0.0.1:6379> hincrbyfloat key f1 -2.5
"99"

hash编码

  1. 哈希中的元素个数比较少,使用ziplist表示.元素个数比较多,使使用hashtable来表示
  2. 每个value的值长度都比较短,使用ziplist表示.如果某个value的长度太长了,也会转换成hashtable
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> hset key f1 111
(integer) 1
127.0.0.1:6379> object encoding key
"ziplist"
127.0.0.1:6379> hset key f2 222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222
(integer) 1
127.0.0.1:6379> object encoding key
"hashtable"

list 列表类型

列表 (List) 相当于 数组 或者 顺序表。

注意,list内部的结果(编码方式)。并非是一个简单的数组。而是更接近于"双端队列"(deque)。

约定最左侧元素下标是0,redis的下标支持负数下标。支持头插头删,尾插尾删

列表中的元素是有序的,"有序"的含义,要根据上下文区分。有的时候,谈到有序,指的是**“升序”,“降序”,有的时候,谈到的有序指的是,顺序很关键**。redis的list类型指的就是后者,如果把元素位置颠倒,顺序调换。此时得到的新的List和之前的List是不等价的。

列表中的元素是允许元素重复的。为当前的 List,头和尾都能高效的插入删除元素,就可以把这个 List 当做一个 栈/队列来使用了。Redis 有一个典型的应用场景,就是作为消息队列最早的时候, 就是通过 List 类型。
类型后来 Redis 又提供了一个stream类型来作为消息列。

lpush 和 lrange

lpush:头插,一次可以插入一个元素,也可以插入多个元素。

语法:LPUSH key element [element …]

时间复杂度O(1)。返回值是list的长度.

注意事项:

如果key已经存在,并且key对应的value类型,不是list,此时Ipush命令就要报错。redis中所有的这些各种数据类型的操作,都是类似的效果。

Irange命令查看list中指定范围的元素.

LRANGE key start stop

此处描述的区间也是闭区间,下标支持负数。

127.0.0.1:6379> flushall
OK
127.0.0.1:6379> lpush key 1 2 3 4
(integer) 4
127.0.0.1:6379> lpush key 5 6 7 8
(integer) 8
127.0.0.1:6379> lrange key 0 -1
1) "8"
2) "7"
3) "6"
4) "5"
5) "4"
6) "3"
7) "2"
8) "1"
-- 数组越界的情况:
-- Redis 的做法, 是直接尽可能的获取到给定区间的元素, 
-- 如果给定区间非法,比如超出下标。就会尽可能的获取对应的内容。
127.0.0.1:6379> lrange key  0 100
1) "8"
2) "7"
3) "6"
4) "5"
5) "4"
6) "3"
7) "2"
8) "1"
127.0.0.1:6379> lrange key  10 100
(empty array)

"鲁棒性“(你对我越粗鲁,我就表现的越棒)。程序的容错能力更强。

lpushx

lpushx和lpush的操作基本一致,不同之处在于,lpushx在key存在时,将一个或者多个元素从左侧放入(头插)到list中。不存在,直接返回。

127.0.0.1:6379> lpushx key 9 10 11 12
(integer) 12
127.0.0.1:6379> lrange key 0 -1
 1) "12"
 2) "11"
 3) "10"
 4) "9"
 5) "8"
 6) "7"
 7) "6"
 8) "5"
 9) "4"
10) "3"
11) "2"
12) "1"
127.0.0.1:6379> lpushx key2 1 2 3 4
(integer) 0
127.0.0.1:6379> lrange key2 0 -1
(empty array)
127.0.0.1:6379> exists key2
(integer) 0

rpush 和 rpushx

rpush 和 rpushx 这一组命令和lpush 和 lpushx用法基本一致,但是表示的并不是头插了,表示的是尾插。

127.0.0.1:6379> flushall
OK
127.0.0.1:6379> rpush key 1 2 3 4
(integer) 4
127.0.0.1:6379> rpush key 5 6 7 8
(integer) 8
127.0.0.1:6379> lrange key 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
7) "7"
8) "8"
-- rpushx 有则尾插,无则不操作
127.0.0.1:6379> rpushx key 9 10 11 12
(integer) 12
127.0.0.1:6379> lrange key 0 -1
 1) "1"
 2) "2"
 3) "3"
 4) "4"
 5) "5"
 6) "6"
 7) "7"
 8) "8"
 9) "9"
10) "10"
11) "11"
12) "12"
127.0.0.1:6379> rpushx key2 1 2 3 4
(integer) 0
127.0.0.1:6379> lrange key2 0 -1
(empty array)
127.0.0.1:6379> exists key2
(integer) 0

lpop 和 rpop

lpop : 从list左侧取出元素(即头删)

rpop : 从list右侧取出元素(即尾删)

操作:LPOP key

操作:RPOP key [count]

LPOP 和 RPOP。从redis6.2版本,新增了一个count参数。count就描述这次要删几个元素。

返回值:取出的元素或者nil

时间复杂度:O(1)

127.0.0.1:6379> flushall
OK
127.0.0.1:6379> rpush key 1 2 3 4
(integer) 4
127.0.0.1:6379> lrange key 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379> lpop key
"1"
127.0.0.1:6379> lpop key
"2"
127.0.0.1:6379> lrange key 0 -1
1) "3"
2) "4"
127.0.0.1:6379> lpop key
"3"
127.0.0.1:6379> lpop key
"4"
127.0.0.1:6379> lrange key 0 -1
(empty array)
127.0.0.1:6379> lpop key
(nil)
-- rpop
127.0.0.1:6379> rpush key 1 2 3 4
(integer) 4
127.0.0.1:6379> lrange key 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379> rpop key
"4"
127.0.0.1:6379> lrange key 0 -1
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> rpop key
"3"
127.0.0.1:6379> rpop key
"2"
127.0.0.1:6379> rpop key
"1"
127.0.0.1:6379> lrange key 0 -1
(empty array)
127.0.0.1:6379> rpop key
(nil)

lindex 和 linsert ,llen

lindex:给定下标,获取到对应的元素.

语法:LINDEX key index

返回值:取出的元素。如果下标非法,返回的是nil

linsert:在特定位置插入元素

语法:LINSERT key <BEFORE/AFTER> pivot element

BEFORE:指定位置之前

AFTER:指定位置之后

返回值是插入之后,得到的新的list的长度。

时间复杂度:O(N) 此处N指的是list中的元素个数。

如果要插入的列表中,基准值存在多个,怎么办?

linsert进行插入的时候,要根据基准值,找到对应的位置.从左往右找,找到第一个符合基准值的位置即可.

llen 命令:获取list⻓度

127.0.0.1:6379> rpush key 1 2 3 4 5 6 7 8
(integer) 8
127.0.0.1:6379> lindex key 3
"4"
127.0.0.1:6379> lindex key -1
"8"
127.0.0.1:6379> lindex key 100
(nil)
-- linsert命令
127.0.0.1:6379> linsert key before 4 100
(integer) 9
127.0.0.1:6379> lrange key 0 -1
1) "1"
2) "2"
3) "3"
4) "100"
5) "4"
6) "5"
7) "6"
8) "7"
9) "8"
127.0.0.1:6379> linsert key after 4 200
(integer) 10
127.0.0.1:6379> lrange key 0 -1
 1) "1"
 2) "2"
 3) "3"
 4) "100"
 5) "4"
 6) "200"
 7) "5"
 8) "6"
 9) "7"
10) "8"
-- linsert进行插入的时候,要根据基准值,找到对应的位置.从左往右找,找到第一个符合基准值的位置即可.
127.0.0.1:6379> rpush key 4
(integer) 11
127.0.0.1:6379> lrange key 0 -1
 1) "1"
 2) "2"
 3) "3"
 4) "100"
 5) "4"
 6) "200"
 7) "5"
 8) "6"
 9) "7"
10) "8"
11) "4"
127.0.0.1:6379> linsert key before 4 300
(integer) 12
127.0.0.1:6379> lrange key 0 -1
 1) "1"
 2) "2"
 3) "3"
 4) "100"
 5) "300"
 6) "4"
 7) "200"
 8) "5"
 9) "6"
10) "7"
11) "8"
12) "4"
-- llen命令
127.0.0.1:6379> llen key
(integer) 12
127.0.0.1:6379> llen key2
(integer) 0

lrem

Irem: 删除列表中的元素
rem => remove

语法:LREM key count element

  • count :要删除的个数
  • element : 要删除的值
    • count > 0 从左往右删,
    • count < 0 从右往左删
    • count = 0 删除全部

准备工作:

127.0.0.1:6379> flushall
OK
127.0.0.1:6379> rpush key 1 2 3 4
(integer) 4
127.0.0.1:6379> rpush key 1 2 3 4
(integer) 8
127.0.0.1:6379> rpush key 1 2 3 4
(integer) 12
127.0.0.1:6379> rpush key 1 2 3 4
(integer) 16
127.0.0.1:6379> lrange key 0 -1
 1) "1"
 2) "2"
 3) "3"
 4) "4"
 5) "1"
 6) "2"
 7) "3"
 8) "4"
 9) "1"
10) "2"
11) "3"
12) "4"
13) "1"
14) "2"
15) "3"
16) "4"

代码案例:

删除左侧两个元素。

127.0.0.1:6379> lrem key 2 1
(integer) 2
127.0.0.1:6379> lrange key 0 -1
 1) "2"
 2) "3"
 3) "4"
 4) "2"
 5) "3"
 6) "4"
 7) "1"
 8) "2"
 9) "3"
10) "4"
11) "1"
12) "2"
13) "3"
14) "4"

删除右侧两个元素。

127.0.0.1:6379> lrem key -2 1
(integer) 2
127.0.0.1:6379> lrange key 0 -1
 1) "1"
 2) "2"
 3) "3"
 4) "4"
 5) "1"
 6) "2"
 7) "3"
 8) "4"
 9) "2"
10) "3"
11) "4"
12) "2"
13) "3"
14) "4"

删除全部:

127.0.0.1:6379> lrem key 0 1
(integer) 4
127.0.0.1:6379> lrange key 0 -1
 1) "2"
 2) "3"
 3) "4"
 4) "2"
 5) "3"
 6) "4"
 7) "2"
 8) "3"
 9) "4"
10) "2"
11) "3"
12) "4"

ltrim 和 lset

ltrim

语法:LTRIM key start stop

含义:保留start和stop之间区间内的元素(区间外面两边的元素就直接玻删除了)

lset

语法:LSET key index element

含义:根据下标,修改元素

如果输入的index非法,会直接报错。lindex可以很好从处理下标越界的情况,直接返回nil。lset来说则会报错,不会像js那样,直接在10这个下标这里搞出个元素来。

127.0.0.1:6379> flushall
OK
127.0.0.1:6379> rpush key 1 2 3 4 5 6 7 8
(integer) 8
127.0.0.1:6379> ltrim key 2 5
OK
127.0.0.1:6379> lrange key 0 -1
1) "3"
2) "4"
3) "5"
4) "6"
-- lset 命令
127.0.0.1:6379> lset key 2 100
OK
127.0.0.1:6379> lrange key   0 -1
1) "3"
2) "4"
3) "100"
4) "6"
-- 如果越界就会报错
127.0.0.1:6379> lset key 10 200
(error) ERR index out of range

阻塞版本的命令brpop和blpop

阻塞:当前的线程,不走了,代码不继续执行了.会在满足一定的条件之后,被唤醒。

如果list中存在元素,blpop和brpop就和lpop 以及rpop作用完全相同。如果list中为空,blpop和brpop就会产生阻塞.一直阻塞到队列不空为止。

但阻塞版本会根据timeout,阻塞一段时间。期间Redis可以执行其他命令。此处的blpop和brpop看起来
好像耗时很久,但是实际上并不会对redis服务器产生负面影响。

  • 命令中如果设置了多个键,那么会从左向右进行遍历键,一旦有一个键对应的列表中可以弹出元素,命令立即返回。
    • blpop和brpop都是可以同时去尝试获取多个key的列表的元素的。
    • 多个key对应多个list。这多个list哪个有元素了,就会返回哪个元素。
  • 如果多个客户端同时针对同一个键执行pop,则最先执行命令的客户端会得到弹出的元素。

语法:BLPOP key [key …] timeout

  1. 针对一个非空的列表进行操作
127.0.0.1:6379> flushall 
OK
127.0.0.1:6379> rpush key 1 2 3 4
(integer) 4
127.0.0.1:6379> blpop key 0
1) "key"
2) "1"

返回的结果相当于一个pair(二元组),一方面是告诉我们当前的数据来自于哪个key。一方面告诉我们取到的数据是什么。

  1. 针对一个空的列表进行操作
-- 客户端1:
127.0.0.1:6379> del key
(integer) 1
127.0.0.1:6379> keys *
(empty array)
-- 针对一个空表进行取元素,等待时间为100s,进行阻塞
-- 等另一个客户端进行添加元素的时候,就会停止阻塞,取出元素
127.0.0.1:6379> blpop key 100
1) "key"
2) "1"
(53.95s)
-- 客户端2
127.0.0.1:6379> rpush key 1 2 3 4
(integer) 4
  1. 针对多个key进行操作.
-- 客户端1:
127.0.0.1:6379> flushall
OK
-- 取出多个key中任意一个key的元素,此时所有key均为空
-- 当任意一个key有值的时候,就取出元素。
127.0.0.1:6379> blpop key key2 key3 key4 500
1) "key2"
2) "1"
(41.50s)
-- 客户端2:
127.0.0.1:6379> lrange key 0 -1
(empty array)
127.0.0.1:6379> lrange key2 0 -1
(empty array)
127.0.0.1:6379> lrange key3 0 -1
(empty array)
127.0.0.1:6379> lrange key4 0 -1
(empty array)
-- 四个key均为空,在key2中放入key值
127.0.0.1:6379> rpush key2 1
(integer) 1

brpop效果和blpop完全一样(这里是尾删了),就不再赘述了。

list类型的编码

在老版本的redis中编码分为ziplist(压缩列表)和linkedlist(链表)。把数据按照更紧凑的压缩形式进行表示的节省空间。当元素个数多了,操作起来效率会降低。在redis5及其之后,使用的是quicklist相当于是链表和压缩列表的结合.整体还是一个链表,链表的每个节点,是一个压缩列表.每个压缩列表,都不让它太大。同时再把多个压缩列表通过链式结构连起来

127.0.0.1:6379> flushall
OK
127.0.0.1:6379> lpush key 1 2 3 4
(integer) 4
127.0.0.1:6379> object encoding key
"quicklist"

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

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

相关文章

为什么创业总是小部分人能成功?

每年都有大批量应届生等待就业&#xff0c;同时&#xff0c;也有一大批大龄中青人正在面临失业。在这种焦虑&#xff0c;内卷的氛围下&#xff0c;就会激发一波又一波的人走上创业的道路。想靠创业改变命运。辞职之后&#xff0c;第一时间能想到的创业方式要么就是就是 开个奶茶…

阿里云ECS服务器安装docker

首先查看阿里云ECS的服务器的版本 cat /etc/redhat-release如果是Alibaba Cloud Linux release 3,请执行以下命令 添加docker-ce的dnf源。 sudo dnf config-manager --add-repohttps://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo安装Alibaba Cloud Linux 3专…

【若依前后端分离】仪表盘绘制

示例&#xff1a; 代码&#xff1a; InstrumentPanel.vue组件 <template><div><!-- 在这里放置你的图表组件 --><div ref"echarts" style"width: 100%; height: 400px;"></div></div> </template><script&g…

如何将你的iOS应用成功上架App Store(图文详解)

上架基本需求资料 1、苹果开发者账号&#xff08;如还没账号先申请- 苹果开发者账号申请教程&#xff09; 2、开发好的APP 通过本篇教程&#xff0c;可以学习到ios证书申请和打包ipa上传到appstoreconnect.apple.com进行TestFlight测试然后提交审核的完整流程&#xff01; …

基于javaspringboot实现的垃圾分类网站

开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven…

Android RecyclerView的LayoutManager配置

RecyclerView的item布局方式依赖于其配置的布局管理器。不同的布局管理器可以实现不同的界面效果。 LayoutManager介绍 RecyclerView可以通过setLayoutManager设置布局管理器&#xff0c;该方法的源码如下&#xff1a; /*** Set the {link LayoutManager} that this RecyclerV…

YOLOv5 / YOLOv7 / YOLOv8 / YOLOv9 / RTDETR -gui界面-交互式图形化界面

往期热门博客项目回顾&#xff1a;点击前往 计算机视觉项目大集合 改进的yolo目标检测-测距测速 路径规划算法 图像去雨去雾目标检测测距项目 交通标志识别项目 yolo系列-重磅yolov9界面-最新的yolo 姿态识别-3d姿态识别 深度学习小白学习路线 AI健身教练-引体向上…

ESP32S3在VScode中使用USB口调试

ESP32S3在VScode中使用USB口调试 安装USB驱动修改工程的配置文件launch.jsonsettings.json 启动GDB Server 安装USB驱动 在powershell中输入下面指令&#xff1a; Invoke-WebRequest https://dl.espressif.com/dl/idf-env/idf-env.exe -OutFile .\idf-env.exe; .\idf-env.exe…

Windows 平台上面管理服务器程式的高级 QoS 策略

在 Windows 平台上面&#xff0c;目前有两个办法来调整应用程式的 QoS 策略设置&#xff0c;一种是通过程式设置&#xff0c;一种是通过 “Windows 组策略控制”。 在阅读本文之前&#xff0c;您需要先查阅本人以下的几篇文献&#xff0c;作为前情提示&#xff1a; VC Windows…

Redis进阶——点赞和点赞排行

目录 发布达人探店笔记实现步骤 查看探店笔记点赞功能问题分析&#xff1a;功能完善具体实现 点赞排行榜实现需求实现步骤 发布达人探店笔记 实现类似于大众点评的发布个人笔记的效果 实现步骤 准备数据表如下&#xff1a; SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0;…

缓存淘汰算法在钉钉机器人问答中的应用

当我们询问机器人消息的时候&#xff0c;如果机器人没有匹配到任何可以回复的消息&#xff0c;这个时候&#xff0c;我们把最近大家使用的最多5条数据从lru缓存中取出来&#xff0c;返回给用户&#xff0c;具体效果如下&#xff1a; 我们可以使用LFU&#xff1a;算法就像搭乐高…

详细分析Java中的AuthRequest类(附Demo)

目录 前言1. 基本知识2. Demo3. 实战 前言 公共接口&#xff0c;定义了对第三方平台进行授权、登录、撤销授权和刷新 token 的操作 1. 基本知识 先看源码基本API接口&#xff1a; import me.zhyd.oauth.enums.AuthResponseStatus; import me.zhyd.oauth.exception.AuthExce…

使用undetected-chromedriver遇到的问题及解决方法,以及它使用SOCKS代理的问题

环境&#xff1a;python3.8.10 uc的安装方法&#xff1a; pip38 install undetected-chromedriver 上测试代码&#xff1a; import undetected_chromedriver as uc driver uc.Chrome() driver.get(https://www.baidu.com) driver.save_screenshot(baidu.png)报错&#xff…

JavaWeb--06Vue组件库Element

Element 1 Element组件的快速入门1.1 Table表格 1 Element组件的快速入门 https://element.eleme.cn/#/zh-CN Element是饿了么团队开发的 接下来我们来学习一下ElementUI的常用组件&#xff0c;对于组件的学习比较简单&#xff0c;我们只需要参考官方提供的代码&#xff0c;然…

Opera 低频电磁分析——解决方案篇

Opera 低频电磁分析——解决方案篇 在上一期的分享中&#xff0c;我们深入探讨了Opera低频电磁分析—应用篇&#xff0c;揭示了其在多个领域中的广泛应用与重要价值。 本周&#xff0c;我们将继续这一系列的探讨&#xff0c;进入Opera低频电磁分析—解决方案篇。 在这一篇章中&…

Dynamic Wallpaper for Mac:动态壁纸让桌面更生动

Dynamic Wallpaper for Mac是一款为苹果电脑用户精心设计的动态壁纸软件&#xff0c;它以其丰富的功能和精美的壁纸库&#xff0c;为用户带来了更加生动和个性化的桌面体验。 Dynamic Wallpaper for Mac v17.8中文版下载 这款软件支持多种动态壁纸&#xff0c;用户可以根据自己…

每日一题(PTAL2-008):最长对称子串--分类讨论+遍历

最长对称子串的长度有可能是奇数也有可能是偶数&#xff0c;因此在遍历时要同时考虑这两种情况。 #include<bits/stdc.h> using namespace std;int main() {string s;getline(cin,s);int n s.size();int res 0; // 初始化为0&#xff0c;因为空字符串也是对称的for (i…

vue2响应式 VS vue3响应式

Vue2响应式 存在问题&#xff1a; 新增属性&#xff0c;删除属性&#xff0c;界面不会更新。 直接通过下标修改数组界面不会自动更新。 Vue2使用object.defineProperty来劫持数据是否发生改变&#xff0c;如下&#xff1a; 能监测到获取和修改属性&#xff1a; 新增的属性…

【MySQL 数据宝典】【磁盘结构】- 003 双写缓冲区

一、双写缓冲区 ( Doublewrite Buffer Files) 1.1 背景介绍 写失效 (部分页失效) InnoDB的页和操作系统的页大小不一致&#xff0c;InnoDB页大小一般为16K&#xff0c;操作系统页大小为4K&#xff0c;InnoDB的页写入到磁盘时&#xff0c;一个页需要分4次写。如果存储引擎正在…

代码编辑工具PilotEditPro18.4版本在Windows系统的下载与安装配置

目录 前言一、PilotEdit Pro安装二、使用配置总结 前言 “ PilotEdit Pro是一个功能强大且功能丰富的文本和代码编辑器&#xff0c;可满足程序员、开发人员和IT专业人员的不同需求。定位为一个多功能的编辑解决方案&#xff0c;PilotEdit Pro以其对广泛的文本和代码文件格式的…