Redis 多语言客户端接入

业务代码访问 Redis 都通过官方或社区客户端库完成,不同语言的 API 大同小异:先建连接(或连接池),再调用命令对应的方法,最后归还连接。本章以 Java、Go、Python 三个主流生态为例,讲清选型与最小可用写法。

Java:Jedis / Lettuce / Spring Data Redis

  • Jedis:轻量同步客户端,API 直接对应命令,需要自己维护连接池。
  • Lettuce:支持同步/异步/响应式,线程安全,Spring Boot 默认的底层客户端。
  • Spring Data Redis:封装出 RedisTemplate/StringRedisTemplate,与 Spring 无缝集成,要注意序列化策略(见下文)。

连接池要点:生产环境不能每次请求都 new 连接,应复用池化连接;配好 maxTotal(最大连接数)、maxIdle/minIdle(空闲上下限),用完归还:

// 以下片段需放入对应工程的 main 方法运行(引入 jedis 依赖)
JedisPool pool = new JedisPool(new JedisPoolConfig(), "127.0.0.1", 6379);
try (Jedis jedis = pool.getResource()) {   // 借连接,用完自动归还
    jedis.set("city", "Beijing");
    System.out.println(jedis.get("city")); // 输出:Beijing
}
pool.close();

Spring Boot 项目更常见的是注入 StringRedisTemplate 直接使用,连接池参数写在 application 配置里。

Go:go-redis

Go 生态事实标准是 go-redis(当前为 v9,模块路径 github.com/redis/go-redis/v9),Redis.NewClient 建客户端,命令方法返回 *Cmd 再取结果:

// 以下片段需放入 main 函数运行(import "context"; "fmt"; "github.com/redis/go-redis/v9")
rdb := redis.NewClient(&redis.Options{
    Addr:     "127.0.0.1:6379",
    Password: "",          // 无密码留空
    DB:       0,
    PoolSize: 20,          // 连接池大小
})
ctx := context.Background()
err := rdb.Set(ctx, "city", "Beijing", 0).Err()
if err != nil { panic(err) }
val, err := rdb.Get(ctx, "city").Result()
fmt.Println(val)           // 输出:Beijing

生产代码中 rdb 应作为单例保存复用,命令出错用 errors.Is(err, redis.Nil) 判断“key 不存在”而非数据错误。

Python:redis-py

Python 官方客户端是 redis-py(pip install redis),Redis 实例是线程安全的,可全局复用;decode_responses=True 让返回值直接是字符串而非字节:

# 依赖 redis-py:pip install redis(可直接运行)
import redis
r = redis.Redis(host="127.0.0.1", port=6379, db=0, decode_responses=True)
r.set("city", "Beijing")
print(r.get("city"))          # 输出:Beijing
print(r.exists("city"))       # 输出:1

redis-py 5.x 提供 Redis(同步)与 redis.asyncio.Redis(异步)两套接口,异步接口用 await 调用同名方法。

key 规范与序列化建议

跨语言、跨团队协作时,一套约定能少踩很多坑:

  • 命名规范:用“业务:对象:标识”的冒号分层,如 order:1001:items、user:1001:name,便于按前缀归类,也方便 SCAN 按模式巡检。
  • 长度控制:key 与 value 都占内存与网络带宽,key 不要塞长句子,几十字节内为宜。
  • 值序列化:结构化数据按需选 JSON(可读、通用)、MessagePack/Protocol Buffers(紧凑、高效);Redis 的 value 是二进制安全的字符串,也可压缩后存放。
  • 哈希替代:一个对象的多个字段优先存成 Hash(HSET user:1001 name Tom age 18),比整串 JSON 更省内存、可单独改字段。
  • 序列化器一致:Spring Data Redis 若默认用 JDK 序列化,缓存对其他语言不可读且体积大,应显式配置 JSON 序列化;Go、Python 侧把缓存值按约定的 JSON 结构读写即可互通。

小结:接入客户端三步走——选对库(Java 用 Spring Data Redis/Lettuce、Go 用 go-redis、Python 用 redis-py)、全局复用带连接池的实例、统一 key 与序列化规范。下一章讲生产环境如何监控、排查与优化内存。

笔记加载中…