Redis是一個(gè)開源的,基于內(nèi)存的結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)媒介,可以作為數(shù)據(jù)庫、緩存服務(wù)或消息服務(wù)使用。
Redis支持多種數(shù)據(jù)結(jié)構(gòu),包括字符串、哈希表、鏈表、集合、有序集合、位圖、Hyperloglogs等。
Redis具備LRU淘汰、事務(wù)實(shí)現(xiàn)、以及不同級(jí)別的硬盤持久化等能力,并且支持副本集和通過Redis Sentinel實(shí)現(xiàn)的高可用方案,同時(shí)還支持通過Redis Cluster實(shí)現(xiàn)的數(shù)據(jù)自動(dòng)分片能力。Redis的主要功能都基于單線程模型實(shí)現(xiàn),也就是說Redis使用一個(gè)線程來服務(wù)所有的客戶端請(qǐng)求,同時(shí)Redis采用了非阻塞式IO,并精細(xì)地優(yōu)化各種命令的算法時(shí)間復(fù)雜度。
Redis 作為一個(gè)非常成功的數(shù)據(jù)庫,提供了非常豐富的數(shù)據(jù)類型和命令,使用這些,我們可以輕易而高效地完成很多緩存操作,可是總有一些比較特殊問題或需求需要解決,這時(shí)候可能就需要我們自己定制自己的 Redis 數(shù)據(jù)結(jié)構(gòu)和命令。
Redis是線程安全的(因?yàn)橹挥幸粋€(gè)線程),其所有操作都是原子的,不會(huì)因并發(fā)產(chǎn)生數(shù)據(jù)異常。我們都知道 Redis 是單線程的,可是它怎么會(huì)有線程安全問題呢?
Redis 的線程安全問題的產(chǎn)生,并不是來自于 Redis 服務(wù)器內(nèi)部。Redis 作為數(shù)據(jù)服務(wù)器,就相當(dāng)于多個(gè)客戶端的共享內(nèi)存,多個(gè)客戶端就相當(dāng)于同一進(jìn)程下的多個(gè)線程,如果多個(gè)客戶端之間沒有良好的數(shù)據(jù)同步策略,就會(huì)產(chǎn)生類似線程安全的問題。
典型場(chǎng)景是:
?
Redis 內(nèi)存儲(chǔ)了一個(gè)用戶的狀態(tài):user5277=idle;
?
客戶端連接 A 讀取了用戶狀態(tài),獲取到用戶的空閑狀態(tài) status = get("user5277");
?
客戶端連接 B 也同樣讀取了用戶狀態(tài);
?
客戶端連接 A 給用戶安排了一個(gè)任務(wù),并將 Redis 內(nèi)用戶狀態(tài)置為忙碌 set("user5277", "busy");
?
客戶端連接 B 同樣設(shè)置用戶為忙碌狀態(tài)。
?
可是此時(shí)用戶卻被同時(shí)分配了兩個(gè)任務(wù)。
導(dǎo)致這個(gè)問題的原因就是雖然 Redis 是單線程的,能保證命令的序列化,但由于其執(zhí)行效率很高,多個(gè)客戶端的命令之間不做好請(qǐng)求同步,同樣會(huì)造成命令的順序錯(cuò)亂。
當(dāng)然這個(gè)問題也很好解決,給用戶狀態(tài)加鎖就行了,使同一時(shí)間內(nèi)只能有一個(gè)客戶端操作用戶狀態(tài)。不過加鎖我們就需要考慮鎖粒度、死鎖等問題了,無疑添加了程序的復(fù)雜性,不利于維護(hù)。
云數(shù)據(jù)庫Redis專有網(wǎng)絡(luò)VPC在TCP層直接進(jìn)行網(wǎng)絡(luò)隔離保護(hù);內(nèi)存加硬盤的混合存儲(chǔ)方式,在提供高速數(shù)據(jù)讀寫能力的同時(shí)滿足數(shù)據(jù)持久化需求,支持單節(jié)點(diǎn)架構(gòu)、主從架構(gòu)、分布式集群架構(gòu),滿足純緩存場(chǎng)景、讀寫分離、隨時(shí)需要擴(kuò)展數(shù)據(jù)庫性能等不同的業(yè)務(wù)需求,可根據(jù)業(yè)務(wù)需求對(duì)集群進(jìn)行升配、擴(kuò)容等操作,集群版支持增加主節(jié)點(diǎn),實(shí)現(xiàn)云上資源彈性擴(kuò)展:http://jinyejixie.com/
創(chuàng)新互聯(lián)建站為客戶提供專業(yè)的成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、外貿(mào)營銷網(wǎng)站建設(shè)、程序、域名、空間一條龍服務(wù),提供基于WEB的系統(tǒng)開發(fā). 服務(wù)項(xiàng)目涵蓋了網(wǎng)頁設(shè)計(jì)、網(wǎng)站程序開發(fā)、WEB系統(tǒng)開發(fā)、微信二次開發(fā)、成都手機(jī)網(wǎng)站制作等網(wǎng)站方面業(yè)務(wù)。
文章名稱:云數(shù)據(jù)庫Redis是單線程的,為什么會(huì)產(chǎn)生線程問題
本文來源:http://jinyejixie.com/article36/chesg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、手機(jī)網(wǎng)站建設(shè)、虛擬主機(jī)、外貿(mào)建站、網(wǎng)站策劃、微信小程序
廣告
聲明:本網(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í)需注明來源:
創(chuàng)新互聯(lián)