php怎么保持?jǐn)?shù)據(jù)一致性 php怎么實(shí)現(xiàn)修改數(shù)據(jù)功能

如何讓php中通過(guò)字段和記錄查詢得到的mysql返回?cái)?shù)據(jù)保持原有的數(shù)據(jù)類型

php是弱語(yǔ)言,從mysql取到的類型全是string字符串,如果你需要其他類型,你需要自己轉(zhuǎn)換一下。

創(chuàng)新互聯(lián)專注于企業(yè)全網(wǎng)營(yíng)銷推廣、網(wǎng)站重做改版、中方網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5網(wǎng)站設(shè)計(jì)商城網(wǎng)站制作、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為中方等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。

php有沒(méi)有操作一致性的方法?同時(shí)成功同時(shí)失敗

你說(shuō)的應(yīng)該是mysql的事務(wù)機(jī)制,修改不同表數(shù)據(jù)的時(shí)候,要么同時(shí)成功,只要有一條失敗都不能算成功,你可以用php手動(dòng)開(kāi)啟事務(wù),可以這么寫(xiě)

$mysqli-query("START?TRANSACTION");

$mysqli-query("INSERT?INTO?a(field1)?VALUES?('a1')");

$mysqli-query("INSERT?INTO?b(field2)?VALUES?('a2')");

$mysqli-query("commit");

大概格式就是這樣,希望對(duì)你有幫助

在數(shù)據(jù)庫(kù)中怎樣同時(shí)保持?jǐn)?shù)據(jù)的完整性和歷史數(shù)據(jù)的完整性。

數(shù)據(jù)庫(kù)的安全性、完整性、并發(fā)控制和恢復(fù)

from:

為了保證數(shù)據(jù)庫(kù)數(shù)據(jù)的安全可靠性和正確有效,DBMS必須提供統(tǒng)一的數(shù)據(jù)保護(hù)功能。數(shù)據(jù)保護(hù)也為數(shù)據(jù)控制,主要包括數(shù)據(jù)庫(kù)的安全性、完整性、并發(fā)控制和恢復(fù)。

1. 數(shù)據(jù)庫(kù)的存取控制

ORACLE保護(hù)信息的方法采用任意存取控制來(lái)控制全部用戶對(duì)命名對(duì)象的存取。用戶對(duì)對(duì)象的存取受特權(quán)控制。一種特權(quán)是存取一命名對(duì)象的許可,為一種規(guī)定格式。

ORACLE使用多種不同的機(jī)制管理數(shù)據(jù)庫(kù)安全性,其中有兩種機(jī)制:模式和用戶。模式為模式對(duì)象的集合,模式對(duì)象如表、視圖、過(guò)程和包等。第一數(shù)據(jù)庫(kù)有一組模式。

每一ORACLE數(shù)據(jù)庫(kù)有一組合法的用戶,可存取一數(shù)據(jù)庫(kù),可運(yùn)行一數(shù)據(jù)庫(kù)應(yīng)用和使用該用戶各連接到定義該用戶的數(shù)據(jù)庫(kù)。當(dāng)建立一數(shù)據(jù)庫(kù)用戶時(shí),對(duì)該用戶建立一個(gè)相應(yīng)的模式,模式名與用戶名相同。一旦用戶連接一數(shù)據(jù)庫(kù),該用戶就可存取相應(yīng)模式中的全部對(duì)象,一個(gè)用戶僅與同名的模式相聯(lián)系,所以用戶和模式是類似的。

用戶的存取權(quán)利受用戶安全域的設(shè)置所控制,在建立一個(gè)數(shù)據(jù)庫(kù)的新用戶或更改一已有用戶時(shí),安全管理員對(duì)用戶安全域有下列決策:

l 是由數(shù)據(jù)庫(kù)系統(tǒng)還是由操作系統(tǒng)維護(hù)用戶授權(quán)信息。

l 設(shè)置用戶的缺省表空間和臨時(shí)表空間。

l 列出用戶可存的表空間和在表空間中可使用空間份額。

