Redis データ型の学習: String の原則について話しましょう
この記事では、Redis データ型の String を理解し、String データ型の記憶原理について説明します。お役に立てば幸いです。
#Redis は仕事で頻繁に使用されるミドルウェアで、豊富なデータ構造をサポートし、非常に強力な読み取りおよび書き込みパフォーマンスを備え、tps は 100,000 に達します。
今日の記事では、最もよく使用されるデータ構造の 1 つである String 型を分析してまとめます。この記事はredis5.0をベースに解析しています。 [関連する推奨事項: Redis ビデオ チュートリアル ]
1. 基本的な使用法
set key value [EX seconds] [PX milliseconds] [NX|XX]
1. set は構文、key は指定された名前、値は保存される値
2です。EXは有効期限を秒単位で指定し、PXは有効期限をミリ秒単位で指定します
3。NX: 設定は、次の場合にのみ成功します。キーが存在しません
4, XX: キーが存在する場合にのみ設定が成功します
概要: 5.0 は有効期限を指定する set コマンドをサポートし、存在する場合にのみ設定が成功します存在しない、つまり分散ロックの追加が1つのコマンドで実現可能 ロック機能については、以前のバージョンではキーの設定と有効期限の設定を2つのコマンドに分ける必要があり、原子性の確保がより困難でした。
#2. 使用シナリオ
1. ホットスポット データ キャッシュ、分散セッション2. Setnx分散ロック
増分電流制限
4. エンコーディングの違いタイプ
Redis では、データは RedisObject クラス
typedef struct redisObject { //这个类型可以是string,也可以是hash,zset等等 unsigned type:4; unsigned encoding:4; //记录lru,lfu淘汰算法依赖的访问时间和访问频率 unsigned lru:LRU_BITS; /* LRU time (relative to global lru_clock) or * LFU data (least significant 8 bits frequency * and most significant 16 bits access time). */ //引用计数器 int refcount; //指向真实数据结构对象 void *ptr; } robj;
に保存されます。文字列の場合、Redis は単純な動的文字列データ構造をカスタマイズして文字列番号を保存します。
ソース コードの実装: 複数のデータ構造。それぞれが異なる長さの文字列を格納できることを示します。
alloc: 割り当てられたメモリの合計サイズを表します。
flags: ストレージのタイプを表します
buf[]: 実際のデータ
6. 3 つのエンコーディングのストレージの違い
1. embstr の RedisObject と SDS メモリは 1 つの部分にまとめられており、必要なのは次のことだけです。
メモリ の作成時に 1 回割り当てられ、破棄されると はメモリを 1 回解放します
、見つけやすい 2. Raw は RedisObject であり、SDS メモリは同じものではありません作成する必要がある場合、
、破壊された場合は メモリを 2 回解放します
3. embstr の構造は、いつメモリを増やす必要があるかを決定します。長さ、RedisObject および SDS はメモリを再割り当てする必要があります。したがって、
#7. int および embstr エンコーディングが raw に変換される時期
## に変換されます# 2. 長さが 2^63-1 より大きい場合は、embstr3 に変換します。embstr 文字が 44 バイトを超える場合は、生の
8 に変換します。 SDS データ構造の利点1、
バイナリセーフ画像整形、浮動小数点型2、String の 3 つのエンコーディングを保存できる、メモリを最大限に活用メモリ使用率を向上させます
int
- Embstr
- SDS の単純な動的文字列を格納しますembstr 形式。メモリ空間は連続的で読み取り専用で、変更が実行される限り、44 を超える文字列を格納する raw
- 、SDS に変換されます。バイト
- メモリ オーバーフローを心配する必要はありません。sds には自動拡張機能があります。
であり、len 属性は保管されます5.
および遅延スペース解放
#を通じてメモリの複数の割り当てを防止します。
9. c で文字配列を使用しないのはなぜでしょうか?
メモリ オーバーフローが発生する可能性があります
2. 長さを取得するには配列を走査する必要があり、時間の計算量がかかりますO(n)
3. 文字配列の長さが変化するため、
メモリの再割り当てが必要です
4. c の文字配列では、'\0 』は裁きの終わりを表します。
バイナリ データ ストレージは安全ではありません
十、关于内存预分配特性
通过源码分析,扩容策略是字符串在长度小于 SDS_MAX_PREALLOC 之前,扩容空间采用加倍策略,也就是保留 100% 的冗余空间。当长度超过 SDS_MAX_PREALLOC 之后,为了避免加倍后的冗余空间过大而导致浪费,每次扩容只会多分配 SDS_MAX_PREALLOC大小的冗余空间。
十一、关于惰性空间释放
惰性空间释放用于优化 SDS 的字符串缩短操作:当 SDS 的 API 需要缩短 SDS 保存的字符串时, 程序并不立即使用内存重分配来回收缩短后多出来的字节, 而是使用 free 属性将这些字节的数量记录起来,并等待将来使用。
//仅仅设置长度,没有真正清除数据 void sdsclear(sds s) { //单纯设置长度为0 sdssetlen(s, 0); //第一个字符设置为结束符 s[0] = '\0'; }
真正的清除空间
sds sdsRemoveFreeSpace(sds s) { struct sdshdr *sh; sh = (void*) (s-(sizeof(struct sdshdr))); // 进行内存重分配,让 buf 的长度仅仅足够保存字符串内容 sh = zrealloc(sh, sizeof(struct sdshdr)+sh->len+1); // 空余空间为 0 sh->free = 0; return sh->buf; }
以上便是关于string的知识点记录,string的设计很多地方都非常巧妙,比如不同的结构体存储不同长度的字符串,不同编码类型存储不同长度的字符串,
空间预分配,空间惰性释放等,从存储结构,编码类型,内存分配策略和回收策略,作者都从性能方面做了非常多的考量设计,可想而知这也是redis为什么性能极高的原因,工作中也要学习这种追求极致性能的优良风格和设计风格。
更多编程相关知识,请访问:编程入门!!
以上がRedis データ型の学習: String の原則について話しましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック









Redisクラスターモードは、シャードを介してRedisインスタンスを複数のサーバーに展開し、スケーラビリティと可用性を向上させます。構造の手順は次のとおりです。異なるポートで奇妙なRedisインスタンスを作成します。 3つのセンチネルインスタンスを作成し、Redisインスタンスを監視し、フェールオーバーを監視します。 Sentinel構成ファイルを構成し、Redisインスタンス情報とフェールオーバー設定の監視を追加します。 Redisインスタンス構成ファイルを構成し、クラスターモードを有効にし、クラスター情報ファイルパスを指定します。各Redisインスタンスの情報を含むnodes.confファイルを作成します。クラスターを起動し、CREATEコマンドを実行してクラスターを作成し、レプリカの数を指定します。クラスターにログインしてクラスター情報コマンドを実行して、クラスターステータスを確認します。作る

Redisはハッシュテーブルを使用してデータを保存し、文字列、リスト、ハッシュテーブル、コレクション、注文コレクションなどのデータ構造をサポートします。 Redisは、スナップショット(RDB)を介してデータを維持し、書き込み専用(AOF)メカニズムを追加します。 Redisは、マスタースレーブレプリケーションを使用して、データの可用性を向上させます。 Redisは、シングルスレッドイベントループを使用して接続とコマンドを処理して、データの原子性と一貫性を確保します。 Redisは、キーの有効期限を設定し、怠zyな削除メカニズムを使用して有効期限キーを削除します。

Redisのすべてのキーを表示するには、3つの方法があります。キーコマンドを使用して、指定されたパターンに一致するすべてのキーを返します。スキャンコマンドを使用してキーを繰り返し、キーのセットを返します。情報コマンドを使用して、キーの総数を取得します。

Redis-Serverが見つからない問題を解決するための手順:インストールを確認して、Redisが正しくインストールされていることを確認します。環境変数Redis_hostとredis_portを設定します。 Redis Server Redis-Serverを起動します。サーバーがRedis-Cli pingを実行しているかどうかを確認します。

Redis Orderedセット(ZSET)は、並べ替えられた要素を保存し、関連するスコアでソートするために使用されます。 zsetを使用する手順には次のものがあります。1。zsetを作成します。 2。メンバーを追加します。 3.メンバースコアを取得します。 4。ランキングを取得します。 5.ランキング範囲のメンバーを取得します。 6.メンバーを削除します。 7.要素の数を取得します。 8。スコア範囲のメンバーの数を取得します。

Redisバージョン番号を表示するには、次の3つの方法を使用できます。(1)情報コマンドを入力し、(2) - versionオプションでサーバーを起動し、(3)構成ファイルを表示します。

Redisカウンターは、カウンターを保存および操作するためのデータ構造を提供します。特定の手順には、次のものがあります。カウンターの作成:increコマンドを使用して、既存のキーに1を追加します。カウンター値を取得する:getコマンドを使用して現在の値を取得します。インクリメントカウンター:Incrbyコマンドを使用し、その後に増分する量を使用します。 DECREMENTカウンター:DECRまたはDECRBYコマンドを使用して1倍にするか、金額を指定します。カウンターのリセット:SETコマンドを使用して値を0に設定します。さらに、カウンターを使用してレートを制限し、セッショントラッキングを制限し、投票システムを作成できます。

Redisは、キーの一意性を確保するために5つの戦略を使用します。1。名前空間分離。 2。ハッシュデータ構造。 3.データ構造を設定します。 4。文字列キーの特殊文字。 5。LUAスクリプト検証。特定の戦略の選択は、データ組織、パフォーマンス、およびスケーラビリティ要件に依存します。
