Home > Database > Mysql Tutorial > How to use mysql to simulate redis

How to use mysql to simulate redis

王林
Release: 2023-06-01 15:13:33
forward
751 people have browsed it

Redis是文本协议

redis是文本协议,协议名称叫做RESPRESPRedis 序列化协议的简写。它是一种直观的文本协议,优势在于实现异常简单,解析性能极好。

如图,Redis 协议将传输的结构数据,可以总结为 5 种最小单元类型。每个单元结束时,统一加上回车换行符号 \r\n

下面是几个规则:

单行字符串 以 + 开头;
多行字符串 以 $ 开头,后跟字符串长度;
整数值 以 : 开头,后跟整数的字符串形式;
错误消息 以 - 符号开头;
数组 以 * 号开头,后跟数组的长度;
Copy after login

比如,下面这个就是数组[9,9,6]的报文。

*3\r\n:9\r\n:9\r\n:6\r\n
Copy after login

所以这个协议的解析和拼装,是非常简单的。拿netty来说,就有codec-redis 模块供我们使用。

实现:数据结构设计

在数据表的设计上,我们发现,kvhash在效率上没有什么差别,因为它能够直接根据key定位到。

反倒是zset,由于有排序的功能,造成了很多操作的执行效率都不尽人意。

另外,由于我们不同的数据结构,是使用不同的表进行存储的。所以删除操作,要在每张表上都执行一遍。

kv设计

kv,即string,是redis里最基本的数据类型。一个key对应一个valuestring类型的值最大能存储512MB。

设计专用的数据库表rstore_kv,其中,rkey是主键。

rkey        varchar
val     varchar
lastTime    bigint
Copy after login

set操作

insert into rstore_kv("rkey","val","lastTime") values($1,$2,$3)
on duplicate key update set "val"=$2,"lastTime"=$3
Copy after login

get操作

select val from rstore_kv where "rkey" = $1
Copy after login

del操作

delete from rstore_kv where "rkey" = $1
Copy after login

exists操作

select count(*) as n from rstore_kv where  "rkey" = $1
Copy after login

ttl操作

select lastTIme from rstore_kv  where  "rkey" = $1
Copy after login

hash设计

hash 是一个键值(key=>value)对集合。hash 特别适合用于存储对象。

设计专用的数据库表rstore_hash,其中,rkeyhkey是联合主键。

rkey        varchar
hkey        varchar
val     varchar
lastTime    bigint
Copy after login

hset操作

insert into rstore_hash("rkey","hkey","val","lastTime") values($1,$2,$3,$4)
on duplicate key update set "val"=$3,"lastTime"=$4
Copy after login

hget操作

select val from rstore_hash where "rkey" = $1 and "hkey" = $2
Copy after login

hgetall操作

select hkey,val from rstore_hash where "rkey" = $1
Copy after login

hdel操作

delete from rstore_hash where "rkey" = $1 and "hkey" = $2
Copy after login

del操作

delete from rstore_hash where "rkey" = $1
Copy after login

hlen,hexists操作

select count(*) as num from rstore_hash where "rkey" = $1
Copy after login

ttl操作

select max(lastTIme) from rstore_hash  where  "rkey" = $1
Copy after login

zset设计

Redis zsetset 一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。它的底层结构是跳跃表,效率特别高,但是会占用大量内存。

设计专用的数据库表rstore_zset,其中,rkeymember是联合主键。

rkey        varchar
member        varchar
score     double
lastTime    bigint
Copy after login

zadd操作

insert into rstore_zset("rkey","member","score","lastTime") values($1,$2,$3,$4) on duplicate key update update set "score"=$3,"lastTime"=$4
Copy after login

zscore操作

select score from rstore_zset where "rkey" = $1 and "member" = $2
Copy after login

zrem操作

delete from rstore_zset where "rkey" = $1 and "member" = $2"
Copy after login

zcard,exists操作

select count(*) as num from rstore_zset where "rkey" = $1
Copy after login

zcount操作

select count(*) as num from rstore_zset where "rkey" = $1 and score>=$2 and score<=$3
Copy after login

zremrangebyscore操作

delete from rstore_zset where "rkey" = $1 and score>=$2 and score<=$3
Copy after login

zrangebyscore操作

select member,score from rstore_zset
where "rkey" = $1 and score>=$2 and score<=$3 order by score asc,member asc
Copy after login

zrange操作

select member,score from rstore_zset
where "rkey" = $1 order by score asc offset $2 limit $3
Copy after login

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;
Copy after login

ttl操作

select max(lastTIme) from rstore_zset  where  "rkey" = $1
Copy after login

del操作

delete from rstore_zset where "rkey" = $1
Copy after login

set设计

RedisSetstring类型的无序集合。

设计专用的数据库表rstore_set,其中,rkeymember是联合主键。

rkey        varchar
member        varchar
lastTime    bigint
Copy after login

sadd操作

insert into rstore_set("rkey","member","lastTime") values($1,$2,$3)
on duplicate key update update set "lastTime"=$3
Copy after login

scard操作

select count(*) as num from rstore_set where "rkey" = $1
Copy after login

sismember操作

select member from rstore_set where "rkey" = $1 and "member" = $2
Copy after login

smembers操作

select member from rstore_set where "rkey" = $1
Copy after login

srem操作

delete from rstore_set where "rkey" = $1 and "member" = $2
Copy after login

del操作

delete from rstore_set where "rkey" = $1
Copy after login

ttl操作

select max(lastTIme) from rstore_set  where  "rkey" = $1
Copy after login

The above is the detailed content of How to use mysql to simulate redis. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:yisu.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template