l 設(shè)置用戶資源限制的環(huán)境文件,該限制規(guī)定了用戶可用的系統(tǒng)資源的總量。

l 規(guī)定用戶具有的特權(quán)和角色,可存取相應(yīng)的對(duì)象。

每一個(gè)用戶有一個(gè)安全域,它是一組特性,可決定下列內(nèi)容:

l 用戶可用的特權(quán)和角色;

l 用戶可用的表空間的份額;

l 用戶的系統(tǒng)資源限制。

1) 用戶鑒別:

為了防止非授權(quán)的數(shù)據(jù)庫(kù)用戶的使用,ORACLE提供二種確認(rèn)方法

操作系統(tǒng)確認(rèn)和相應(yīng)的ORACLE數(shù)據(jù)庫(kù)確認(rèn)。

如果操作系統(tǒng)允許,ORACLE可使用操作系統(tǒng)所維護(hù)的信息來(lái)鑒定用戶。由操作系統(tǒng)鑒定用戶的優(yōu)點(diǎn)是:

l 用戶可更方便地連接到ORACLE,不需要指定用戶名和口令。

l 對(duì)用戶授權(quán)的控制集中在操作系統(tǒng),ORACLE不需要存儲(chǔ)和管理用戶口令。然而用戶名在數(shù)據(jù)庫(kù)中仍然要維護(hù)。

l 在數(shù)據(jù)庫(kù)中的用戶名項(xiàng)和操作系統(tǒng)審計(jì)跟蹤相對(duì)應(yīng)。

ORACLE數(shù)據(jù)庫(kù)方式的用戶確認(rèn):ORACLE利用存儲(chǔ)在數(shù)據(jù)庫(kù)中的信息可鑒定試圖接到數(shù)據(jù)庫(kù)的一用戶,這種鑒別方法僅當(dāng)操作系統(tǒng)不能用于數(shù)據(jù)庫(kù)用戶鑒別時(shí)才使用。當(dāng)用戶使用一ORACLE數(shù)據(jù)庫(kù)時(shí)執(zhí)行用戶鑒別。每個(gè)用戶在建立時(shí)有一個(gè)口令,用戶口令在建立對(duì)數(shù)據(jù)庫(kù)連接時(shí)使用,以防止對(duì)數(shù)據(jù)庫(kù)非授權(quán)的使用。用戶的口令以密碼的格式存儲(chǔ)在數(shù)據(jù)庫(kù)數(shù)據(jù)字典中,用戶可隨時(shí)修改其口令。

2) 用戶的表空間設(shè)置和定額

關(guān)于表空間的使用有幾種設(shè)置選擇:

l 用戶的缺省表空間;

l 用戶的臨時(shí)表空間;

l 數(shù)據(jù)庫(kù)表空間的空間使用定額。

3) 用戶資源限制和環(huán)境文件

用戶可用的各種系統(tǒng)資源總量的限制是用戶安全域的部分。利用顯式地設(shè)置資源限制;安全管理員可防止用戶無(wú)控制地消耗寶貴的系統(tǒng)資源。資源限制是由環(huán)境文件管理。一個(gè)環(huán)境文件是命名的一組賦給用戶的資源限制。另外ORACLE為安全管理員在數(shù)據(jù)庫(kù)級(jí)提供使能或使不能實(shí)施環(huán)境文件資源限制的選擇。

ORACLE可限制幾種類型的系統(tǒng)資源的使用,每種資源可在會(huì)話級(jí)、調(diào)用級(jí)或兩者上控制。在會(huì)話級(jí):每一次用戶連接到一數(shù)據(jù)庫(kù),建立一會(huì)話。每一個(gè)會(huì)話在執(zhí)行SQL語(yǔ)句的計(jì)算機(jī)上耗費(fèi)CPU時(shí)間和內(nèi)存量進(jìn)行限制。對(duì)ORACLE的幾種資源限制可在會(huì)話級(jí)上設(shè)置。如果會(huì)話級(jí)資源限制被超過(guò),當(dāng)前語(yǔ)句被中止(回滾),并返回指明會(huì)話限制已達(dá)到的信息。此時(shí),當(dāng)前事務(wù)中所有之前執(zhí)行的語(yǔ)句不受影響,此時(shí)僅可作COMMIT、ROLLBACK或刪除對(duì)數(shù)據(jù)庫(kù)的連接等操作,進(jìn)行其它操作都將出錯(cuò)。

