MySQL 視圖(2)

上一篇:MySQL視圖(1)


基于其他視圖

案例對 WITH [CASCADED | LOCAL] CHECK OPTION 進行釋義

創建視圖時,可以基于表 / 多個表,也可以使用 其他視圖+表 / 其他視圖 + 其他視圖 的方式進行組合。

總結

  • 更新視圖,同時也會更新基表數據。更新基表,對應的視圖數據也會更新。
  • WITH CASCADED CHECK OPTION 會檢測當前視圖(v3)WHERE 子句約束以及所有底部視圖 WHERE 子句約束條件(v1/v2)
  • 當使用 CASCADED 時,不僅需要滿足當前視圖 WHERE 子句約束,而且無論底部視圖是否有 WITH CHECK OPTION 選項,都需要滿足
drop table t1;
drop view v1,v2,v3;CREATE TABLE t1 (a INT);CREATE VIEW v1 AS SELECT * FROM t1 WHERE a < 10
WITH CHECK OPTION;CREATE VIEW v2 AS SELECT * FROM v1 WHERE a > 4
WITH LOCAL CHECK OPTION;CREATE VIEW v3 AS SELECT * FROM v2 WHERE a < 8
WITH CASCADED CHECK OPTION;INSERT INTO v3 values(9); -- 報錯,不符合 v3 視圖中小于8的約束
INSERT INTO v3 values(4); -- 報錯,不符合 v2 視圖中大于4的約束
INSERT INTO v3 values(11);-- 報錯,不符合 v1 視圖中大于4的約束
INSERT INTO v3 values(6); -- 正常,符合 v1/v2/v3 視圖約束
INSERT INTO v3 values(7); -- 正常,符合 v1/v2/v3 視圖約束
  • WITH [CASCADED | LOCAL] CHECK OPTION 均會檢測多層視圖,如下案例,插入 v3 視圖數據時,會檢測 v1、v2 的數據約束條件
  • with local check option 時,首先需要滿足當前視圖的條件,然后對于底部視圖,也是先看是否有指定的 with check option 選項語句,有的話對應處理,無則不需要滿足底部視圖的 WHERE 子句條件。
drop table t1;
drop view v1,v2,v3;CREATE TABLE t1 (a INT);CREATE VIEW v1 AS SELECT * FROM t1 WHERE a < 10
WITH CHECK OPTION;-- 沒有 check option 選項
CREATE VIEW v2 AS SELECT * FROM v1 WHERE a > 4; CREATE VIEW v3 AS SELECT * FROM v2 WHERE a < 14
WITH LOCAL CHECK OPTION;INSERT INTO v3 values(3); -- 正常,因為基表 v2 沒有 check option 所以不做約束
INSERT INTO v3 values(4); -- 正常,因為基表 v2 沒有 check option 所以不做約束
INSERT INTO v3 values(11);-- 報錯,必須符合基表 v1 小于10的約束,因為有check option 選項
INSERT INTO v3 values(10);-- 報錯,必須符合基表 v1 小于10的約束,因為有check option 選項-- 初始化環境
drop table t1;
drop view v1,v2,v3;CREATE TABLE t1 (a INT);CREATE VIEW v1 AS SELECT * FROM t1 WHERE a < 10
WITH CHECK OPTION;-- 有 local check option 選項
CREATE VIEW v2 AS SELECT * FROM v1 WHERE a > 4 
WITH LOCAL CHECK OPTION;CREATE VIEW v3 AS SELECT * FROM v2 WHERE a < 14
WITH LOCAL CHECK OPTION;INSERT INTO v3 values(3); -- 報錯,必須符合基表 v2 大于 4 的約束,因為有check option選項
INSERT INTO v3 values(4); -- 報錯,必須符合基表 v2 大于 4 的約束,因為有check option選項

當前視圖沒有 check option 約束時,可以更新當前視圖數據,但是在當前視圖中不顯示該數據(參考情況1)。同時需要保證在該視圖的 select_statement 中,如果對象是視圖,并且也沒有 check option 約束限制(參考情況2),有也沒事,但是不能限制,才可以正常插入、更新數據(參考情況3)。

