インターネットの急速な発展に伴い、現代のアプリケーションでは効率的でスケーラブルなデータ ストレージに対する需要が高まっています。オープン ソースのキーと値のデータベースである Redis は、ソフトウェア アーキテクチャにおけるキャッシュ、メッセージ キュー、分散ロックなどのさまざまな目的によく使用されます。その通信プロトコルは Redis ドキュメントで紹介されており、このプロトコルは Redis データ ストレージの実装を開発する機会も与えます。この記事では、golang 言語を使用して Redis 通信プロトコルを実装する方法について説明します。
golang Redis プロトコルの実装を開始するときは、Redis プロトコルの基本形式を理解する必要があります。 Redisの通信プロトコルにはテキスト形式とバイナリ形式がありますが、本記事ではテキスト形式で説明します。プロトコルの要求または応答は、アラビア数字形式のパラメータ長、パラメータの内容、キャリッジ リターンとライン フィード文字の 3 つの部分で構成されます。リクエストまたはレスポンスの例をいくつか示します。
リクエスト: SET mykey myvalue
レスポンス: OK
リクエスト: GET mykey
レスポンス: $7
myvalue
Redis プロトコルを実装するための鍵は、リクエストまたはレスポンス文字列を正しく解析できることです。解析関数を作成することで、このステップを達成できます。ここでは、RedisRequest 構造体を使用して、解析された Redis リクエストを保存します。
type RedisRequest struct {
Command string Args []string
}
関数の実装は次のとおりです。
// ParseRedisMessage redis メッセージを解析func ParseRedisMessage(メッセージ文字列) (*RedisRequest, error) {
var request *RedisRequest parts := strings.Split(strings.TrimSpace(message), "
if len(parts) > 0 && len(parts[0]) > 0 { request = &RedisRequest{ Command: strings.ToUpper(parts[0]), Args: make([]string, 0), } for _, arg := range parts[1:] { if arg != "" { request.Args = append(request.Args, arg) } } } else { return nil, errors.New("Invalid RedisMessage format") } return request, nil
"
リクエスト、エラー := ParseRedisMessage(msg)
if エラー != nil {
fmt.Println(err)
fmt.Println(request.Command, request.Args)
store[key] = value
func GetValue(key string) (interface{}, bool) {
value, ok := store[key] return value, ok
if err != nil {
fmt.Println(err)
switch request.Command {
case "SET":
if len(request.Args) == 2 { SetValue(request.Args[0], request.Args[1]) result = "+OK
} else { result = "-ERR wrong number of arguments for 'SET' command
}
if len(request.Args) == 1 { value, ok := GetValue(request.Args[0]) if ok { result = fmt.Sprintf("$%d
", len(value.(string)), value.( string ))
} else { result = "$-1
} } else { result = "-ERR wrong number of arguments for 'GET' command
}
result = "-ERR unknown command '" + request.Command + "'
}
// 結果をclient here ターミナルは次のことができます。
を返します。 INCR、DEL などの他の Redis コマンドもここで処理できます。
以上がgolang は redis プロトコルを実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。