在調(diào)用級(jí):在SQL語(yǔ)句執(zhí)行時(shí),處理該語(yǔ)句有好幾步,為了防止過(guò)多地調(diào)用系統(tǒng),ORACLE在調(diào)用級(jí)可設(shè)置幾種資源限制。如果調(diào)用級(jí)的資源限制被超過(guò),語(yǔ)句處理被停止,該語(yǔ)句被回滾,并返回一錯(cuò)誤。然而當(dāng)前事務(wù)的已執(zhí)行所用語(yǔ)句不受影響,用戶會(huì)話繼續(xù)連接。

二、 數(shù)據(jù)完整性

它是指數(shù)據(jù)的正確性和相容性。數(shù)據(jù)的完整性是為了防止數(shù)據(jù)庫(kù)存在不符合主義的數(shù)據(jù),防止錯(cuò)誤信息輸入和輸出,即數(shù)據(jù)要遵守由DBA或應(yīng)用開(kāi)發(fā)者所決定的一組預(yù)定義的規(guī)則。ORACLE應(yīng)用于關(guān)系數(shù)據(jù)庫(kù)的表的數(shù)據(jù)完整性有下列類型:

l 在插入或修改表的行時(shí)允許不允許包含有空值的列,稱為空與非空規(guī)則。

l 唯一列值規(guī)則,允許插入或修改的表行在該列上的值唯一。

l 引用完整性規(guī)則,同關(guān)系模型定義

l 用戶對(duì)定義的規(guī)則,為復(fù)雜性完整性檢查。

ORACLE允許定義和實(shí)施上述每一種類型的數(shù)據(jù)完整性規(guī)則,這些規(guī)則可用完整性約束和數(shù)據(jù)庫(kù)觸發(fā)器定義。

完整性約束,是對(duì)表的列定義一規(guī)則的說(shuō)明性方法。

數(shù)據(jù)庫(kù)觸發(fā)器,是使用非說(shuō)明方法實(shí)施完整性規(guī)則,利用數(shù)據(jù)庫(kù)觸發(fā)器(存儲(chǔ)的數(shù)據(jù)庫(kù)過(guò)程)可定義和實(shí)施任何類型的完整性規(guī)則。

1. 完整性約束

ORACLE利用完整性約束機(jī)制防止無(wú)效的數(shù)據(jù)進(jìn)入數(shù)據(jù)庫(kù)的基表,如果任何DML執(zhí)行結(jié)果破壞完整性約束,該語(yǔ)句被回滾并返回一上個(gè)錯(cuò)誤。ORACLE實(shí)現(xiàn)的完整性約束完全遵守ANSI

X3。135-1989和ISO9075-1989標(biāo)準(zhǔn)。

利用完整性約束實(shí)施數(shù)據(jù)完整性規(guī)則有下列優(yōu)點(diǎn):

l 定義或更改表時(shí),不需要程序設(shè)計(jì),便很容易地編寫(xiě)程序并可消除程序性錯(cuò)誤,其功能是由ORACLE控制。所以說(shuō)明性完整性約束優(yōu)于應(yīng)用代碼和數(shù)據(jù)庫(kù)觸發(fā)器。

l 對(duì)表所定義的完整性約束是存儲(chǔ)在數(shù)據(jù)字典中,所以由任何應(yīng)用進(jìn)入的數(shù)據(jù)都必須遵守與表相關(guān)聯(lián)的完整性約束。

l 具有最大的開(kāi)發(fā)能力。當(dāng)由完整性約束所實(shí)施的事務(wù)規(guī)則改變時(shí),管理員只需改變完整性約束的定義,所有應(yīng)用自動(dòng)地遵守所修改的約束。

l 由于完整性約束存儲(chǔ)在數(shù)據(jù)字典中,數(shù)據(jù)庫(kù)應(yīng)用可利用這些信息,在SQL語(yǔ)句執(zhí)行之前或由ORACLE檢查之前,就可立即反饋信息。

l 由于完整性約束說(shuō)明的語(yǔ)義是清楚地定義,對(duì)于每一指定說(shuō)明規(guī)則可實(shí)現(xiàn)性能優(yōu)化。

l

由于完整性約束可臨時(shí)地使不能,以致在裝入大量數(shù)據(jù)時(shí)可避免約束檢索的開(kāi)銷。當(dāng)數(shù)據(jù)庫(kù)裝入完成時(shí),完整性約束可容易地使其能,任何破壞完整性約束的任何新行在例外表中列出。

ORACLE的DBA和應(yīng)用開(kāi)始者對(duì)列的值輸入可使用的完整性約束有下列類型:

l NOT NULL約束:如果在表的一列的值不允許為空,則需在該列指定NOT NULL約束。

l

UNIQUE碼約束:在表指定的列或組列上不允許兩行是具有重復(fù)值時(shí),則需要該列或組列上指定UNIQUE碼完整性約束。在UNIQUE碼約束定義中的列或組列稱為唯一碼。所有唯一完整性約束是用索引方法實(shí)施。

l PRIMARY KEY約束:在數(shù)據(jù)庫(kù)中每一個(gè)表可有一個(gè)PRIMARY KEY約束。包含在PRIMARY

KEY完整性約束的列或組列稱為主碼,每個(gè)表可有一個(gè)主碼。ORACLE使用索引實(shí)施PRIMARY KEY約束。

l FOREIGN

KEY約束(可稱引用約束):在關(guān)系數(shù)據(jù)庫(kù)中表可通過(guò)公共列相關(guān)聯(lián),該規(guī)則控制必須維護(hù)的列之間的關(guān)系。包含在引用完整性約束定義的列或組列稱為外來(lái)碼。由外來(lái)碼所引用的表中的唯一碼或方碼,稱為引用碼。包含有外來(lái)碼的表稱為子表或從屬表。由子表的外來(lái)碼所引用的表稱為雙親表或引用表。如果對(duì)表的每一行,其外來(lái)碼的值必須與主碼中一值相匹配,則需指定引用完整性約束。

l

CHECK約束:表的每行對(duì)一指定的條件必須是TRUE或未知,則需在一列或列組上指定CHECK完整性約束。如果在發(fā)出一個(gè)DML語(yǔ)句時(shí),CHECK約束的條件計(jì)算得FALSE時(shí),該語(yǔ)句被回滾。

3. 并發(fā)控制

數(shù)據(jù)庫(kù)是一個(gè)共享資源,可為多個(gè)應(yīng)用程序所共享。這些程序可串行運(yùn)行,但在許多情況下,由于應(yīng)用程序涉及的數(shù)據(jù)量可能很大,常常會(huì)涉及輸入/輸出的交換。為了有效地利用數(shù)據(jù)庫(kù)資源,可能多個(gè)程序或一個(gè)程序的多個(gè)進(jìn)程并行地運(yùn)行,這就是數(shù)據(jù)庫(kù)的并行操作。在多用戶數(shù)據(jù)庫(kù)環(huán)境中,多個(gè)用戶程序可并行地存取數(shù)據(jù)庫(kù),如果不對(duì)并發(fā)操作進(jìn)行控制,會(huì)存取不正確的數(shù)據(jù),或破壞數(shù)據(jù)庫(kù)數(shù)據(jù)的一致性。

例:在飛機(jī)票售票中,有兩個(gè)訂票員(T1,T2)對(duì)某航線(A)的機(jī)動(dòng)性票作事務(wù)處理,操作過(guò)程如圖所示:

數(shù)據(jù)庫(kù)中的A111100

T1 READ A A:=A-1 WRITE A

T2 READ A A:=A-1 WRITE A

T1工作區(qū)中的A110000

T2工作區(qū)中的A 11000

