返回顶部
首页 > 资讯 > 数据库 >如何使用MySQL模拟Redis
  • 375
分享到

如何使用MySQL模拟Redis

2024-04-02 19:04:59 375人浏览 独家记忆
摘要

这篇文章给大家分享的是有关如何使用Mysql模拟Redis的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。redis支持近十种数据类型,最常用的有5种。string、hash、zs

这篇文章给大家分享的是有关如何使用Mysql模拟Redis的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

redis支持近十种数据类型,最常用的有5种。string、hash、zset、set、list等。本文将针对几种常见的数据结构,探讨一下常用操作的模拟实现。

如何使用MySQL模拟Redis

其实,我们所需要开发的,就是一个redis代理proxy。redis的客户端,连接上我们的代理之后,会进行协议解析。解析出来的命令,将会被模拟,然后根据配置的路由,定位到相应的mysql中。

也就是你所使用的redis,其实使用mysql来存储数据的。没有rdb,也没有aof。

Redis是文本协议

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

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

下面是几个规则:

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

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

*3  :9  :9  :6

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

如何使用MySQL模拟Redis

实现:数据结构设计

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

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

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

kv设计

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

设计专用的数据库表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设计

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

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

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设计

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

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

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设计

Redis的Set是string类型的无序集合。

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

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

感谢各位的阅读!关于“如何使用MySQL模拟Redis”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

您可能感兴趣的文档:

--结束END--

本文标题: 如何使用MySQL模拟Redis

本文链接: https://lsjlt.com/news/64879.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何使用MySQL模拟Redis
    这篇文章给大家分享的是有关如何使用MySQL模拟Redis的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。redis支持近十种数据类型,最常用的有5种。string、hash、zs...
    99+
    2024-04-02
  • 怎么使用mysql模拟redis
    这篇文章主要介绍“怎么使用mysql模拟redis”,在日常操作中,相信很多人在怎么使用mysql模拟redis问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用mysql模拟redis”的疑惑有所帮助!...
    99+
    2023-06-27
  • 如何使用MySQL LEFT JOIN 来模拟MySQL MINUS 查询?
    由于我们无法在 MySQL 中使用 MINUS 查询,因此我们将使用 LEFT JOIN 来模拟 MINUS 查询。可以借助以下示例来理解:示例在此示例中,我们有两个表,即 Student_detail 和 Student_info,其内容...
    99+
    2023-10-22
  • redis和mysql如何结合使用
    结合使用 redis 和 mysql 的优势:缓存:提高应用程序性能,减少对 mysql 数据库的查询。会话管理:减轻 mysql 数据库的负担,提高可伸缩性。排行榜和队列:存储和快速访...
    99+
    2024-06-12
    mysql redis
  • Vue中如何使用mock模拟数据
    目录Vue使用mock模拟数据Vue使用mock数据的几种方式方式一:借助mockjs插件实现本地mock数据方式二:在public文件夹放mock数据(无需使用mockjs插件)方...
    99+
    2024-04-02
  • 如何使用JavaSE来模拟斗地主
    本篇内容主要讲解“如何使用JavaSE来模拟斗地主”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何使用JavaSE来模拟斗地主”吧!Java可以用来干什么Java主要应用于:1. web开发;...
    99+
    2023-06-14
  • GNS3使用详解(gns3如何模拟ids
    第一gns3如何模拟juniper,第二gns3如何模拟ids。        juniper 学网络的人应该都知道这个,但是接触这个的人却不多,本人也是菜鸟也没有接触过,惭愧。今天我们来说说gns如何模拟juniper,为以后的学习搭建个...
    99+
    2023-01-31
    详解 ids
  • 如何使用 mongo-go-driver 模拟光标
    你在学习Golang相关的知识吗?本文《如何使用 mongo-go-driver 模拟光标》,主要介绍的内容就涉及到,如果你想提升自己的开发能力,就不要错过这篇文章,大家要知道编程理论基础和实战操作...
    99+
    2024-04-04
  • 如何使用Docker安装Redis和Mysql
    本篇内容介绍了“如何使用Docker安装Redis和Mysql”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!最近准备写如何实现分布式锁的文章...
    99+
    2023-06-19
  • 我们如何模拟 MySQL MINUS 查询?
    由于我们无法在MySQL中使用MINUS查询,因此我们将使用JOIN来模拟MINUS查询。可以通过以下示例来理解 -示例在此示例中,我们有两个表,即 Student_detail 和 Student_info,具有以下数据 -mysql&g...
    99+
    2023-10-22
  • 如何使用VBS模拟POST上传文件
    这篇文章给大家分享的是有关如何使用VBS模拟POST上传文件的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。代码如下:'XML Upload Class Class XMLUpload Private xm...
    99+
    2023-06-08
  • 如何在vbscript中使用Sendkeys模拟键盘
    这篇文章将为大家详细讲解有关如何在vbscript中使用Sendkeys模拟键盘,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。模拟键盘操作,将一个或多个按键指令发送到指定Windows窗口来...
    99+
    2023-06-08
  • 如何使用redis
    这期内容当中小编将会给大家带来有关如何使用redis ,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。安装redis后,在命令行输入“redis-cli"会车输入...
    99+
    2024-04-02
  • 如何在MySQL中模拟打印语句?
    要在MySQL中模拟打印语句,可以使用select语句。语法如下 -SELECT ‘anyStringValue’ as ’ ‘;您可以在 MySQL 命令行客户端检查上述语法。情况 1打印字...
    99+
    2023-10-22
  • 如何使用java模拟简单的tomcat方法
    本篇内容介绍了“如何使用java模拟简单的tomcat方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!我们现在已经会使用tomcat了,但...
    99+
    2023-06-29
  • 如何使用Node.js实现模拟车辆行驶
    随着物联网技术的不断发展,智能交通系统也在不断完善。其中,模拟车辆行驶是一个重要的研究方向。本文将介绍如何使用Node.js实现模拟车辆行驶,并通过可视化界面展示车辆运行状态。一、Node.js介绍Node.js是一种基于Chrome V8...
    99+
    2023-05-14
  • 如何使用PHP进行仿真模拟开发?
    随着科技的发展,仿真模拟技术在各个领域中的应用越来越广泛,对于软件开发而言,仿真模拟也变得越来越重要。PHP作为一门常用的编程语言,在仿真模拟开发中也有着广泛的应用。本文将从以下几个方面介绍如何利用PHP进行仿真模拟开发。一、什么是PHP仿...
    99+
    2023-05-21
    开发 PHP 仿真模拟
  • 如何使用Charles和requests模拟微博登录
    这篇文章主要讲解了“如何使用Charles和requests模拟微博登录”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用Charles和requests模拟微博登录”吧!1. 用Cha...
    99+
    2023-06-02
  • python3-使用requests模拟
    # -*- coding: utf-8 -*- from Crypto.Cipher import AES import base64 import random import codecs import requests from f...
    99+
    2023-01-31
    requests
  • Lumen如何使用Redis
    这篇文章主要介绍了Lumen如何使用Redis,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1. 安装扩展要使用redis必须安装两个扩展&...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作