Redis(二) - Redis命令詳解

文章目錄

  • 前言
  • 一、啟動Redis并進入客戶端
    • 1. 啟動Redis
    • 2. 進入Redis客戶端
    • 3. 使用IDEA連接Redis
  • 二、查看命令幫助信息
    • 1. 查看所有命令
    • 2. 查看指定命令幫助
  • 三、鍵操作命令
    • 1. set命令
    • 2. mset命令
    • 3. keys命令
    • 4. get命令
    • 5. mget命令
    • 6. dump命令
    • 7. exists命令
    • 8. type命令
    • 9. rename命令
    • 10. expire命令
    • 11. ttl命令
    • 12. persist命令
    • 13. del命令
  • 四、字符串操作命令
    • 1. set命令
    • 2. mset命令
    • 3. get命令
    • 4. mget命令
    • 5. getset命令
    • 6. strlen命令
    • 7. getrange命令
    • 8. setrange命令
    • 9. append命令
  • 五、列表操作命令
    • 1. rpush命令
    • 2. lpush命令
    • 3. lrange命令
    • 4. lindex命令
    • 5. rpop命令
    • 6. lpop命令
    • 7. llen命令
    • 8. lrem命令
  • 六、集合操作命令
    • 1. sadd命令
    • 2. scard命令
    • 3. smembers命令
    • 4. sismember命令
    • 5. srem命令
    • 6. smove命令
  • 七、哈希表操作命令
    • 1. hset命令
    • 2. hmset命令
    • 3. hget命令
    • 4. hmget命令
    • 5. hgetall命令
    • 6. hkeys命令
    • 6. hkeys命令
    • 7. hdel命令
  • 八、有序集合操作命令
    • 1. zadd命令
    • 2. zcard命令
    • 3. zcount命令
    • 4. zrange命令
    • 5. zscore命令
    • 6. zrem命令


前言

在當今數據驅動的應用開發領域,高效的數據存儲與管理至關重要。Redis,作為一款高性能的鍵值對存儲數據庫,以其出色的性能、豐富的數據結構和廣泛的應用場景,成為了眾多開發者構建強大應用的得力工具。
無論是緩存數據以加速應用響應,還是處理實時數據、實現分布式鎖,Redis 都能發揮關鍵作用。本教程旨在為初學者和有一定經驗的開發者,全面且系統地介紹 Redis 的基礎操作,助力讀者快速上手 Redis,開啟高效數據處理的大門。從 Redis 的啟動與客戶端連接,到各類命令的詳細講解,我們將逐步深入 Redis 的世界,探索其豐富功能,讓讀者在實踐中掌握 Redis 的核心用法,為實際項目開發奠定堅實基礎。


一、啟動Redis并進入客戶端

1. 啟動Redis

打開一個新的命令提示符窗口(cmd),執行如下命令啟動 Redis。

redis-server

啟動完成如下圖所示:

在這里插入圖片描述

2. 進入Redis客戶端

打開一個新的命令提示符窗口(cmd),執行如下命令進入 Redis 客戶端。

redis-cli

如下圖所示:

在這里插入圖片描述

3. 使用IDEA連接Redis

在idea中點擊數據庫圖標,點擊添加數據源,找到Redis選項并點擊,如下圖所示:

在這里插入圖片描述

在添加Redis數據源頁面,輸入自定義的連接名稱、主機ip地址、選擇無身份驗證、選擇使用的數據庫編號為0、點擊測試連接,測試成功后依次點擊應用和確定。

在這里插入圖片描述


二、查看命令幫助信息

1. 查看所有命令

command

在這里插入圖片描述

2. 查看指定命令幫助

查看指定命令的幫助信息語法如下:

help <命令>

示例:查看set命令的幫助信息。

help set

在這里插入圖片描述


三、鍵操作命令

1. set命令

set命令用于為指定鍵設置值,鍵不存在時為新增操作,鍵存在時為更新操作,語法如下:

set <key> <value>

示例:給school鍵設置值為dy。

set school dy

在這里插入圖片描述

2. mset命令

mset命令用于為多個指定鍵設置值,鍵不存在時為新增操作,鍵存在時為更新操作,語法如下:

mset <key1> <value1> <key2> <value2> ...

