溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何使用MySQL模擬Redis

發(fā)布時(shí)間:2021-11-11 09:47:27 來(lái)源:億速云 閱讀:193 作者:小新 欄目:數(shù)據(jù)庫(kù)

這篇文章給大家分享的是有關(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)。

如何使用MySQL模擬Redis

其實(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 模塊供我們使用。

如何使用MySQL模擬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ò),可以把它分享出去讓更多的人看到吧!

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI