diff --git a/contrib/codecs/dialer.go b/contrib/codecs/dialer.go
index 89cfc2da1280e61b4aafcfcb8058e8446a5fbee6..4d89fe66c2372a37aaff1140d02a590c262fa9dd 100644
--- a/contrib/codecs/dialer.go
+++ b/contrib/codecs/dialer.go
@@ -7,6 +7,7 @@ import (
 
 	"gfx.cafe/open/jrpc/contrib/codecs/http"
 	"gfx.cafe/open/jrpc/contrib/codecs/rdwr"
+	"gfx.cafe/open/jrpc/contrib/codecs/redis"
 	"gfx.cafe/open/jrpc/contrib/codecs/websocket"
 	"gfx.cafe/open/jrpc/pkg/codec"
 )
@@ -21,6 +22,12 @@ func DialContext(ctx context.Context, u string) (codec.Conn, error) {
 		return http.Dial(ctx, nil, u)
 	case "ws", "wss":
 		return websocket.DialWebsocket(ctx, u, "")
+	case "redis":
+		domain := pu.Query().Get("domain")
+		if domain == "" {
+			domain = "jrpc"
+		}
+		return redis.Dial(pu.Host, domain), nil
 	case "tcp":
 		tcpAddr, err := net.ResolveTCPAddr("tcp", u)
 		if err != nil {
diff --git a/contrib/codecs/redis/client.go b/contrib/codecs/redis/client.go
index c73ff35699bfcf8cb1ca69e6327ea202464398c3..af4b12253d61b96f0fa0f3d8f6d3c084c8ef2d1f 100644
--- a/contrib/codecs/redis/client.go
+++ b/contrib/codecs/redis/client.go
@@ -30,6 +30,12 @@ type Client struct {
 	handlerPeer codec.PeerInfo
 }
 
+func Dial(url string, domain string) *Client {
+	return NewClient(redis.NewUniversalClient(&redis.UniversalOptions{
+		Addrs: []string{url},
+	}), domain)
+}
+
 func NewClient(c redis.UniversalClient, domain string) *Client {
 	cl := &Client{
 		c: c,