-- 情況 1:視圖無 check option 選項,關聯表
drop table t1;
drop view v1,v2,v3;
CREATE TABLE t1 (a INT);
CREATE VIEW v1 AS SELECT * FROM t1 WHERE a < 10;
INSERT INTO v1 values(15);  -- 正常,因為沒有 check option可以更新,但是在視圖中不顯示而已。-- 情況 2:視圖無 check option 選項,關聯其他視圖也無 check option 選項
drop table t1;
drop view v1,v2,v3;
CREATE TABLE t1 (a INT);
CREATE VIEW v1 AS SELECT * FROM t1 WHERE a < 10
WITH CHECK OPTION;-- 沒有 check option 選項
CREATE VIEW v2 AS SELECT * FROM v1 WHERE a > 4; 
CREATE VIEW v3 AS SELECT * FROM v2 WHERE a < 14;INSERT INTO v3 values(3); -- 正常,因為基表 v2 沒有 check option 所以不做約束
INSERT INTO v3 values(4); -- 正常,因為基表 v2 沒有 check option 所以不做約束
INSERT INTO v3 values(11);-- 報錯,必須符合基表 v1 小于10的約束,因為有check option 選項
INSERT INTO v3 values(15);-- 報錯,必須符合基表 v1/v3 的約束,因為有check option 選項-- 情況 3:視圖無 check option 選項,關聯其他視圖有 check option 選項
drop table t1;
drop view v1,v2,v3;
CREATE TABLE t1 (a INT);
CREATE VIEW v1 AS SELECT * FROM t1 WHERE a < 10
WITH CHECK OPTION;-- 有 check option 選項
CREATE VIEW v2 AS SELECT * FROM v1 WHERE a > 4 
WITH CHECK OPTION; 
CREATE VIEW v3 AS SELECT * FROM v2 WHERE a < 14;INSERT INTO v3 values(3); -- 報錯,必須符合視圖 v2 大于4的約束,因為有check option 選項
INSERT INTO v3 values(5); -- 正常

基于 WITH 通用表達式

CREATE VIEW t1_view as WITHcte1 AS (SELECT 1 as a, 2 as b FROM dual),cte2 AS (SELECT 1 as c, 4 as d FROM dual)
SELECT b, d FROM cte1 JOIN cte2
WHERE cte1.a = cte2.c;SELECT * FROM t1_view;
+---+---+
| b | d |
+---+---+
| 2 | 4 |
+---+---+
1 row in set (0.00 sec)CREATE VIEW t1_view as WITHcte1 AS (SELECT 1 as a, 2 as b FROM dual),cte2 AS (SELECT 1 as c, 4 as d FROM dual)
SELECT * FROM cte1 JOIN cte2
WHERE cte1.a = cte2.c;SELECT * FROM t1_view;
+---+---+---+---+
| a | b | c | d |
+---+---+---+---+
| 1 | 2 | 1 | 4 |
+---+---+---+---+
1 row in set (0.00 sec)

基于 CASE WHEN

  • 直接使用不支持,但可以在 SELECT 里面
CREATE TABLE `t1` (`id` int NOT NULL AUTO_INCREMENT,`consumer` char(20) DEFAULT NULL,`brand` varchar(20) DEFAULT NULL,`sal` int DEFAULT NULL,PRIMARY KEY (`id`)
);
INSERT INTO t1 VALUES(1,'人民','蘋果',5000);
INSERT INTO t1 VALUES(2,'蘇教','小米',-4000);
INSERT INTO t1 VALUES(3,'深教','oppo',0);CREATE VIEW t1_view AS SELECT id, sal, sign(CASE WHEN sal=0 THEN 200 ELSE sal END ) FROM t1 ORDER BY id;

基于自定義存儲函數

MySQL :: MySQL 8.0 Reference Manual :: 15.1.23 CREATE VIEW Statement # create view

單個存儲函數

DELIMITER //
CREATE FUNCTION f_test()
returns varchar(20)
BEGINdeclare a varchar(200);SELECT CONCAT('111','222','333') FROM DUAL INTO a;return a;
END;
//
DELIMITER ;
CREATE VIEW t1_view AS SELECT f_test();

存儲函數+存儲過程

  • 創建自定義函數的視圖,以下案例中,不允許在過程中更新自個兒的視圖,個人理解是先執行存儲過程中的 UPDATE 語句,再創建視圖相關數據,或者理解成,作為視圖依據的這個結果集,是不允許被更新的。
