Redis サーバーにはデフォルトで 16 のデータベースがあり、1 つのデータベースが 1 つの RedisDB データ構造に対応します。
typedef struct redisDb { dict *dict; dict *expires; dict * blocking_keys; dict * ready_keys; dict * watched_keys; ...... }
dict: キー空間ハッシュ テーブル。すべてのキーと値のペアの保存に使用されます。
expires: 有効期限ハッシュ テーブル。保存に使用されます。キーの有効期限 Time
blocking_keys: ブロックされた状態のキーと対応するクライアント
ready_keys: ブロックされていない状態のキーと対応するクライアント、およびblocking_keys属性は相対的です。
watched_keys: 監視キーと対応するクライアント。主にトランザクションに使用されます。
Redis キー値はすべて redisObject オブジェクトです。Redis データベースに新しいキーと値のペアを作成するたびに、キー名の redisObject オブジェクトとキー値の redisObject オブジェクトが生成されます
trpedef struct RedisObject { int4 type; int4 encoding; void *ptr; int24 lru; int32 refcount; }
Field | Description | Description |
---|---|---|
type | は、Redis に対応する型を表すために使用されます。 | 文字列、リスト、ハッシュ、セット、zset、ストリームなどは列挙型で表現されます |
encoding | 内部エンコーディング | int 、embstr、raw、hashtable、quicklist、ziplist、intset、skiplist など。列挙型 |
lru | 24 ビットで表され、オプションの LFU または LRU | LRUの場合は最終アクセス時刻を表し、LFUの場合は上位16ビットでアクセス時刻を分単位で、下位8ビットでアクセス頻度を表します. 頻度の増加は確率アルゴリズムを使用しており、数値が大きいほど増加しにくくなり、アクセス時間が更新されると一定の確率でアクセス頻度が減衰します。 (両方に共通) アクセス時間は数値の剰余であり、現在時刻も剰余です。現在時間がアクセス時間より大きい場合は 2 つの数値の差になります。現在時刻がアクセス時間より小さい場合は、2 つの数値の差になります。アクセス時間は、現在時間にモジュラスとアクセス時間を加えたものです。差分 |
refcount | 参照カウント | 初期値は1です。これは、実際のアプリケーションではあまり重要ではありません。 |
ptr | Pointer は 8 バイトを占め、data | dict のアドレスを指します。有効期限が切れた場合など、ポインタは同じアドレスを指します。 |
object
コマンドは、RedisObject に対する関連操作です。
object idletime key # キーのアイドル時間、つまりキーが最後に読み書きされてからのおおよその時間を返します。 lfu モードでは使用できません
config set maxmemory-policy volatile-lfu # 修改内存淘汰策略 set name zhangsan object freq name # 获取计数值,仅lfu模式下可用,初始化为5 get name object freq name # 再次访问,返回为6
文字列値が整数で、long の最大値以下の場合、エンコードは int 型となり、ptr は直接ポイントしますint 型アドレス
Redis への文字列は SDS (Simple Dynamic String、単純な文字列) と呼ばれ、キー、非整数文字列値
trpedef struct SDS { int8 capacity; // 数组容量 int8 len; // 实际长度 int8 flags; byte[] content; // 数组内容 }
##SDS は Java の ArrayList 構造 に似ていることがわかりますが、初期長を割り当て、長さを超えた場合に拡張します。 Redis では、文字列の長さが 512M を超えてはいけないと規定されています。
長さが特に短い場合は embstr 形式で格納し、長さが 44 バイトを超える場合は raw 形式で格納します。 メモリ アロケータの最大割り当て単位は 64 バイト、RedisObject は 16 バイト、SDS 識別子は 3 バイト、NULL で終わる文字列は 1 バイト必要であることがわかっています。 44 以下の場合、メモリを割り当てる必要があるのは 1 回だけです。 RedisObject と SDS は同じメモリ ユニット内にあり、このデータ構造を embstr と呼びますが、同じメモリ ユニット内にないデータ構造は raw と呼ばれます。 dictdict (エンコーディングはハッシュテーブル型、ディクショナリ) は、hash、set、zset (値とスコアの間のマッピングを保存するために使用) コレクションに対応します。dict は Java の HashMap 構造 に似ています。違いは、HashMap の展開には配列が必要であり、それを走査し、古いデータを再ハッシュして配列の下にハングすることです。 -threaded Redisでは、このような時間のかかる処理に耐えるために、2つの配列を使用し、最初に戻り、空いたときにデータを少しずつ移動し、移動が完了すると古いデータがクリアされます。このプロセスを プログレッシブ リハッシュ と呼びます。 rree
以上がRedis データ構造の原理は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。