首先T1讀A,接著T2也讀A。然后T1將其工作區(qū)中的A減1,T2也采取同樣動(dòng)作,它們都得0值,最后分別將0值寫(xiě)回?cái)?shù)據(jù)庫(kù)。在這過(guò)程中沒(méi)有任何非法操作,但實(shí)際上多出一張機(jī)票。這種情況稱為數(shù)據(jù)庫(kù)的不一致性,這種不一致性是由于并行操作而產(chǎn)生的。所謂不一致,實(shí)際上是由于處理程序工作區(qū)中的數(shù)據(jù)與數(shù)據(jù)庫(kù)中的數(shù)據(jù)不一致所造成的。如果處理程序不對(duì)數(shù)據(jù)庫(kù)中的數(shù)據(jù)進(jìn)行修改,則決不會(huì)造成任何不一致。另一方面,如果沒(méi)有并行操作發(fā)生,則這種臨時(shí)的不一致也不會(huì)造成什么問(wèn)題。數(shù)據(jù)不一致總是是由兩個(gè)因素造成:一是對(duì)數(shù)據(jù)的修改,二是并行操作的發(fā)生。因此為了保持?jǐn)?shù)據(jù)庫(kù)的一致性,必須對(duì)并行操作進(jìn)行控制。最常用的措施是對(duì)數(shù)據(jù)進(jìn)行封鎖。

1) 數(shù)據(jù)庫(kù)不一致的類型

l 不一致性

在一事務(wù)期間,其它提交的或未提交事務(wù)的修改是顯然的,以致由查詢所返回的數(shù)據(jù)集不與任何點(diǎn)相一致。

l 不可重復(fù)讀

在一個(gè)事務(wù)范圍內(nèi),兩個(gè)相同查詢將返回不同數(shù)據(jù),由于查詢注意到其它提交事務(wù)的修改而引起。

l 讀臟數(shù)據(jù)

如果事務(wù)T1將一值(A)修改,然后事務(wù)T2讀該值,在這之后T1由于某種原因撤銷對(duì)該值的修改,這樣造成T2讀取的值是臟的。

l 丟失更改

在一事務(wù)中一修改重寫(xiě)另一事務(wù)的修改,如上述飛機(jī)票售票例子。

l 破壞性的DDL操作

在一用戶修改一表的數(shù)據(jù)時(shí),另一用戶同時(shí)更改或刪除該表。

1) 封鎖

在多用戶數(shù)據(jù)庫(kù)中一般采用某些數(shù)據(jù)封鎖來(lái)解決并發(fā)操作中的數(shù)據(jù)一致性和完整性問(wèn)題。封鎖是防止存取同一資源的用戶之間破壞性的干擾的機(jī)制,該干擾是指不正確地修改數(shù)據(jù)或不正確地更改數(shù)據(jù)結(jié)構(gòu)。

在多用戶數(shù)據(jù)庫(kù)中使用兩種封鎖:排它(專用)封鎖和共享封鎖。排它封鎖禁止相關(guān)資源的共享,如果一事務(wù)以排它方式封鎖一資源,僅僅該事務(wù)可更改該資源,直至釋放排它封鎖。共享封鎖允許相關(guān)資源可以共享,幾個(gè)用戶可同時(shí)讀同一數(shù)據(jù),幾個(gè)事務(wù)可在同一資源上獲取共享封鎖。共享封鎖比排它封鎖具有更高的數(shù)據(jù)并行性。

在多用戶系統(tǒng)中使用封鎖后會(huì)出現(xiàn)死鎖,引起一些事務(wù)不能繼續(xù)工作。當(dāng)兩個(gè)或多個(gè)用戶彼此等待所封鎖數(shù)據(jù)時(shí)可發(fā)生死鎖。

2) ORACLE多種一致性模型。

ORACLE利用事務(wù)和封鎖機(jī)制提供數(shù)據(jù)并發(fā)存取和數(shù)據(jù)完整性。在一事務(wù)內(nèi)由語(yǔ)句獲取的全部封鎖在事務(wù)期間被保持,防止其它并行事務(wù)的破壞性干擾。一個(gè)事務(wù)的SQL語(yǔ)句所作的修改在它提交之后所啟動(dòng)的事務(wù)中才是可見(jiàn)的。在一事務(wù)中由語(yǔ)句所獲取的全部封鎖在該事務(wù)提交或回滾時(shí)被釋放。

