1: はじめに
Redis には、文字列、ハッシュ、リスト、セット、zset など、一般的に使用される基本オブジェクトがいくつかあります。以下にそれらを紹介します。基礎となる実装データ構造と一般的なアプリケーションのシナリオと特性。
2: redisobject
ソース コードの場所は、server.h ファイルの 605 行目から始まります
typedef struct redisObject { unsigned type:4; unsigned encoding:4; unsigned lru:LRU_BITS; int refcount; void *ptr; } robj;
2.1 type
実際のオブジェクト タイプredisでは0~4の5種類のステートメントに分かれています。ファイル サーバーの 466 行目にあります。h
#define OBJ_STRING 0 /* String object. */ #define OBJ_LIST 1 /* List object. */ #define OBJ_SET 2 /* Set object. */ #define OBJ_ZSET 3 /* Sorted set object. */ #define OBJ_HASH 4 /* Hash object. */
2.2 エンコーディング
Redis の 5 つのオブジェクト string、list、hash、set、zset で使用される 8 つのエンコーディング形式。各エンコーディングは、データ構造
#define OBJ_ENCODING_RAW 0 #define OBJ_ENCODING_INT 1 #define OBJ_ENCODING_HT 2 #define OBJ_ENCODING_ZIPLIST 5 #define OBJ_ENCODING_INTSET 6 #define OBJ_ENCODING_SKIPLIST 7 #define OBJ_ENCODING_EMBSTR 8 #define OBJ_ENCODING_QUICKLIST 9
2.3 refcount
Redis でのメモリのリサイクルは、比較的単純な参照カウント方式を使用します。各オブジェクト参照には refcount 1 があります。参照カウントが 0 に減少すると、メモリがリサイクルされます。
3: 文字列
3.1 一般的なシナリオ
分散ロック: 分散ロックの実装の基本は、文字列コマンド setnx を使用することです。 ユーザー情報: 多くの場合、ユーザー情報はシリアル化されます。キャッシュのために redis に保存されますが、ここではハッシュを考慮できます。ユーザーデータ情報の一部のみを使用する場合、シリアル化と逆シリアル化にも費用がかかります。
3.2 エンコード形式
int: 文字列がすべて数値の場合、int エンコードが使用されます。これは真のバイナリ データ ストレージです。メモリ アドレスは連続しており、メモリは 1 回だけ適用されます。文字列の長さは 44raw 未満: 最下位層は sds によって実装されます。embstr と比較すると、sds の作成と redisobject の作成が 2 回実装される点が異なります。
3.3 共通コマンド
# 存储 set key value # 互斥存储 # 已存在的key再次存入数据不会更改缓存 setnx key value # 过期存储,单位秒 # 设定key过期时间,到期自动删除 setex key seconds value # 过期存储,单位毫秒 psetex key milliseconds value # 批量存储 mset key value [key value ...] # 取值 get key # 批量取值 mget key [key ...] # 追加 append key value # 长度 strlen key # 自增,只能是int编码的字符串 incr key # 自定义步长自增 incrby key increment # 自减,只能是int编码的字符串 # 这个可以减到负数,秒杀扣减库存啥的想想能不能用这个命令 decr key # 自定义步长自减 decrby key increment
4: list
4.1 一般的なシナリオ
メッセージ キュー: さまざまな MQ や Kafka はすでに非常に成熟しているため、一般的にはあまり使用されません。さらに、redis によって実装されたメッセージ キューは、データのランキング計算の安全性を保証しません。これは定期的な計算と更新にのみ適しており、ランキングのリアルタイム更新には使用できません。たとえば、Meituan は、地域内の販売者のランキングのための「いいね!」のリストを毎日計算します。WeChat の「いいね!」など (方法はわかりません、推測します)
4.2 コーディング形式
クイックリスト: バージョンでリンクリストとジップリストを使用する前のクイックリスト。現在使用されているクイックリストは 2 つの組み合わせです。詳細については、「Redis (1) - Redis のデータ構造の簡単な説明」を参照してください。
4.3 関連パラメーターの構成
構成パラメーターの場所これは、redis.con ファイルの行 1083 と 1099 にあります。
list-max-ziplist-size: 単一のジップリスト サイズを構成します。list-compress- Depth: LZF 圧縮アルゴリズムの開始ノードを構成します。
4.4 一般的なコマンド
# 创建list并压入节点 # 压入节点位于链表头 lpush key value # 压入节点位于链表尾 rpush key value # 弹出list头节点 lpop key # 弹出list尾节点 rpop key # 删除节点 # count > 0 从左开始搜索删除count数量的value # count < 0 从右开始搜索删除|count|数量的value # count = 0 删除list中所有value lrem key count value # 范围保留 # -1 表示列表最后一个元素 # -2 表示倒数第二个,以此类推 ltrim key start stop # 计算长度 llen key # 索引查询节点 # index < 0 从右开始搜索 # index > 0 从左开始搜索 lindex key index # 范围查询 # stop = -1 表示所有 lrange key start stop # 阻塞弹出 # 队列中没有节点时会一直等待 # 多个key时表示挨着顺序依次检查,知道找到非空列表为止 # timeout可以设置等待时间,0表示一直等待 blpop key [key...] timeout brpop key [key...] timeout
五:ハッシュ
5.1 一般的なシナリオ
商品オブジェクトとユーザー オブジェクト。このシナリオは検証によって処理する必要があります。製品オブジェクトとユーザー オブジェクトの情報が毎回完全に必要な場合は、文字列を保存することをお勧めします。ただし、情報の一部のみが使用される場合は、ハッシュ構造の SKU とこのシナリオでは、ハッシュの方が適切です。ハッシュ構造には特定の製品のすべての SKU が保存されます
5.2 エンコード形式
ziplist: ziplist を使用してハッシュ構造を保存する場合、データは 2 つの隣接する ziplistEntry を使用してフィールドと値ハッシュテーブルを保存します。データは保存されます。パラメータ制限を超えると、基礎となる構造は保存用に ziplist から dict に変換されます。
5.3 関連パラメータの設定
hash-max-ziplist-entries: デフォルトは次のとおりです。 512、つまりジップリスト ノードは 1024 です。ノード数が制限を超えると、基になるデータ構造は dicthash-max-ziplist-value: デフォルト 64 に変換されます。制限を超える長さの値がハッシュに挿入されると、基になるデータ構造は dict# に変換されます。
## (学習ビデオ共有:redis ビデオ チュートリアル)
5.4 一般的なコマンド# 存储 hset key field value # 不允许更改存储 # 若field值存在则本次存储不会覆盖原有value值 hsetnx key field value # 批量存储 hmset key field value [field value ...] # 查询 hget key field # 批量查询 hmget key field [field ...] # 全量查询 hgetall key # 全量查询field值 hkeys key # 全量查询value值 hvals key # 删除field hdel key field [field ...] # 计算键值对数量 hlen key # field存在判断 hexists key field # 增量式迭代 # cursor表示迭代开始的游标 # count 表示迭代返回数据数量 # pattern 表示正则匹配结果限制 hscan key cursor [Count count] [Match pattern]
# 存储 sadd member [member ...] # 弹出元素并返回 spop key count # 查询所有元素 smembers key [count] # 计算元素数量 scard key # 删除指定元素 srem key member [member ...] # 判断元素存在 sismember key member # 计算给定集合与后续集合差集 # 返回计算结果 sdiff key [key ...] # 计算给定集合与后续集合差集 # 存储结果到destination并返回 sdiffstore destination key [key ...] # 计算给定集合与后续集合交集 # 返回计算结果 sinter key [key ...] # 计算给定集合与后续集合差集 # 存储结果到destination并返回 sinterstore destination key [key ...] # 计算给定集合与后续集合差集 # 返回计算结果 sunion key [key ...] # 计算给定集合与后续集合差集 # 存储结果到destination并返回 sunionstore destination key [key ...]
7.2 エンコード形式ziplist: ハッシュに類似、どちらもスコアとメンバーを保存するために 2 つの隣接するノードを使用しますskiplist: スキップ リスト構造、Redis (1) -- Redis データ構造の簡単な説明7.3 関連パラメーターの構成zset- max-ziplist-entries: デフォルト値は 128、最大 128 の ziplist ストレージ要素を指定します。超えた場合は、skiplistzset-max-ziplist-value に変換されます: デフォルト値は 64 で、保存されるデータの最大値は 64 バイトです。超えた場合は、skiplist7.4 に変換されます。一般的なコマンド
# 存储 # xx 表示当zset中存在本次插入的member时才存储 # nx 表示当zset中不存在本次插入的member时才存储 zadd key [nx|xx] score member [score member ...] # 查询排序指定[start,stop]范围内元素 # withscores 查询结果顺带返回元素分数 zrange key start stop [withscores] # 查询指定元素分数 zscore key member # 元素数量统计 zcard key # 返回score位于[min,max]区间的元素数量 zcount key min max # 对指定元素分数增加incrment值 zincrby key incrment member # 返回指定分数区间范围内元素 # withscores 返回时携带分数一起返回 # limit offset count表示跳过offset数量结果再返回count数量结果 zrangebyscore key min max [withscores] [limit offset count] # 倒序返回指定分数区间范围内元素 # withscores 返回时携带分数一起返回 # limit offset count表示跳过offset数量结果再返回count数量结果 zrevrangebyscore key max min [withrescores] [limit offset count] # 删除指定分数范围[min,max]内元素 zremrangebyscore key min max # 移除指定元素 zrem key member
redis データベース チュートリアル
以上がRedis のいくつかの一般的な基本オブジェクトの紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。