目次
1. 基本的な使用法
#2. 使用シナリオ
4. エンコーディングの違いタイプ
Redis では、データは RedisObject クラス
1. embstr の RedisObject と SDS メモリは 1 つの部分にまとめられており、必要なのは次のことだけです。
## に変換されます# 2. 長さが 2^63-1 より大きい場合は、embstr3 に変換します。embstr 文字が 44 バイトを超える場合は、生の
画像整形、浮動小数点型2、String の 3 つのエンコーディングを保存できる、メモリを最大限に活用メモリ使用率を向上させます
2. 長さを取得するには配列を走査する必要があり、時間の計算量がかかりますO(n)
十、关于内存预分配特性
十一、关于惰性空间释放
ホームページ データベース Redis Redis データ型の学習: String の原則について話しましょう

Redis データ型の学習: String の原則について話しましょう

Jan 29, 2022 am 08:00 AM
redis string 保管原理 データの種類

この記事では、Redis データ型の String を理解し、String データ型の記憶原理について説明します。お役に立てば幸いです。

Redis データ型の学習: 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

分散ロック

3、増分カウンター

4、増分グローバルid

5、

増分電流制限

6、ビット操作、ビットマップ関数、オンラインユーザー統計 0/1 マーク

3. サポートされる格納データ型

整数型、文字型、float (単一浮動小数点型)

4. エンコーディングの違いタイプ

Redis データ型の学習: String の原則について話しましょう

Redis データ型の学習: String の原則について話しましょう

## 5. 文字列ストレージの原則

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 は単純な動的文字列データ構造をカスタマイズして文字列番号を保存します。

ソース コードの実装: 複数のデータ構造。それぞれが異なる長さの文字列を格納できることを示します。

Redis データ型の学習: String の原則について話しましょう

len: 使用される長さを表します。

alloc: 割り当てられたメモリの合計サイズを表します。

flags: ストレージのタイプを表します

buf[]: 実際のデータ

6. 3 つのエンコーディングのストレージの違い

1. embstr の RedisObject と SDS メモリは 1 つの部分にまとめられており、必要なのは次のことだけです。

メモリ

の作成時に 1 回割り当てられ、破棄されると はメモリを 1 回解放します 、見つけやすい 2. Raw は RedisObject であり、SDS メモリは同じものではありません作成する必要がある場合、

メモリを 2 回割り当てます

、破壊された場合は メモリを 2 回解放します3. embstr の構造は、いつメモリを増やす必要があるかを決定します。長さ、RedisObject および SDS はメモリを再割り当てする必要があります。したがって、

embstr によってエンコードされたデータは変更できず、読み取り専用です。

#7. int および embstr エンコーディングが raw に変換される時期

#1. int 型データは int 型ではなくなり、raw

## に変換されます# 2. 長さが 2^63-1 より大きい場合は、embstr3 に変換します。embstr 文字が 44 バイトを超える場合は、生の

8 に変換します。 SDS データ構造の利点

1、

バイナリセーフ

画像整形、浮動小数点型2、String の 3 つのエンコーディングを保存できる、メモリを最大限に活用メモリ使用率を向上させます

int

8 バイト長の整数、2^63-1

    Embstr
  • SDS の単純な動的文字列を格納しますembstr 形式。メモリ空間は連続的で読み取り専用で、変更が実行される限り、44 を超える文字列を格納する raw
  • Raw
  • 、SDS に変換されます。バイト
  • 3.
  • メモリ オーバーフローを心配する必要はありません。sds には自動拡張機能があります。
  • 4,
文字列長を取得するための時間の複雑さは O(1)

であり、len 属性は保管されます5.

スペース事前割り当て

および遅延スペース解放#を通じてメモリの複数の割り当てを防止します。

##6. len 属性 ('\0' を含むことができる) の操作文字列の使用を終了するかどうかを決定します。

9. c で文字配列を使用しないのはなぜでしょうか?

1. メモリは事前に割り当てる必要があるため、

メモリ オーバーフローが発生する可能性があります

2. 長さを取得するには配列を走査する必要があり、時間の計算量がかかりますO(n)

3. 文字配列の長さが変化するため、メモリの再割り当てが必要です

4. c の文字配列では、'\0 』は裁きの終わりを表します。 バイナリ データ ストレージは安全ではありません

、写真やビデオなどは保存できません。

十、关于内存预分配特性

Redis データ型の学習: String の原則について話しましょう

通过源码分析,扩容策略是字符串在长度小于 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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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)

Redisクラスターモードの構築方法 Redisクラスターモードの構築方法 Apr 10, 2025 pm 10:15 PM

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

基礎となるRedisを実装する方法 基礎となるRedisを実装する方法 Apr 10, 2025 pm 07:21 PM

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

Redisのすべてのキーを表示する方法 Redisのすべてのキーを表示する方法 Apr 10, 2025 pm 07:15 PM

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

Redis-Serverが見つからない場合はどうすればよいですか Redis-Serverが見つからない場合はどうすればよいですか Apr 10, 2025 pm 06:54 PM

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

Redis Zsetの使用方法 Redis Zsetの使用方法 Apr 10, 2025 pm 07:27 PM

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

Redisのバージョン番号を表示する方法 Redisのバージョン番号を表示する方法 Apr 10, 2025 pm 05:57 PM

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

Redisカウンターの使用方法 Redisカウンターの使用方法 Apr 10, 2025 pm 07:00 PM

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

鍵はRedisクエリにとってどのようにユニークですか 鍵はRedisクエリにとってどのようにユニークですか Apr 10, 2025 pm 07:03 PM

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

See all articles