示例:給k1鍵設置值為v1,k2鍵設置值為v2,k3鍵設置值為v3。

mset k1 'v1' k2 'v2' k3 'v3'

在這里插入圖片描述

3. keys命令

keys命令用于查找所有符合給定模式的鍵,語法如下:

keys <pattern>

示例1:查看所有鍵。

keys *

在這里插入圖片描述

示例2:查看所有以k開頭的鍵。

keys k*

在這里插入圖片描述

4. get命令

get命令用于獲取指定鍵的值,語法如下:

get <key>

示例:查看scool鍵的值。

get school

在這里插入圖片描述

5. mget命令

mget命令用于獲取多個指定鍵的值,語法如下:

mget <key1> <key2> ...

示例:查看k1、k2、k3鍵的值。

mget k1 k2 k3

在這里插入圖片描述

6. dump命令

dump命令用于返回存儲在指定鍵處的值的序列化版本,語法如下:

dump <key>

示例:查看k1鍵的值的序列化版本。

dump k1

在這里插入圖片描述

7. exists命令

exists命令用于確定一個或多個鍵是否存在,語法如下:

exists <key1> <key2> ...

示例1:查看school鍵是否存在。

exists school

在這里插入圖片描述

示例2:查看k1、k2、k3、k4、k5鍵是否存在。

exists k1 k2 k3 k4 k5

在這里插入圖片描述

8. type命令

type命令用于查看存儲在指定鍵處的值的類型,語法如下:

type <key>

示例:查看school鍵的值的類型。

type school

在這里插入圖片描述

9. rename命令

rename命令用于重命名一個鍵,語法如下:

rename <key> <new_key>

示例:把school鍵重命名為new_school鍵。

rename school new_school

在這里插入圖片描述

10. expire命令

expire命令用于設置鍵的生存時間(以秒為單位),語法如下:

expire <key> <seconds>

示例:把k3鍵的生存時間設置為600秒。

expire k3 600

在這里插入圖片描述

11. ttl命令

ttl命令用于獲取一個鍵的剩余存活時間,語法如下:

ttl <key>

示例:查看k3鍵的剩余存活時間。

ttl k3

在這里插入圖片描述

12. persist命令

persist命令用于刪除指定鍵的存活時間(把鍵設置為一直存在),語法如下:

persist <key>

示例:刪除k3鍵的存活時間。

persist k3

在這里插入圖片描述

13. del命令

del命令用于刪除一個或多個指定鍵,語法如下:

del <key1> <key2> ...

示例1:刪除school鍵。

del school

在這里插入圖片描述
示例2:刪除k1、k2、k3鍵。

del k1 k2 k3

在這里插入圖片描述


四、字符串操作命令

1. set命令

示例:給字符串鍵str1設置值為value1

set str1 value1

2. mset命令

示例:給字符串鍵str2str3str4分別設置值為value2value3value4

mset str2 value2  str3 value3 str4 value4

3. get命令

示例:獲取字符串鍵str1的值。

get str1

4. mget命令

示例:獲取字符串鍵str2str3str4的值。

mget str2 str3 str4

5. getset命令

getset命令用于獲取指定字符串鍵的舊值并設置新值,語法如下:

getset <key> <value>

示例:獲取字符串鍵str1的舊值,并設置新值為new_value1

getset str1 new_value1

查看設置后的新值。

get str1

6. strlen命令

strlen命令用于獲取指定字符串鍵的值得長度,語法如下:

strlen <key>

示例:獲取字符串鍵str1的值的長度。

strlen str1

7. getrange命令

getrange命令用于根據索引范圍獲取指定字符串鍵的值的內容,語法如下:

getrange <key> <start> <end>

示例:獲取字符串鍵str1的索引0-5的值的內容。

getrange str1 0 5

8. setrange命令

setrange命令用于覆蓋從指定偏移量開始的鍵處字符串的一部分內容,語法如下:

setrange <key> <offset> <value>

示例:把字符串鍵str1從索引2開始的后面三個字母的內容替換為aaa。

setrange str1 2 aaa

查看設置后的新值。

get str1

9. append命令

append命令用于向指定鍵的值的末尾追加內容,語法如下:

append <key> <value>