ORACLE在兩個(gè)不同級(jí)上提供讀一致性:語(yǔ)句級(jí)讀一致性和事務(wù)級(jí)一致性。ORCLE總是實(shí)施語(yǔ)句級(jí)讀一致性,保證單個(gè)查詢所返回的數(shù)據(jù)與該查詢開(kāi)始時(shí)刻相一致。所以一個(gè)查詢從不會(huì)看到在查詢執(zhí)行過(guò)程中提交的其它事務(wù)所作的任何修改。為了實(shí)現(xiàn)語(yǔ)句級(jí)讀一致性,在查詢進(jìn)入執(zhí)行階段時(shí),在注視SCN的時(shí)候?yàn)橹顾峤坏臄?shù)據(jù)是有效的,而在語(yǔ)句執(zhí)行開(kāi)始之后其它事務(wù)提交的任何修改,查詢將是看不到的。

ORACLE允許選擇實(shí)施事務(wù)級(jí)讀一致性,它保證在同一事務(wù)內(nèi)所有查詢的數(shù)據(jù)

4) 封鎖機(jī)制

ORACLE自動(dòng)地使用不同封鎖類型來(lái)控制數(shù)據(jù)的并行存取,防止用戶之間的破壞性干擾。ORACLE為一事務(wù)自動(dòng)地封鎖一資源以防止其它事務(wù)對(duì)同一資源的排它封鎖。在某種事件出現(xiàn)或事務(wù)不再需要該資源時(shí)自動(dòng)地釋放。

ORACLE將封鎖分為下列類:

l

數(shù)據(jù)封鎖:數(shù)據(jù)封鎖保護(hù)表數(shù)據(jù),在多個(gè)用戶并行存取數(shù)據(jù)時(shí)保證數(shù)據(jù)的完整性。數(shù)據(jù)封鎖防止相沖突的DML和DDL操作的破壞性干擾。DML操作可在兩個(gè)級(jí)獲取數(shù)據(jù)封鎖:指定行封鎖和整個(gè)表封鎖,在防止沖突的DDL操作時(shí)也需表封鎖。當(dāng)行要被修改時(shí),事務(wù)在該行獲取排它數(shù)據(jù)封鎖。表封鎖可以有下列方式:行共享、行排它、共享封鎖、共享行排它和排它封鎖。

l DDL封鎖(字典封鎖)

DDL封鎖保護(hù)模式對(duì)象(如表)的定義,DDL操作將影響對(duì)象,一個(gè)DDL語(yǔ)句隱式地提交一個(gè)事務(wù)。當(dāng)任何DDL事務(wù)需要時(shí)由ORACLE自動(dòng)獲取字典封鎖,用戶不能顯式地請(qǐng)求DDL封鎖。在DDL操作期間,被修改或引用的模式對(duì)象被封鎖。

l 內(nèi)部封鎖:保護(hù)內(nèi)部數(shù)據(jù)庫(kù)和內(nèi)存結(jié)構(gòu),這些結(jié)構(gòu)對(duì)用戶是不可見(jiàn)的。

php 分頁(yè)查詢?cè)趺磖edis緩存

對(duì)于有分頁(yè)條件的緩存,我們也可以按照不同的分頁(yè)條件來(lái)緩存多個(gè)key,比如分頁(yè)查詢產(chǎn)品列表,page=1limit=10和page=1limit=5這兩次請(qǐng)求可以這樣緩存查詢結(jié)果

productList:page:1:limit:10

productList:page:1:limit:5

這個(gè)是一種常見(jiàn)方案,但是存在著一些問(wèn)題:

緩存的value存在冗余,productList:page:1:limit:10緩存的內(nèi)容其實(shí)是包括了productList:page:1:limit:5中的內(nèi)容(緩存兩個(gè)key的時(shí)候,數(shù)據(jù)未發(fā)生變化的情況下)