DROP VIEW t9_view;
DROP FUNCTION f_test;
DROP PROCEDURE p_test;DELIMITER //
CREATE FUNCTION f_test(samplename varchar(200))
RETURNS varchar(13)  
beginIF samplename IS NOT NULL thenCALL p_test(1);END IF;RETURN 0;
END;
//
CREATE PROCEDURE p_test(in p_in int)
BEGINUPDATE t9_view SET aa = p_in;
END;
//
DELIMITER ;CREATE VIEW t9_view(aa) AS SELECT f_test('xxxx');SELECT * FROM t9_view;
ERROR 1424 (HY000): Recursive stored functions and triggers are not allowed.

  • 創建自定義函數的視圖,以下案例中,允許在過程中更新其他的表 / 視圖
DROP VIEW t9_view;
DROP FUNCTION f_test;
DROP PROCEDURE p_test;
DROP TABLE t1;
CREATE TABLE t1 (id int);
INSERT INTO t1 VALUES(1);DELIMITER //
CREATE FUNCTION f_test(samplename varchar(200))
RETURNS varchar(13)  
beginIF samplename IS NOT NULL thenCALL p_test(3);END IF;RETURN 0;
END;
//
CREATE PROCEDURE p_test(in p_in int)
BEGINupdate t1 set id=p_in;
END;
//
DELIMITER ;
CREATE VIEW t9_view(aa) AS SELECT f_test('xxxx');
SELECT * FROM t9_view;
+------+
| aa   |
+------+
| 0    |
+------+
1 row in set (0.01 sec)mysql> SELECT * FROM t1;
+------+
| id   |
+------+
|    3 |
+------+
1 row in set (0.00 sec)

  • 視圖可能依賴于存儲函數,該函數可能調用其他存儲例程。例如,以下視圖調用存儲函數f():
CREATE VIEW v AS SELECT * FROM t WHERE t.id = f(t.name);Suppose that f() contains a statement such as this:IF name IS NULL thenCALL p1();
ELSECALL p2();
END IF;

上面是官方案例,下面案例是我自己寫的

CREATE TABLE t1 (id int NOT NULL,consumer char(20) DEFAULT NULL,price varchar(20) DEFAULT NULL,sal int DEFAULT NULL,datetime1 DATE,`datetime2` bigint
);
INSERT INTO t1 VALUES(1,'書局','7000',5000,'2020-09-22',20200923121200);
INSERT INTO t1 VALUES(2,'微山','3000',-4000,'2020-09-21',20200921101159);
INSERT INTO t1 VALUES(3,'深咖','5000',0,'2020-08-21',20190821101159);DELIMITER //
CREATE FUNCTION f_test(samplename varchar(200))
returns varchar(13)  
beginIF samplename IS NOT NULL thenCALL p_test(4);END IF;RETURN 4;
END;
//
CREATE PROCEDURE p_test(in p_in int)
beginupdate t1 set id=p_in;
END;
//
DELIMITER ;CREATE VIEW t9_view AS SELECT * FROM t1 WHERE t1.id = f_test(t1.consumer);
SELECT * FROM t9_view;
ERROR 1442 (HY000): Can't update table 't1' in stored function/trigger 
because it is already used by statement which invoked this stored function/trigger.

總結:

1)不支持遞歸存儲函數,即創建自定義函數視圖,在自定義函數體中調用存儲過程,過程會更改該視圖相關信息,參考案例 一

2)創建自定義函數的視圖,允許在過程中更新其他的表 / 視圖,參考案例 二

3)綜合案例1~3來看,使用函數的方式創建視圖,無論是直接 SELECT 函數 還是 以函數作為 WHERE 子句的條件來創建的視圖,在函數 / 過程中都不能 INSERT / UPDATE 創建視圖時的基礎表(insert操作驗證過,未寫出來)。

ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}

Merge:當使用視圖時,會把查詢視圖的語句創建視圖的語句合并起來,形成一條語句,最后再從基表中查詢

TEMPTABLE:先把定義視圖的語句執行起來,把數據放在一張系統定義的臨時表,然后執行用戶的sql語句

