ホームページ >データベース >Redis >Redis データ型の学習: String の原則について話しましょう

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

青灯夜游
青灯夜游転載
2022-01-29 08:00:382300ブラウズ

この記事では、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 サイトの他の関連記事を参照してください。

声明:
この記事はjuejin.cnで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。