示例:向字符串鍵str1的結尾追加內容bbb

append str1 bbb

查看追加后的新值。

get str1

在這里插入圖片描述


五、列表操作命令

1. rpush命令

rpush命令用于在列表右端向列表追加一個或多個值,語法如下:

rpush <key> <value1> <value2> ...

示例:在列表右端向列表color中添加多個值。

rpush color blue green purple red white

在這里插入圖片描述

2. lpush命令

lpush命令用于在列表左端向列表追加一個或多個值,語法如下:

lpush <key> <value1> <value2> ...

示例:在列表左端向列表color中添加多個值。

lpush color blue2 green2 purple2 red2 white2

在這里插入圖片描述

3. lrange命令

lrange命令用于獲取一個列表中指定范圍內的元素,語法如下:

lrange <key> <start> <stop>

示例1:獲取列表color中索引0-5的元素。

lrange color 0 5

在這里插入圖片描述

示例2:獲取列表color中的所有元素。

lrange color 0 -1

在這里插入圖片描述

4. lindex命令

lindex命令用于根據指定索引獲取列表中的一個元素,語法如下:

lindex <key> <index>

示例:獲取列表color中索引為2的元素。

lindex color 2

在這里插入圖片描述

5. rpop命令

rpop命令用于移除并獲取列表中的最后一個(最右端)元素,語法如下:

rpop <key>

示例:移除并獲取列表color中的最后一個(最右端)元素。

rpop color

在這里插入圖片描述

6. lpop命令

lpop命令用于移除并獲取列表中的第一個(最左端)元素,語法如下:

lpop <key>

示例:移除并獲取列表color中的第一個(最左端)元素。

lpop color

在這里插入圖片描述

7. llen命令

llen命令用于根據指定列表鍵獲取列表長度,語法如下:

llen <key>

示例:獲取列表color的長度。

llen color

在這里插入圖片描述

8. lrem命令

lrem命令用于從列表中移除元素,語法如下:

lrem <key> <count> <value>

示例1:從列表開頭開始搜索移除列表color中1個red元素。

lrem color 1 red

示例2:從列表結尾開始搜索移除列表color中3個blue元素。

lrem color -3 blue

示例3:移除列表color中所有個blue2元素。

lrem color 0 blue2

在這里插入圖片描述


六、集合操作命令

1. sadd命令

sadd命令用于在集合中添加一個或多個成員,語法如下:

sadd <key> <member1> <member2> ...

示例:給集合鍵set1添加多個成員。

sadd set1 mem1 mem2 mem3

2. scard命令

scard命令用于獲取集合中成員的數量,語法如下:

scard <key>

示例:查看集合鍵set1中成員的數量。

scard set1

3. smembers命令

smembers命令用于獲取集合中所有成員,語法如下:

smembers <key>

示例:查看集合鍵set1中的所有成員。

smembers set1

4. sismember命令

sismember命令用于檢查成員是否在集合中,語法如下:

sismember <key> <member>

示例:檢查成員mem1是否在集合set1中。

sismember set1 mem1

5. srem命令

srem命令用于移除集合中一個或多個成員,語法如下:

srem <key> <member1> <member2> ...

示例:移除集合set1中成員mem3。

srem set1 mem3

6. smove命令

smove命令用于把一個集合中一個成員移動到另一個集合中,語法如下:

smove <source> <destination> <member>

示例:把集合set1中成員mem2移動到集合set2中。

smove set1 set2 mem2

在這里插入圖片描述


七、哈希表操作命令

1. hset命令

hset命令用于在哈希表中給指定字段添加指定值,語法如下:

hset <key> <field> <value>

示例:給哈希表student添加一個學生信息。

hset student:1 name zhangsan
hset student:1 age 19
hset student:1 address yunnan

在這里插入圖片描述

2. hmset命令

hmset命令用于在哈希表中給多個指定字段添加指定值,語法如下:

hmset <key> <field1> <value1> <field2> <value2> ...

示例:給哈希表student添加一個學生信息。

hmset student:2 name lisi age 20 address guizhou

在這里插入圖片描述

3. hget命令

hget命令用于獲取一個hash字段的值,語法如下:

hget <key> <field>

示例:獲取hash鍵student:2中name字段的值。