DROP TABLE t1;
CREATE TABLE t1 (c1 INT, c2 int);
insert into t1 values(3,3);
insert into t1 values(4,4);
insert into t1 values(1,1);
insert into t1 values(2,2);DROP VIEW v_merge;
DROP VIEW v_merge2;-- 定義為 MERGE
CREATE ALGORITHM = MERGE VIEW v_merge (vc1, vc2) AS
SELECT c1, c2 FROM t1 WHERE c1 < 100 ORDER BY c1 DESC, c2 ASC;table v_merge;
select * from v_merge group by vc1;
+------+------+
| vc1  | vc2  |
+------+------+
|    3 |    3 |
|    4 |    4 |
|    1 |    1 |
|    2 |    2 |
+------+------+
4 rows in set (0.01 sec)-- 定義為 TEMPTABLE
CREATE ALGORITHM = TEMPTABLE VIEW v_merge2 (vc1, vc2) AS
SELECT c1, c2 FROM t1 WHERE c1 < 100 ORDER BY c1 DESC, c2 ASC;table v_merge2;
select * from v_merge2 group by vc1;
+------+------+
| vc1  | vc2  |
+------+------+
|    4 |    4 |
|    3 |    3 |
|    2 |    2 |
|    1 |    1 |
+------+------+
4 rows in set (0.01 sec)

修改視圖

MySQL :: MySQL 8.0 Reference Manual :: 15.1.11 ALTER VIEW Statement

ALTER[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}][DEFINER = user][SQL SECURITY { DEFINER | INVOKER }]VIEW view_name [(column_list)]AS select_statement[WITH [CASCADED | LOCAL] CHECK OPTION]

select_stmt

  • 是一種 SELECT 語句。它給出了視圖的定義。該語句可以從基表或其他視圖進行選擇。

column_name_list

  • 視圖必須具有唯一的列名,不得有重復,就像基表那樣。缺省情況下,由 SELECT 語句檢索的列名將用作視圖列名。
  • 要想為視圖列定義明確的名稱,可使用可選的 column_name_list 子句,列出由逗號隔開的 column_name。
  • column_name_list 中的名稱數目必須等于 SELECT 語句檢索的列數。
  • SELECT 語句檢索的列可以是對表列的簡單引用。也可以是使用函數、常量值、操作符等的表達式。

刪除視圖

當前用戶必須在每個視圖上有 DROP 權限。

MySQL :: MySQL 8.0 Reference Manual :: 15.1.35 DROP VIEW Statement

drop_view_stmt:DROP VIEW [IF EXISTS] view_name_list [CASCADE | RESTRICT];view_name_list:view_name [, view_name_list]

IF EXISTS

  • 使用 IF EXISTS 關鍵字可以防止由于視圖不存在而出錯。

view_name_list

  • 如果 view_name_list 中包含一部分存在和一部分不存在的視圖,執行可能報錯但是存在的視圖依然會被刪除。

CASCADE | RESTRICT

  • CASCADE 為級聯刪除,自動刪除依賴此視圖的對象。
  • RESTRICT 為約束刪除,如果有依賴對象存在,則拒絕刪除此視圖。

DROP VIEW v1,v2;
DROP VIEW IF EXISTS v3,v4;

可更新和不可更新視圖

MySQL :: MySQL 8.0 Reference Manual :: 27.5.3 Updatable and Insertable Views

https://www.cnblogs.com/zhuchenglin/p/9602569.html

要使視圖可更新,視圖中的行與基礎表中的行之間必須存在一對一的關系。還有一些其他構造使視圖不可更新。更具體地說,如果視圖包含以下任何內容,則該視圖不可更新:

  1. 聚合函數(SUM(), MIN(), MAX(), COUNT()等)。
  2. DISTINCT
  3. GROUP BY
  4. HAVING
  5. UNION 或 UNION ALL
  6. select 列表中的子查詢 (原話:Subquery in the select list)
    • 選擇列表中的非依賴子查詢無法進行插入,但可以進行更新、刪除。對于選擇列表中的依賴子查詢,不允許使用數據更改語句。
  1. Join 鏈接
  2. FROM子句中引用不可更新視圖
  3. WHERE子句中引用FROM子句中表的子查詢
  4. 僅引用文字值(在該情況下,沒有要更新的基本表)。
  5. ALGORITHM = TEMPTABLE(使用臨時表總會使視圖成為不可更新的)。
  6. 對基表任意列的多次引用(插入會失敗。更新/刪除 均正常)

