目次
Redis是文本协议
实现:数据结构设计
kv设计
hash设计
zset设计
set设计
ホームページ データベース mysql チュートリアル mysql を使用して Redis をシミュレートする方法

mysql を使用して Redis をシミュレートする方法

Jun 01, 2023 pm 03:13 PM
mysql redis

Redis是文本协议

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

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

下面是几个规则:

单行字符串 以 + 开头;
多行字符串 以 $ 开头,后跟字符串长度;
整数值 以 : 开头,后跟整数的字符串形式;
错误消息 以 - 符号开头;
数组 以 * 号开头,后跟数组的长度;
ログイン後にコピー

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

*3\r\n:9\r\n:9\r\n:6\r\n
ログイン後にコピー

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

实现:数据结构设计

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

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

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

kv设计

kv,即string,是redis里最基本的数据类型。一个key对应一个valuestring类型的值最大能存储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,其中,rkeyhkey是联合主键。

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

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

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

RedisSetstring类型的无序集合。

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

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 をシミュレートする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

MySQL:世界で最も人気のあるデータベースの紹介 MySQL:世界で最も人気のあるデータベースの紹介 Apr 12, 2025 am 12:18 AM

MySQLはオープンソースのリレーショナルデータベース管理システムであり、主にデータを迅速かつ確実に保存および取得するために使用されます。その実用的な原則には、クライアントリクエスト、クエリ解像度、クエリの実行、返品結果が含まれます。使用法の例には、テーブルの作成、データの挿入とクエリ、および参加操作などの高度な機能が含まれます。一般的なエラーには、SQL構文、データ型、およびアクセス許可、および最適化の提案には、インデックスの使用、最適化されたクエリ、およびテーブルの分割が含まれます。

なぜMySQLを使用するのですか?利点と利点 なぜMySQLを使用するのですか?利点と利点 Apr 12, 2025 am 12:17 AM

MySQLは、そのパフォーマンス、信頼性、使いやすさ、コミュニティサポートに選択されています。 1.MYSQLは、複数のデータ型と高度なクエリ操作をサポートし、効率的なデータストレージおよび検索機能を提供します。 2.クライアントサーバーアーキテクチャと複数のストレージエンジンを採用して、トランザクションとクエリの最適化をサポートします。 3.使いやすく、さまざまなオペレーティングシステムとプログラミング言語をサポートしています。 4.強力なコミュニティサポートを提供し、豊富なリソースとソリューションを提供します。

MySQLの場所:データベースとプログラミング MySQLの場所:データベースとプログラミング Apr 13, 2025 am 12:18 AM

データベースとプログラミングにおけるMySQLの位置は非常に重要です。これは、さまざまなアプリケーションシナリオで広く使用されているオープンソースのリレーショナルデータベース管理システムです。 1)MySQLは、効率的なデータストレージ、組織、および検索機能を提供し、Web、モバイル、およびエンタープライズレベルのシステムをサポートします。 2)クライアントサーバーアーキテクチャを使用し、複数のストレージエンジンとインデックスの最適化をサポートします。 3)基本的な使用には、テーブルの作成とデータの挿入が含まれ、高度な使用法にはマルチテーブル結合と複雑なクエリが含まれます。 4)SQL構文エラーやパフォーマンスの問題などのよくある質問は、説明コマンドとスロークエリログを介してデバッグできます。 5)パフォーマンス最適化方法には、インデックスの合理的な使用、最適化されたクエリ、およびキャッシュの使用が含まれます。ベストプラクティスには、トランザクションと準備された星の使用が含まれます

MySQLの解決策は、「ユーザーのために拒否されたアクセス」という問題に遭遇します MySQLの解決策は、「ユーザーのために拒否されたアクセス」という問題に遭遇します Apr 11, 2025 pm 05:36 PM

MySQLの「ユーザーのアクセス拒否」を解決する方法エラー:1。ユーザーの許可を確認して、データベースに接続します。 2。パスワードをリセットします。 3.リモート接続を許可します。 4。更新権限。 5.データベースサーバーの構成(Bind-Address、Skip-Grant-Tables)を確認します。 6.ファイアウォールルールを確認します。 7.MySQLサービスを再起動します。ヒント:データベースをバックアップした後に変更を加えます。

Apacheのデータベースに接続する方法 Apacheのデータベースに接続する方法 Apr 13, 2025 pm 01:03 PM

Apacheはデータベースに接続するには、次の手順が必要です。データベースドライバーをインストールします。 web.xmlファイルを構成して、接続プールを作成します。 JDBCデータソースを作成し、接続設定を指定します。 JDBC APIを使用して、接続の取得、ステートメントの作成、バインディングパラメーター、クエリまたは更新の実行、結果の処理など、Javaコードのデータベースにアクセスします。

MySQLデータのNAVICATの自動バックアップ MySQLデータのNAVICATの自動バックアップ Apr 11, 2025 pm 05:30 PM

NAVICATを使用してMySQLデータを自動的にバックアップする手順:MySQL Serverにインストールして接続します。バックアップタスクを作成し、バックアップソース、ファイルの場所、名前を指定します。バックアップタイプ、周波数、保持時間などのバックアップオプションを構成します。自動バックアップ計画を設定し、自動バックアップを有効にし、時間と頻度を設定します。バックアップ設定をプレビューし、バックアップを実行します。バックアップの進行と履歴を監視します。

Debianの下でのPostgreSQLパフォーマンスの最適化 Debianの下でのPostgreSQLパフォーマンスの最適化 Apr 12, 2025 pm 08:18 PM

Debian SystemsのPostgreSQLデータベースのパフォーマンスを改善するには、ハードウェア、構成、インデックス、クエリ、その他の側面を包括的に検討する必要があります。次の戦略は、データベースのパフォーマンスを効果的に最適化できます。1。ハードウェアリソース最適化メモリ拡張:適切なメモリは、データとインデックスをキャッシュするために重要です。高速ストレージ:SSD SSDドライブを使用すると、I/Oパフォーマンスが大幅に向上する可能性があります。マルチコアプロセッサ:マルチコアプロセッサを最大限に活用して、並列クエリ処理を実装します。 2。データベースパラメーターチューニングShared_Buffers:システムメモリサイズの設定によると、システムメモリの25%〜40%に設定することをお勧めします。 work_mem:ソートとハッシュ操作のメモリを制御します。通常は64MBから256mに設定されています

Debian Readdirのパフォーマンスを最適化する方法 Debian Readdirのパフォーマンスを最適化する方法 Apr 13, 2025 am 08:48 AM

Debian Systemsでは、Directoryコンテンツを読み取るためにReadDirシステム呼び出しが使用されます。パフォーマンスが良くない場合は、次の最適化戦略を試してください。ディレクトリファイルの数を簡素化します。大きなディレクトリをできる限り複数の小さなディレクトリに分割し、Readdirコールごとに処理されたアイテムの数を減らします。ディレクトリコンテンツのキャッシュを有効にする:キャッシュメカニズムを構築し、定期的にキャッシュを更新するか、ディレクトリコンテンツが変更されたときに、頻繁な呼び出しをreaddirに削減します。メモリキャッシュ(memcachedやredisなど)またはローカルキャッシュ(ファイルやデータベースなど)を考慮することができます。効率的なデータ構造を採用する:ディレクトリトラバーサルを自分で実装する場合、より効率的なデータ構造(線形検索の代わりにハッシュテーブルなど)を選択してディレクトリ情報を保存およびアクセスする

See all articles