僅僅是改變了查詢條件的分頁(yè)條件,就會(huì)導(dǎo)致緩存未命中,降低了緩存的命中率

為了保證數(shù)據(jù)一致性,需要清理緩存的時(shí)候,很難處理,redis的keys命令對(duì)性能影響很大,會(huì)導(dǎo)致redis很大的延遲,生產(chǎn)環(huán)境一般來(lái)說(shuō)禁止該命令。自己手動(dòng)拼緩存key,你可能根本不知道拼到哪一個(gè)page為止。

放棄數(shù)據(jù)一致性,通過(guò)設(shè)置失效時(shí)間來(lái)自動(dòng)失效,可能會(huì)出現(xiàn)查詢第一頁(yè)命中了緩存,查詢第二頁(yè)的時(shí)候未命中緩存,但此時(shí)數(shù)據(jù)已經(jīng)發(fā)生了改變,導(dǎo)致第二頁(yè)查詢返回的和第一頁(yè)相同的結(jié)果。

以上,在分頁(yè)條件下這樣使用常規(guī)方案總感覺(jué)有諸多困擾,諸多麻煩,那是不是就應(yīng)該放棄使用緩存?

基于SortedSet的分頁(yè)查詢緩存方案

首先想到的解決方法是使用@see ListOperationsK, V不再根據(jù)分頁(yè)條件使用多個(gè)key,而是使用一個(gè)key,也不分頁(yè)將全部的數(shù)據(jù)緩存到redis中,然后按照分頁(yè)條件使用range(key,start,limit)獲取分頁(yè)的結(jié)果,這個(gè)會(huì)導(dǎo)致一個(gè)問(wèn)題,當(dāng)緩存失效時(shí),并發(fā)的寫(xiě)緩存會(huì)導(dǎo)致出現(xiàn)重復(fù)數(shù)據(jù)

所以想到通過(guò)使用set來(lái)處理并發(fā)時(shí)的重復(fù)數(shù)據(jù),@see ZSetOperationsK, V

代碼邏輯如下:

range(key,start,limit)按照分頁(yè)條件獲取緩存,命中則直接返回

緩存未命中,查詢(沒(méi)有分頁(yè)條件)數(shù)據(jù)庫(kù)或是調(diào)用(沒(méi)有分頁(yè))底層接口

add(key,valueScoreMapvalue,score)寫(xiě)入緩存,expire設(shè)置緩存時(shí)間

當(dāng)需要清理緩存時(shí),直接刪除key,如果是因?yàn)閿?shù)據(jù)新增和刪除,可以add(key,value,score)或remove(key,value)

redis中會(huì)按照score分值升序排列map中的數(shù)據(jù),一般的,score分值是sql語(yǔ)句的order by filedA的filedA的值,這樣能保證數(shù)據(jù)一致性

但是這種方式也存在一定問(wèn)題:

這個(gè)key緩存的value確實(shí)是熱數(shù)據(jù),但可能只有少數(shù)數(shù)據(jù)被頻繁使用其余的可能根本就未被使用,比如數(shù)據(jù)有100頁(yè),實(shí)際可能只會(huì)用到前10頁(yè),這也會(huì)導(dǎo)致緩存空間的浪費(fèi),如果使用了redis虛擬內(nèi)存,也會(huì)有一定影響

sql查詢由原來(lái)的分頁(yè)查詢變成了不分頁(yè)查詢,緩存失效后,系統(tǒng)的處理能力較之前會(huì)有下降,尤其是對(duì)于大表.

標(biāo)題名稱:php怎么保持?jǐn)?shù)據(jù)一致性 php怎么實(shí)現(xiàn)修改數(shù)據(jù)功能
網(wǎng)頁(yè)路徑:http://muchs.cn/article26/ddehejg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、定制開(kāi)發(fā)、建站公司域名注冊(cè)、企業(yè)網(wǎng)站制作網(wǎng)頁(yè)設(shè)計(jì)公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

綿陽(yáng)服務(wù)器托管