視圖中生成的列被認為是可更新的,因為它可以指定給它。但是,如果顯式更新了此類列,則唯一允許的值是默認值。

多表視圖有時可能是可更新的,前提是可以使用合并算法(ALGORITHM = MERGE)進行處理。要使其工作,視圖必須使用內部聯接( inner join)(而不是外部聯接或并集,not an outer join or a UNION)。此外,視圖定義中只能更新一個表,因此SET子句只能命名視圖中某個表中的列。不允許使用UNION ALL的視圖,即使它們在理論上是可更新的。

INSERT

使用 INSERT 語句時,INSERT 語句中含有被合并的視圖引用(視圖聯接視圖的引用),如果是視圖聯接視圖的引用(案例中的vjoin),則這個視圖的所有組件必須都是可更新的(不是物化)。

對于多表組合成的可更新視圖,INSERT 是可以正常插入該視圖的其中一張表的。

CREATE TABLE t1 (x INTEGER);
CREATE TABLE t2 (c INTEGER);
CREATE VIEW vmat AS SELECT SUM(x) AS s FROM t1;
CREATE VIEW vup AS SELECT * FROM t2;
CREATE VIEW vjoin AS SELECT * FROM vmat JOIN vup ON vmat.s=vup.c;--此語句無效,因為聯接視圖的一個組件不可更新
INSERT INTO vjoin (c) VALUES (1);-- 本聲明有效;該視圖不包含物化組件
INSERT INTO vup (c) VALUES (1);

UPDATE

使用 UPDATE 語句更新的,有可能是被合并的一個或多個表的視圖引用。如果更新的是一個視圖聯接視圖,則必須保證聯接視圖中至少一個組件(其中一個視圖)是可以更新的,這里跟 INSERT 不同。

一個多表更新語句,語句更新表引用的必須是基表或可更新視圖的引用,不可更新表的引用可能是物化視圖或者派生表。

CREATE TABLE t1 (x INTEGER);
CREATE TABLE t2 (c INTEGER);
CREATE VIEW vmat AS SELECT SUM(x) AS s FROM t1;
CREATE VIEW vup AS SELECT * FROM t2;
CREATE VIEW vjoin AS SELECT * FROM vmat JOIN vup ON vmat.s=vup.c;-- 本聲明有效,列c來自聯接視圖的可更新部分:
UPDATE vjoin SET c=c+1;-- 本聲明無效,列x來自不可更新的部分:
UPDATE vjoin SET x=x+1;-- 本聲明有效,多表更新的更新表引用是一個可更新視圖(vup):
UPDATE vup JOIN (SELECT SUM(x) AS s FROM t1) AS dt ON ...
SET c=c+1;-- 本聲明無效,它嘗試更新一個物化派生表:
UPDATE vup JOIN (SELECT SUM(x) AS s FROM t1) AS dt ON ...
SET s=s+1;

DELETE

單表或多表被 DELETE 語句刪除,前提是必須是合并視圖聯接視圖則不被允許(與 INSERT / UPDATE 不同)。

CREATE TABLE t1 (x INTEGER);
CREATE TABLE t2 (c INTEGER);
CREATE VIEW vmat AS SELECT SUM(x) AS s FROM t1;
CREATE VIEW vup AS SELECT * FROM t2;
CREATE VIEW vjoin AS SELECT * FROM vmat JOIN vup ON vmat.s=vup.c;--此語句無效,因為該視圖是聯接視圖(the view is a join view):
DELETE FROM vjoin WHERE c=1;-- 此語句有效,因為該視圖是一個被合并的(可更新)視圖:
DELETE FROM vup WHERE c=2;-- 此語句有效,因為它從一個被合并的(可更新)視圖中刪除:
DELETE vup FROM vup JOIN (SELECT SUM(x) AS s FROM t1) AS dt ON dt.s=vup.c;

如果并非所有列都是簡單列引用(例如,如果視圖包含表達式或復合表達式的列),則視圖不可插入。雖然這樣的視圖是不可插入的,但如果只更新非表達式的列,則它是可更新的。考慮以下觀點:

CREATE VIEW v AS SELECT col1, 1 AS col2 FROM t;-- 可以更新
UPDATE v SET col1 = 0;-- 此視圖不可插入,因為col2是一個表達式。
UPDATE v SET col2=0;

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

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

相關文章

【HTML】tabindex

當給 div 標簽以 button 角色&#xff1a; <div role"button">這時要指定其 tabindex&#xff0c;因此正確的寫法是&#xff1a; <div role"button" tabindex"0">索引值不應當大于0&#xff0c;見a11y-positive-tabindex

Open3D(C++) Ransac擬合多項式曲線

目錄 一、算法原理一、代碼實現三、結果展示本文由CSDN點云俠原創,Open3D(C++) Ransac擬合多項式曲線,爬蟲自重。如果你不是在點云俠的博客中看到該文章,那么此處便是不要臉的爬蟲與GPT生成的文章。 一、算法原理 RANSAC(Random Sample Consensus)是一種用于擬合模型的迭…

設計模式深度解析:分布式與中心化

設計模式在軟件開發中扮演著至關重要的角色,它們提供了一套經過驗證的解決方案,用于解決常見的設計問題。在分布式和中心化這兩種不同的系統架構中,設計模式的應用也有所不同。以下是對這兩種架構下設計模式的深度解析: 分布式系統設計模式 在分布式系統中,由于系統被拆…

004 仿muduo實現高性能服務器組件_Buffer模塊與Socket模塊的實現

?&#x1f308;個人主頁&#xff1a;Fan_558 &#x1f525; 系列專欄&#xff1a;仿muduo &#x1f339;關注我&#x1f4aa;&#x1f3fb;帶你學更多知識 文章目錄 前言Buffer模塊Socket模塊 小結 前言 這章將會向你介紹仿muduo高性能服務器組件的buffer模塊與socket模塊的實…

【Leetcode 706 】設計哈希映射——數組嵌套鏈表(限制哈希Key)

題目 不使用任何內建的哈希表庫設計一個哈希映射&#xff08;HashMap&#xff09;。 實現 MyHashMap 類&#xff1a; MyHashMap() 用空映射初始化對象void put(int key, int value) 向 HashMap 插入一個鍵值對 (key, value) 。如果 key 已經存在于映射中&#xff0c;則更新其…

MATLAB的plot3使用技巧|更改視角|例程分享鏈接

plot3命令 MATLAB的plot3函數是用來繪制3D圖形的函數。它可以將三維數據可視化為線段、點、曲線等形式。plot3函數可以用于繪制三維空間中的曲線、曲面、散點圖等。 plot3函數的基本用法是&#xff1a; plot3(X,Y,Z)&#xff1a;繪制三維線段&#xff0c;其中X、Y、Z分別是包…

兩個雙指針 的 “他“和“ 她“會相遇么? —— “雙指針“算法 (Java版)

本篇會加入個人的所謂魚式瘋言 ??????魚式瘋言:??????此瘋言非彼瘋言 而是理解過并總結出來通俗易懂的大白話, 小編會盡可能的在每個概念后插入魚式瘋言,幫助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能說的不是那么嚴謹.但小編初心是能讓更多人能接…

MySQL入門學習-查詢進階.UNION

UNION操作符用于合并兩個或多個SELECT語句的結果集。它可以將多個查詢結果合并為一個結果集&#xff0c;這在需要從多個表中獲取數據并將它們組合在一起時非常有用。下面是一個使用UNION的示例代碼&#xff1a; SELECT column1, column2,...FROM table1UNIONSELECT column1, c…

springboot kafka 提高拉取數量

文章目錄 背景問題復現解決問題原理分析fetch.min.bytesfetch.max.wait.ms源碼分析ReplicaManager#fetchMessages 背景 開發過程中&#xff0c;使用kafka批量消費&#xff0c;發現拉取數量一直為1&#xff0c;如何提高批量拉取數量&#xff0c;記錄下踩坑記錄。 問題復現 ka…

攻防對抗少丟分,愛加密幫您筑起第二防線

應用程序通常處理和存儲大量的敏感數據&#xff0c;如用戶個人信息、財務信息、商業數據、國家數據等&#xff0c;用戶量越大的應用程序&#xff0c;其需要存儲和保護的用戶數據越多。因此應用層長期是攻擊方的核心目標&#xff0c;傳統應用安全依靠防火墻(FireWall)、入侵檢測…

