目次
1.リスト
Redis は redisDB の kV 構造体であり、ディクショナリ dict に保存されます. dict には、配列の形式で存在する 2 つの hashTable 構造体が含まれています. リストは順序付けられたデータ構造であり、ダブルエンド リンク リストのクイックリストとジップリストです基になる実装として使用されます。
[root@localhost ~]# cd /usr/local/redis-6.2.7
[root@localhost redis-6.2.7]# src/redis-server redis.conf
[root@localhost redis-6.2.7]# src/redis-cli
127.0.0.1:6379> lpush a-list a b c
(integer) 3
127.0.0.1:6379> rpush a-list e f g
(integer) 6
127.0.0.1:6379> rpush a-list e 1100 f g
(integer) 10
127.0.0.1:6379> type a-list
list
127.0.0.1:6379> object encoding a-list
"quicklist"
リストのデータ構造は次のとおりです。
2.ハッシュ
ハッシュは、フィールドが比較的小さい場合は ziplist に格納され、フィールドが比較的大きい場合はハッシュ テーブルに格納されます. 次の図は、オブジェクト エンコーディング キー コードが ziplist からハッシュ テーブルに変更されるシーンを示しています。
127.0.0.1:6379> hset a-hash name caiji age 35 f1 v1 f2 v2 f3 v3
(integer) 5
127.0.0.1:6379> hgetall a-hash
1) "name"
2) "caiji"
3) "age"
4) "35"
5) "f1"
6) "v1"
7) "f2"
8) "v2"
9) "f3"
10) "v3"
127.0.0.1:6379> type a-hash
hash
127.0.0.1:6379> object encoding a-hash
"ziplist"
127.0.0.1:6379> hset a-hash f4 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
(integer) 1
127.0.0.1:6379> hgetall a-hash
1) "f1"
2) "v1"
3) "name"
4) "caiji"
5) "f2"
6) "v2"
7) "age"
8) "35"
9) "f3"
10) "v3"
11) "f4"
12) "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
127.0.0.1:6379> type a-hash
hash
127.0.0.1:6379> object encoding a-hash
"hashtable"
hash のデータ構造は以下の通りで、redis.conf 設定ファイルを設定することで ziplist と hashtable の保存範囲を設定することができます
インタビューの質問: 文字列とハッシュの選択と長所と短所
3.セット
Set は順序付けされていない自動的に重複排除されるデータ型です. 整数に格納されると順序付けられます. 最下層は intset データ構造を使用します. 文字列に格納されると順序付けられず, ハッシュテーブルに格納されます.
127.0.0.1:6379> sadd a-set 1 2 3 5 10 9 4 4 4
(integer) 7
127.0.0.1:6379> smembers a-set
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "9"
7) "10"
127.0.0.1:6379> type a-set
set
127.0.0.1:6379> object encoding a-set
"intset"
127.0.0.1:6379> sadd a-set a
(integer) 1
127.0.0.1:6379> smembers a-set
1) "a"
2) "3"
3) "10"
4) "9"
5) "4"
6) "2"
7) "5"
8) "1"
127.0.0.1:6379> type a-set
set
127.0.0.1:6379> object encoding a-set
"hashtable"
intset のデータ構造は次のとおりで、3 つの要素があります。
4. 設定する
スキップリストの原理はバイナリ検索を使用し、インデックス方式はインデックス ツリーを形成してデータを検索し、K 番目の層のインデックス番号 = n/2^k です。
127.0.0.1:6379> zadd a-zset 100 a 200 b 150 c
(integer) 3
127.0.0.1:6379> zrange a-zset 0 -1 withscores
1) "a"
2) "100"
3) "c"
4) "150"
5) "b"
6) "200"
127.0.0.1:6379> type a-zset
zset
127.0.0.1:6379> object encoding a-zset
"ziplist"
5.ジオハッシュ
GeoHash はアルゴリズムと zset の実装です
助けて @geo
127.0.0.1:6379> help @geo
127.0.0.1:6379> geoadd locations 116.3209103486328 39.92916527606944 guozhuang
(integer) 1
127.0.0.1:6379> geoadd locations 116.391621 39.946583 beijignzhan 116.401969 39.959857 ditangongyuan
(integer) 2
127.0.0.1:6379> geodist locations guozhuang beijignzhan km
"6.3337"
127.0.0.1:6379> geodist locations ditangongyuan beijignzhan km
"1.7200"
127.0.0.1:6379> georadiusbymember locations guozhuang 8 km
1) "guozhuang"
2) "beijignzhan"
3) "ditangongyuan"
127.0.0.1:6379> georadiusbymember locations guozhuang 7 km
1) "guozhuang"
2) "beijignzhan"
127.0.0.1:6379> keys *
1) "locations"
127.0.0.1:6379> type locations
zset
127.0.0.1:6379> object encoding locations
"ziplist"
geohash の基本的な実装である経度と緯度のエンコード規則は次のとおりです。gethash は、特定の緯度と経度ではなく、あいまいな範囲のみを送信でき、精度がそれほど高くないシナリオに適しています
6. 面接に関するよくある質問
1. redis のマルチスレッド モデル、redis.conf でスレッド I/O を検索して詳細なメモを確認する
Redis 実行プロセス: read-parse resp protocol-execute command-write
マルチスレッドはデフォルトでオフになっています。以下に示すように、redis.conf で io-thread パラメータを設定できます。
io-threads-do-reads パラメータを設定すると、他の I/O スレッドも読み取りおよび書き込みタスクを実行できます
6.1 クライアント側キャッシュ
ローカル クライアントがサーバーに要求した後、データの一部をローカルにキャッシュし、次にデータが変更されたときにクライアント キャッシュを同期的に無効にして最新のデータを返します。Redis6.0 はスタンドアロン キャッシュのみをサポートし、クラスターはキャッシュできません。
6.2 ACL パーミッション
デフォルトでは、顧客は来店時にタスクを実行でき、flushdb はすべてのデータを消去します。
redis.conf ファイルに requirepass foobared を requirepass キーワードとして設定すると、auth キーワードでログインできます。
許可ユーザーの設定
危険なユーザーを表示する
構成ファイルに永続化
また、redis.conf ファイルで aclfile ファイル パスを設定し、ユーザー aclice などのパラメーターを削除することで、別の構成ファイルに ACL 権限を構成することもできます。