hget student:2 name

在這里插入圖片描述

4. hmget命令

hmget命令用于獲取多個hash字段的值,語法如下:

hmget <key> <field1>  <field2> ...

示例:獲取hash鍵student:2中name、age和address字段的值。

hmget student:2 name age address

在這里插入圖片描述

5. hgetall命令

hgetall命令用于獲取一個hash表中的所有字段和值,語法如下:

hgetall <key>

示例:獲取hash鍵student:2中的所有字段和值。

hgetall student:2

在這里插入圖片描述

6. hkeys命令

hkeys命令用于獲取一個hash表中的所有字段,語法如下:

hkeys <key>

示例:獲取hash鍵student:2中的所有字段。

hkeys student:2

在這里插入圖片描述

6. hkeys命令

hvals命令用于獲取一個hash表中的所有值,語法如下:

hvals <key>

示例:獲取hash鍵student:2中的所有值。

hvals student:2

在這里插入圖片描述

7. hdel命令

hdel命令刪除一個或多個哈希字段,語法如下:

hdel <key> <field1> <field2> ...

示例:刪除hash鍵student:2中的age和address字段。

hdel student:2 age address

八、有序集合操作命令

1. zadd命令

zadd命令用于向一個排序集添加一個或多個成員,如果它已經存在,則更新它的分數,語法如下:

zadd <key> [NX|XX] [CH] [INCR] <score> <member> [<score> <member> ...]

[NX|XX]

  • NX:僅在成員不存在時才添加。如果成員已經存在于集合中,則不會更新其分數。
  • XX:僅在成員已存在時才更新其分數。如果成員不存在,則不會添加。
  • 這兩個選項互斥,不能同時使用。

[CH]

  • 默認情況下,ZADD 返回的是新添加成員的數量。如果指定了 CH,則返回值變為被修改的成員總數(包括新增和更新分數的成員)。

[INCR]

  • ZADD 的行為從“設置分數”改為“增加分數”。即,指定成員的分數會加上給定的值(類似于 ZINCRBY 命令)。
  • 如果成員不存在,則默認分數為 0,然后加上給定的值。
  • 注意:當使用 INCR 時,只能指定一個成員及其分數。

示例:給有序集合salary添加多個分數和成員。

zadd salary 5000 zhnagsan 4500 lisi 6000 wangwu

在這里插入圖片描述

2. zcard命令

zcard命令用于獲取有序集合中成員的數量,語法如下:

zcard <key>

示例:獲取有序集合salary中的成員數量。

zcard salary

在這里插入圖片描述

3. zcount命令

zcount命令用于計算分數在給定值內的有序集合中的成員數量,語法如下:

zcount <key> <min> <max>

示例:計算有序集合中分數在5000-6500之間的成員數量。

zcount salary 5000 6500

在這里插入圖片描述

4. zrange命令

zrange命令用于按索范圍引返回已排序集合中的成員,語法如下:

zrange <key> <start> <stop> [WITHSCORES]

[WITHSCORES]:可選參數。如果指定了 WITHSCORES,則返回結果中會包含每個成員的分數。

示例:計算有序集合中分數在5000-6500之間的成員數量。

zrange salary 0 1

在這里插入圖片描述

zrange salary 0 1 withscores

在這里插入圖片描述

5. zscore命令

zscore命令用于獲取有序集合中給定成員相關聯的分數,語法如下:

zscore <key> <member>

示例:獲取有序集合salary中成員wangwu的分數。

zscore salary wangwu

在這里插入圖片描述

6. zrem命令

zrem命令用于在有序集合中移除一個或多個成員,語法如下:

zrem <key> <member1> <member2> ...

示例:移除有序集合salary中成員wangwu。

zrem salary wangwu

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/77229.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/77229.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/77229.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Qt】初識Qt(二)

目錄 一、顯示hello world1.1 圖形化界面1.2 寫代碼 二、對象樹三、使用輸入框顯示hello world四、使用按鈕顯示hello world 一、顯示hello world 有兩種方式實現hello world&#xff1a; 通過圖形化界面&#xff0c;在界面上創建出一個控件&#xff0c;顯示hello world通過寫…

空調制冷量和功率有什么關系?

空調的制冷量和功率是衡量空調性能的兩個核心參數,二者既有區別又緊密相關,以下是具體解析: 1. 基本定義 制冷量(Cooling Capacity)指空調在單位時間內從室內環境中移除的熱量,單位為 瓦特(W) 或 千卡/小時(kcal/h)。它直接反映空調的制冷能力,數值越大,制冷效果越…

【prometheus+Grafana篇】Prometheus與Grafana:深入了解監控架構與數據可視化分析平臺

&#x1f4ab;《博主主頁》&#xff1a;奈斯DB-CSDN博客 &#x1f525;《擅長領域》&#xff1a;擅長阿里云AnalyticDB for MySQL(分布式數據倉庫)、Oracle、MySQL、Linux、prometheus監控&#xff1b;并對SQLserver、NoSQL(MongoDB)有了解 &#x1f496;如果覺得文章對你有所幫…

基于n8n的AI應用工作流原理與技術解析

基于n8n的AI應用工作流原理與技術解析 在AI技術深度融入企業數字化轉型的今天&#xff0c;開源工作流自動化工具n8n憑借其靈活的架構和強大的集成能力&#xff0c;成為構建智能自動化流程的核心引擎。本文將從技術原理、AI融合機制、典型應用場景三個維度&#xff0c;解析n8n在…

經濟指標學習(二)

系列文章目錄 文章目錄 系列文章目錄1、市凈率**一、定義與計算****二、核心意義****三、應用場景****四、局限性****五、分類與衍生指標****總結** 2、市銷率**一、定義與計算****二、核心意義****三、優缺點分析****四、適用場景****五、與其他指標的對比****六、實際應用案例…

大語言模型減少幻覺的常見方案

什么是大語言模型的幻覺 大語言模型的幻覺&#xff08;Hallucination&#xff09;是指模型在生成文本時&#xff0c;輸出與輸入無關、不符合事實、邏輯錯誤或完全虛構的內容。這種現象主要源于模型基于概率生成文本的本質&#xff0c;其目標是生成語法合理、上下文連貫的文本&…

CSS 美化頁面(四)

一、浮動float屬性 ?屬性值??描述??適用場景?left元素向左浮動&#xff0c;騰出右側空間供其他元素使用&#xff0c;其他內容會圍繞在其右側?。橫向排列元素&#xff08;如導航菜單&#xff09;、圖文混排布局?。right元素向右浮動&#xff0c;騰出左側空間供其他元素使…

如何將 .txt 文件轉換成 .md 文件

一、因為有些軟件上傳文件的時候需要 .md 文件&#xff0c;首先在文件所在的目錄中&#xff0c;點擊“查看”&#xff0c;然后勾選上“文件擴展名”&#xff0c;這個時候該目錄下的所有文件都會顯示其文件類型了。 二、這時直接對目標的 .txt 文件進行重命名&#xff0c;把后綴…

C++ 迭代器失效詳解:如何避免 vector 操作中的陷阱

目錄 1. 什么是迭代器失效&#xff1f; 2. 哪些操作會導致迭代器失效&#xff1f; 2.1 vector 的插入操作&#xff08;push_back, insert&#xff09; 示例&#xff1a;push_back 導致迭代器失效 如何避免&#xff1f; 2.2 vector 的刪除操作&#xff08;erase, pop_back&…

(EtherCAT 轉 EtherNet/IP)EtherCAT/Ethernet/IP/Profinet/ModbusTCP協議互轉工業串口網關

型號 協議轉換通信網關 EtherCAT 轉 EtherNet/IP MS-GW12 概述 MS-GW12 是 EtherCAT 和 EtherNet/IP 協議轉換網關&#xff0c;為用戶提供兩種不同通訊協議的 PLC 進行數據交互的解決方案&#xff0c;可以輕松容易將 EtherNet/IP 網絡接入 EtherCAT 網絡中&#xff0c;方便…

榕壹云酒水定制系統:基于THinKPHP+MySQL+UniApp打造數字化時代的個性化購酒新體驗