1.7 協議層次和服務模型

協議層次 網絡是一個復雜的系統! ? 網絡功能繁雜&#xff1a;數字信號的物理信 號承載、點到點、路由、rdt、進程區分、應用等 ?現實來看&#xff0c;網絡的許多構成元素和設備: ? 主機 ? 路由器 ? 各種媒體的鏈路 ? 應用 ? 協議 ? 硬件, 軟件 Q:如何組織和實現這個…

Linux上實現ssh免密通訊

Linux上實現ssh免密通訊 1.SSH互信原理2.SSH所需的RPM包3.兩臺機器實現互信4.常見問題及處理 1.SSH互信原理 SSH&#xff08;Secure Shell&#xff09;是一種安全的傳輸協議&#xff0c;它能讓Linux系統中的服務器和客戶端之間進行安全可靠的通訊。 SSH使用加密的傳輸方式&…

iOS組件化 方案 實現

iOS組件化 組件化的原因現在流行的組件化方案方案一、url-block &#xff08;基于 URL Router&#xff09;方案二、protocol調用方式解讀 方案三、target-action調用方式解讀 gitHub代碼鏈接參考 組件化的原因 模塊間解耦模塊重用提高團隊協作開發效率單元測試 當項目App處于…

網絡原理-四

一、續 當窗口大小為0,意味著緩沖區滿了,此時發送方,就因該暫停發送,發送方會周期性的除法 " 窗口探測包 " ,并不攜帶載荷,這樣的包對于業務不產生影響,只是為了觸發ACK,一旦查詢出來的結果是非0,緩沖區右有空間了,發送方就可以繼續發送. 二、擁塞控制 要限制發送方…

一步一步寫線程之十三隊列間的消息通知

一、線程和分布式的通信 隨著技術的不斷發展&#xff0c;多線程和分布式通信愈發的普及。那么在這種場景下的如何進行數據的通信&#xff0c;便成為了一個非常典型的問題。無論是多線程還是分布式&#xff0c;其實其抽象出來的通信機制都是類似的。或者說換句話&#xff0c;多…

java檢測字符串是否包含數字和字母

在Java中&#xff0c;要檢測一個字符串是否同時包含數字和字母&#xff0c;我們可以使用正則表達式&#xff08;regex&#xff09;或者通過遍歷字符串并檢查每個字符來實現。以下是兩種方法的詳細代碼示例&#xff1a; 1.方法一&#xff1a;使用正則表達式 import java.util.…

【AI+知識庫問答】沉浸式體驗了解 AI知識庫問答fastGPT

之前寫過一篇文章 【AI本地知識庫】個人整理的幾種常見本地知識庫技術方案 &#xff0c; 由于當時主要是針對AI本地知識庫&#xff0c; 所以沒列fastGPT。 最近經常刷到fastGPT&#xff0c;這里單獨水一篇。 FastGPT 是一個基于 LLM 大語言模型的知識庫問答系統&#xff0c;…

Github 2024-06-01 開源項目日報Top10

根據Github Trendings的統計,今日(2024-06-01統計)共有10個項目上榜。根據開發語言中項目的數量,匯總情況如下: 開發語言項目數量Python項目5Jupyter Notebook項目2TypeScript項目1Go項目1Shell項目1Lua項目1Kong:云原生API網關與AI能力 創建周期:3482 天開發語言:Lua協議…

如何確保績效目標執行到位?

很多企業在實施績效過程中&#xff0c;盡管制定好了績效目標&#xff0c;但是沒有執行下去&#xff0c;管理者將原因歸咎于“員工低效”、“體制機制”等問題&#xff0c;那么在人力資源管理方面&#xff0c;企業應該如何確保制定的績效目標執行到位&#xff1f;如何提高低效能…

云原生架構相關技術_4.服務網格

1.技術特點 服務網格&#xff08;ServiceMesh&#xff09;是分布式應用在微服務軟件架構之上發展起來的新技術&#xff0c;旨在將那些微服務間的連接、安全、流量控制和可觀測等通用功能下沉為平臺基礎設施&#xff0c;實現應用與平臺基礎設施的解耦。這個解耦意味著開發者無需…