Ja va 中的 String 字符串可以直接用 Redis 的 set 和 get 命令来存储和读取,而且不需要额外折腾什么序列化。原因其实很简单——没什么玄乎的:Redis 本身只认字符串(而且是 binary-safe),而 Ja va 的 String 经过 UTF-8 编码后,本质上就是一组字节数据,天然就适配。
最常用的方式:用 Jedis
Jedis 算是 Redis Ja va 客户端里的“老面孔”了,操作起来直来直往,没什么门槛:
- 连接上 Redis 之后,直接
jedis.set("key", "value")就能把字符串存进去 - 想读出来,调用
jedis.get("key"),返回结果依然是String类型 - 有一点需要留个心:Jedis 默认是 UTF-8 编码,所以只要你的 Ja va 字符串本身没有什么奇怪的控制字符,基本不会出现乱码
生产环境更推荐:用 Lettuce
如果你的项目对并发要求比较高,或者在用响应式编程,那 Lettuce 会是更好的选择——它是线程安全的,也支持异步操作:
- 同步操作:
redisSyncCommands.set("user:name", "张三"),和 Jedis 一样直观 - 异步操作:
redisAsyncCommands.set("user:age", "25").thenAccept(ok -> {...}),配合回调来处理结果 - 同样是默认 UTF-8 编码,不需要手动处理编码解码那一套
存中文的时候要留意什么?
其实绝大多数场景下,你都不需要额外做什么特殊处理。但有两个地方值得确认一下:
- 确保你的 Ja va 文件编码确实是 UTF-8(IDE 和编译设置要统一,这是个老生常谈但又容易踩的坑)
- Redis 服务端本身不需要配置什么编码——它根本不关心你存的内容是什么语义,只管存字节
- 如果你需要用其他语言(比如 Python)来读这些数据,记得也按 UTF-8 来解码,不然可能会看到一堆“外星文字”
加个过期时间:set 操作还能这么玩
实际开发里,经常需要给缓存设置一个生存时间(TTL)。这一点,Jedis 和 Lettuce 都支持得很到位:
- Jedis 的做法:
jedis.setex("token:abc", 3600, "eyJhbGciOi..."),单位是秒,简单直接 - Lettuce 的做法:
redisSyncCommands.set("config:version", "v2.1", SetArgs.Builder.ex(3600)),用SetArgs.Builder.ex()来指定过期时间 - 另外,
set(key, value, SetArgs)这种写法还可以组合更多参数,比如 NX(只在键不存在时设置)或 XX(只在键已存在时设置),非常灵活