您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關(guān)如何使用MySQL模擬Redis的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。
redis支持近十種數(shù)據(jù)類型,最常用的有5種。string、hash、zset、set、list等。本文將針對(duì)幾種常見的數(shù)據(jù)結(jié)構(gòu),探討一下常用操作的模擬實(shí)現(xiàn)。
其實(shí),我們所需要開發(fā)的,就是一個(gè)redis代理proxy。redis的客戶端,連接上我們的代理之后,會(huì)進(jìn)行協(xié)議解析。解析出來(lái)的命令,將會(huì)被模擬,然后根據(jù)配置的路由,定位到相應(yīng)的mysql中。
也就是你所使用的redis,其實(shí)使用mysql來(lái)存儲(chǔ)數(shù)據(jù)的。沒(méi)有rdb,也沒(méi)有aof。
Redis是文本協(xié)議
redis是文本協(xié)議,協(xié)議名稱叫做RESP。RESP 是 Redis 序列化協(xié)議的簡(jiǎn)寫。它是一種直觀的文本協(xié)議,優(yōu)勢(shì)在于實(shí)現(xiàn)異常簡(jiǎn)單,解析性能極好。
如圖,Redis 協(xié)議將傳輸?shù)慕Y(jié)構(gòu)數(shù)據(jù),可以總結(jié)為 5 種最小單元類型。每個(gè)單元結(jié)束時(shí),統(tǒng)一加上回車換行符號(hào) 。
下面是幾個(gè)規(guī)則:
單行字符串 以 + 開頭; 多行字符串 以 $ 開頭,后跟字符串長(zhǎng)度; 整數(shù)值 以 : 開頭,后跟整數(shù)的字符串形式; 錯(cuò)誤消息 以 - 符號(hào)開頭; 數(shù)組 以 * 號(hào)開頭,后跟數(shù)組的長(zhǎng)度;
比如,下面這個(gè)就是數(shù)組[9,9,6]的報(bào)文。
*3 :9 :9 :6
所以這個(gè)協(xié)議的解析和拼裝,是非常簡(jiǎn)單的。拿netty來(lái)說(shuō),就有codec-redis 模塊供我們使用。
實(shí)現(xiàn):數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)
在數(shù)據(jù)表的設(shè)計(jì)上,我們發(fā)現(xiàn),kv和hash在效率上沒(méi)有什么差別,因?yàn)樗軌蛑苯痈鶕?jù)key定位到。
反倒是zset,由于有排序的功能,造成了很多操作的執(zhí)行效率都不盡人意。
另外,由于我們不同的數(shù)據(jù)結(jié)構(gòu),是使用不同的表進(jìn)行存儲(chǔ)的。所以刪除操作,要在每張表上都執(zhí)行一遍。
kv設(shè)計(jì)
kv,即string,是redis里最基本的數(shù)據(jù)類型。一個(gè)key對(duì)應(yīng)一個(gè)value,string類型的值最大能存儲(chǔ)512MB。
設(shè)計(jì)專用的數(shù)據(jù)庫(kù)表rstore_kv,其中,rkey是主鍵。
rkey varchar val varchar lastTime bigint
set操作
insert into rstore_kv("rkey","val","lastTime") values($1,$2,$3) on duplicate key update set "val"=$2,"lastTime"=$3
get操作
select val from rstore_kv where "rkey" = $1
del操作
delete from rstore_kv where "rkey" = $1
exists操作
select count(*) as n from rstore_kv where "rkey" = $1
ttl操作
select lastTIme from rstore_kv where "rkey" = $1
hash設(shè)計(jì)
hash 是一個(gè)鍵值(key=>value)對(duì)集合。hash 特別適合用于存儲(chǔ)對(duì)象。
設(shè)計(jì)專用的數(shù)據(jù)庫(kù)表rstore_hash,其中,rkey和hkey是聯(lián)合主鍵。
rkey varchar hkey varchar val varchar lastTime bigint
hset操作
insert into rstore_hash("rkey","hkey","val","lastTime") values($1,$2,$3,$4) on duplicate key update set "val"=$3,"lastTime"=$4
hget操作
select val from rstore_hash where "rkey" = $1 and "hkey" = $2
hgetall操作
select hkey,val from rstore_hash where "rkey" = $1
hdel操作
delete from rstore_hash where "rkey" = $1 and "hkey" = $2
del操作
delete from rstore_hash where "rkey" = $1
hlen,hexists操作
select count(*) as num from rstore_hash where "rkey" = $1
ttl操作
select max(lastTIme) from rstore_hash where "rkey" = $1
zset設(shè)計(jì)
Redis zset 和 set 一樣也是string類型元素的集合,且不允許重復(fù)的成員。不同的是每個(gè)元素都會(huì)關(guān)聯(lián)一個(gè)double類型的分?jǐn)?shù)。redis正是通過(guò)分?jǐn)?shù)來(lái)為集合中的成員進(jìn)行從小到大的排序。它的底層結(jié)構(gòu)是跳躍表,效率特別高,但是會(huì)占用大量?jī)?nèi)存。
設(shè)計(jì)專用的數(shù)據(jù)庫(kù)表rstore_zset,其中,rkey和member是聯(lián)合主鍵。
rkey varchar member varchar score double lastTime bigint
zadd操作
insert into rstore_zset("rkey","member","score","lastTime") values($1,$2,$3,$4) on duplicate key update update set "score"=$3,"lastTime"=$4
zscore操作
select score from rstore_zset where "rkey" = $1 and "member" = $2
zrem操作
delete from rstore_zset where "rkey" = $1 and "member" = $2"
zcard,exists操作
select count(*) as num from rstore_zset where "rkey" = $1
zcount操作
select count(*) as num from rstore_zset where "rkey" = $1 and score>=$2 and score<=$3
zremrangebyscore操作
delete from rstore_zset where "rkey" = $1 and score>=$2 and score<=$3
zrangebyscore操作
select member,score from rstore_zset where "rkey" = $1 and score>=$2 and score<=$3 order by score asc,member asc
zrange操作
select member,score from rstore_zset where "rkey" = $1 order by score asc offset $2 limit $3
zrank操作
select rank from (select member,rank() over (order by "score" asc, "lastTime" asc) as rank from rstore_zset where "rkey" = $1 ) m where m."member"= $2;
ttl操作
select max(lastTIme) from rstore_zset where "rkey" = $1
del操作
delete from rstore_zset where "rkey" = $1
set設(shè)計(jì)
Redis的Set是string類型的無(wú)序集合。
設(shè)計(jì)專用的數(shù)據(jù)庫(kù)表rstore_set,其中,rkey和member是聯(lián)合主鍵。
rkey varchar member varchar lastTime bigint
sadd操作
insert into rstore_set("rkey","member","lastTime") values($1,$2,$3) on duplicate key update update set "lastTime"=$3
scard操作
select count(*) as num from rstore_set where "rkey" = $1
sismember操作
select member from rstore_set where "rkey" = $1 and "member" = $2
smembers操作
select member from rstore_set where "rkey" = $1
srem操作
delete from rstore_set where "rkey" = $1 and "member" = $2
del操作
delete from rstore_set where "rkey" = $1
ttl操作
select max(lastTIme) from rstore_set where "rkey" = $1
感謝各位的閱讀!關(guān)于“如何使用MySQL模擬Redis”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。