インターネットの急速な発展に伴い、現代のアプリケーションでは効率的でスケーラブルなデータ ストレージに対する需要が高まっています。オープン ソースのキーと値のデータベースである 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}上記コードは Redis メッセージ文字列がコンポーネント部分に分解され、返されるために RedisRequest 構造に格納されます。実際の使用では、次のコードを使用してこの関数を呼び出すことができます: msg := "SET mykey myvalue
"
リクエスト、エラー := 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}上記のコードでは、Golang のマップ タイプを使用して Redis データを保存します。キーと値のペアをストア マップに追加します。GetValue 関数は、指定されたキーの値を取得します。これで、次のコードを使用して Redis リクエストを処理できるようになります: request, err := ParseRedisMessage( msg )
if err != nil {
fmt.Println(err)}result := ""
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"
}case "GET":
if len(request.Args) == 1 { value, ok := GetValue(request.Args[0]) if ok { result = fmt.Sprintf("$%d%s
", len(value.(string)), value.( string ))
} else { result = "$-1"
} } else { result = "-ERR wrong number of arguments for 'GET' command"
}default:
result = "-ERR unknown command '" + request.Command + "'"
}
// 結果をclient here ターミナルは次のことができます。
を返します。 INCR、DEL などの他の Redis コマンドもここで処理できます。
以上がgolang は redis プロトコルを実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。