redis一致性問(wèn)題怎么解決 讀鎖和寫(xiě)鎖區(qū)別?
讀鎖和寫(xiě)鎖區(qū)別?共享鎖也稱(chēng)為讀鎖。如果事務(wù)t將s鎖添加到數(shù)據(jù)對(duì)象a,則事務(wù)t可以讀取a,但不能修改a。其他事務(wù)只能將s鎖添加到a,而不能添加x鎖,直到t釋放a上的s鎖。這確保了其他事務(wù)可以讀取a,但在
讀鎖和寫(xiě)鎖區(qū)別?
共享鎖也稱(chēng)為讀鎖。如果事務(wù)t將s鎖添加到數(shù)據(jù)對(duì)象a,則事務(wù)t可以讀取a,但不能修改a。其他事務(wù)只能將s鎖添加到a,而不能添加x鎖,直到t釋放a上的s鎖。這確保了其他事務(wù)可以讀取a,但在t釋放a上的s鎖之前,t不能對(duì)a進(jìn)行任何更改。
獨(dú)占鎖(x鎖)也稱(chēng)為寫(xiě)入鎖上。如果事務(wù)t對(duì)數(shù)據(jù)對(duì)象a應(yīng)用x鎖,則事務(wù)t可以讀取a或修改a。在t釋放a上的鎖之前,其他事務(wù)無(wú)法對(duì)a應(yīng)用任何鎖。這確保了在t釋放a上的鎖之前,其他事務(wù)無(wú)法讀取和修改a
。jedis和reisson之間有何區(qū)別?
jedis和redisson都用Java封裝redis操作。Jedis簡(jiǎn)單地封裝了redis的API庫(kù),可以看作redis客戶機(jī)。它的方法與redis命令非常相似。redison不僅封裝了redis,而且封裝了對(duì)更多數(shù)據(jù)結(jié)構(gòu)、鎖等功能的支持,比jedis更大。但絕地武士比雷迪森更具獨(dú)創(chuàng)性和靈活性。
Redis官方推薦十多種Java語(yǔ)言封裝框架(Redis官網(wǎng)),主要是jedis和redisson。
[jedis
jedis是一個(gè)用Java實(shí)現(xiàn)的redis客戶端。它的API提供了與redis本地命令類(lèi)似的全面支持。與其他redis封裝框架相比,它更為原生。
它的主要用途是使用jedispool
避免落入setnx(如果不存在則設(shè)置)陷阱的最好方法是永遠(yuǎn)不要使用它:
setnx lock “l(fā)ock”
expire lock 100
del如果存在大量并發(fā)緩存請(qǐng)求,如果有鎖機(jī)制,則會(huì)出現(xiàn)大量緩存溢出,只能控制一個(gè)請(qǐng)求來(lái)更新緩存。其他請(qǐng)求根據(jù)情況等待或使用過(guò)期的緩存。
$key=“cache update Lock”//Lock
$random=MD5(uniqid(getmypid())。“”.mturand().“”,true))//隨機(jī)值
$TTL=10//NX不存在,ex為過(guò)期時(shí)間,TTL為生存時(shí)間,單位為秒
if($redis->set($key,$random,[“NX”,“ex”=>$TTL]){
$cache->update()//鎖定后執(zhí)行業(yè)務(wù)邏輯,這里是update cache
//添加隨機(jī)值判斷避免刪除其他操作的鎖
如果($redis->get($key)==$random){
$redis->del($key)}