數字化浪潮下的酒水定制新機遇 在消費升級與個性化需求崛起的背景下&#xff0c;傳統酒水行業正面臨數字化轉型的迫切需求。為此&#xff0c;我們團隊基于ThinkPHPMySQLUniApp技術棧&#xff0c;開發了一套榕壹云酒水定制系統&#xff0c;旨在通過數字化手段解決消費者個性化購…

GR00T N1:面向通用類人機器人的開放基礎模型

摘要 通用型機器人需要具備多功能的身體和智能的大腦。近年來&#xff0c;類人機器人的發展在構建人類世界中的通用自主性硬件平臺方面展現出巨大潛力。一個經過大量多樣化數據源訓練的機器人基礎模型&#xff0c;對于使機器人能夠推理新情況、穩健處理現實世界的多變性以及快…

WebRTC實時通話EasyRTC嵌入式音視頻通信SDK,構建智慧醫療遠程會診高效方案

一、方案背景 當前醫療領域&#xff0c;醫療資源分布不均問題尤為突出&#xff0c;大城市和發達地區優質醫療資源集中&#xff0c;偏遠地區醫療設施陳舊、人才稀缺&#xff0c;患者難以獲得高質量的醫療服務&#xff0c;制約醫療事業均衡發展。 EasyRTC技術基于WebRTC等先進技…

深入理解主成分分析(PCA):原理、算法與應用

內容摘要 本文深入剖析主成分分析&#xff08;PCA&#xff09;技術。介紹其通過正交變換簡化數據維度的核心原理&#xff0c;詳細推導基于最小投影距離和最大投影方差的算法過程&#xff0c;總結算法流程步驟。全面分析PCA的優缺點&#xff0c;并對比其與KPCA的差異。同時闡述…

uniapp-商城-25-頂部模塊高度計算

計算高度&#xff1a; 使用computed進行頂部模塊的計算。 總高度&#xff1a;bartotalHeight log 介紹--收款碼這一條目 也就是上一章節的title的高度計算 bodybarheight。 在該組件中&#xff1a; js部分的代碼&#xff1a; 包含了導出的名字&#xff1a; shop-head…

【MCP】第一篇:MCP協議深度解析——大模型時代的“神經連接層“架構揭秘

【MCP】第一篇&#xff1a;MCP協議深度解析——大模型時代的"神經連接層"架構揭秘 一、什么是MCP&#xff1f;二、為什么需要MCP&#xff1f;三、MCP的架構四、MCP與AI交互的原理4.1 ReAct&#xff08;Reasoning Acting&#xff09;模式4.2 Function Calling 模式 五…

李飛飛團隊新作WorldScore:“世界生成”能力迎來統一評測,3D/4D/視頻模型同臺PK

從古老神話中對世界起源的幻想&#xff0c;到如今科學家們在實驗室里對虛擬世界的構建&#xff0c;人類探索世界生成奧秘的腳步從未停歇。如今&#xff0c;隨著人工智能和計算機圖形學的深度融合&#xff0c;我們已站在一個全新的起點&#xff0c;能夠以前所未有的精度和效率去…

[react]Next.js之自適應布局和高清屏幕適配解決方案

序言 閱讀前首先了解即將要用到的兩個包的作用 1.postcss-pxtorem 自動將 CSS 中的 px 單位轉換為 rem 單位按照設計稿尺寸直接寫 px 值&#xff0c;由插件自動計算 rem 值 2.amfe-flexible 動態設置根元素的 font-size&#xff08;即 1rem 的值&#xff09;根據設備屏幕寬度和…

C# 如何比較兩個List是否相等?

簡介 在 C# 里&#xff0c;比較兩個 List 是否相等&#xff0c;需要考慮多個方面&#xff0c;例如列表中的元素順序、元素本身是否相等。下面介紹幾種常見的比較方法&#xff1a; 基本類型比較&#xff08;元素順序必須一致&#xff09; var list1 new List<int> { 1…

【技術派后端篇】Redis分布式鎖:原理、實踐與應用

在當今的高并發系統中&#xff0c;分布式鎖是保障數據一致性和系統穩定性的重要手段。今天&#xff0c;我們就來深入探討一下Redis分布式鎖&#xff0c;揭開它神秘的面紗。 1 本地鎖與分布式鎖的區別 在Java開發的早期階段&#xff0c;我們接觸過synchronized和Lock鎖&#x…