Golang高性能Redis 6客户端库Rueidis解析:支持服务端辅助的客户端缓存

Golang高性能Redis 6客户端库Rueidis解析:支持服务端辅助的客户端缓存 https://github.com/rueian/rueidis

这个新的客户端库支持大多数 Redis 功能,例如集群、流、发布/订阅、RedisJSON、RediSearch。

与其他 Redis 客户端库相比,它能够实现非常高的吞吐量。这得益于自动流水线和客户端缓存技术。

图片

上图显示,即使没有客户端缓存,rueidis 也能实现比 go-redis 高出 14 倍的吞吐量。请参见 parallelism(64)-key(16)-value(64)-10 这个测试用例。


更多关于Golang高性能Redis 6客户端库Rueidis解析:支持服务端辅助的客户端缓存的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang高性能Redis 6客户端库Rueidis解析:支持服务端辅助的客户端缓存的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Rueidis确实是一个性能出色的Redis 6+ Go客户端库,其高性能主要源于以下几个关键技术实现:

1. 自动流水线(Auto-Pipelining)

Rueidis通过自动合并多个命令到单个网络请求中,显著减少了网络往返开销:

package main

import (
    "context"
    "github.com/rueian/rueidis"
)

func main() {
    client, err := rueidis.NewClient(rueidis.ClientOption{
        InitAddress: []string{"127.0.0.1:6379"},
    })
    if err != nil {
        panic(err)
    }
    defer client.Close()

    ctx := context.Background()
    
    // 自动流水线示例
    for i := 0; i < 1000; i++ {
        key := rueidis.Key("key:" + string(rune(i)))
        // 这些命令会被自动合并到流水线中
        client.Do(ctx, client.B().Set().Key(key).Value("value").Build())
    }
}

2. 服务端辅助的客户端缓存(Server-assisted Client-side Caching)

这是Redis 6的重要特性,Rueidis完整实现了该协议:

package main

import (
    "context"
    "fmt"
    "time"
    "github.com/rueian/rueidis"
)

func main() {
    client, err := rueidis.NewClient(rueidis.ClientOption{
        InitAddress: []string{"127.0.0.1:6379"},
        ClientTrackingOptions: []string{"OPTIN"}, // 启用客户端缓存
    })
    if err != nil {
        panic(err)
    }
    defer client.Close()

    ctx := context.Background()
    
    // 首先需要启用tracking
    client.Do(ctx, client.B().ClientTracking().On().Build())
    
    // 缓存键
    cacheKey := rueidis.Key("user:1000:profile")
    
    // 获取数据并缓存
    val, err := client.DoCache(ctx, 
        client.B().Get().Key(cacheKey).Cache(), // 注意.Cache()方法
        10*time.Second, // TTL
    ).ToString()
    
    if err != nil {
        fmt.Println("Error:", err)
    } else {
        fmt.Println("Cached value:", val)
    }
    
    // 当服务端数据变更时,客户端会自动收到失效通知
}

3. 连接池和并发优化

Rueidis使用更高效的连接管理策略:

package main

import (
    "context"
    "github.com/rueian/rueidis"
    "sync"
)

func benchmarkRueidis() {
    client, _ := rueidis.NewClient(rueidis.ClientOption{
        InitAddress: []string{"127.0.0.1:6379"},
        PoolSize:    100, // 连接池大小
    })
    defer client.Close()

    ctx := context.Background()
    var wg sync.WaitGroup
    
    // 高并发测试
    for i := 0; i < 1000; i++ {
        wg.Add(1)
        go func(id int) {
            defer wg.Done()
            key := rueidis.Key(fmt.Sprintf("key:%d", id))
            // 并发安全操作
            client.Do(ctx, client.B().Set().Key(key).Value("value").Build())
            client.Do(ctx, client.B().Get().Key(key).Build())
        }(i)
    }
    wg.Wait()
}

4. Redis模块支持

完整支持RedisJSON、RediSearch等模块:

package main

import (
    "context"
    "fmt"
    "github.com/rueian/rueidis"
)

func redisJSONExample() {
    client, _ := rueidis.NewClient(rueidis.ClientOption{
        InitAddress: []string{"127.0.0.1:6379"},
    })
    defer client.Close()

    ctx := context.Background()
    
    // RedisJSON操作
    jsonKey := rueidis.Key("user:1")
    
    // 设置JSON文档
    client.Do(ctx, client.B().JsonSet().Key(jsonKey).Path("$").Value(`{"name":"John","age":30}`).Build())
    
    // 获取JSON字段
    name, _ := client.Do(ctx, 
        client.B().JsonGet().Key(jsonKey).Path("$.name").Build(),
    ).ToString()
    
    fmt.Println("Name:", name)
}

func rediSearchExample() {
    client, _ := rueidis.NewClient(rueidis.ClientOption{
        InitAddress: []string{"127.0.0.1:6379"},
    })
    defer client.Close()

    ctx := context.Background()
    
    // 创建RediSearch索引
    client.Do(ctx, client.B().FtCreate().Index("idx:users").OnJson().Prefix(1, "user:").Schema().
        FieldName("$.name").As("name").Text().Build())
    
    // 搜索
    result, _ := client.Do(ctx, 
        client.B().FtSearch().Index("idx:users").Query("John").Build(),
    ).ToArray()
    
    fmt.Println("Search results:", result)
}

5. 集群支持

自动处理集群重定向和分片:

package main

import (
    "context"
    "github.com/rueian/rueidis"
)

func clusterExample() {
    // 集群配置
    client, _ := rueidis.NewClient(rueidis.ClientOption{
        InitAddress: []string{
            "127.0.0.1:7000",
            "127.0.0.1:7001",
            "127.0.0.1:7002",
        },
        ShuffleInit: true, // 随机初始化节点
    })
    defer client.Close()

    ctx := context.Background()
    
    // 集群操作与单机相同,客户端自动处理分片
    client.Do(ctx, client.B().Set().Key("cluster_key").Value("value").Build())
}

Rueidis通过以下设计实现高性能:

  1. 零内存分配:大量使用预分配缓冲区和对象池
  2. 响应式解析:流式解析Redis响应,减少内存占用
  3. 无锁设计:关键路径避免锁竞争
  4. 批量处理:自动合并小请求为批量操作

基准测试显示的性能优势主要来自这些底层优化,特别是在高并发场景下,Rueidis能够更有效地利用系统资源,减少GC压力,实现更高的吞吐量。

回到顶部