Redis Strings是Redis最基础的数据类型,它是二进制安全的,意味着可以存储任意类型的数据,比如字符串、整数、浮点数甚至序列化后的对象。很多开发者刚开始使用Redis时,最先接触的就是Strings类型,但不少人只了解基本的get和set操作,不清楚它的更多特性和适用场景。

Redis Strings基本操作命令
Strings类型的常用命令可以分为几类,首先是基础的设置和获取命令:
- SET key value:设置指定key的值为value,如果key已经存在会覆盖旧值
- GET key:获取指定key对应的value,如果key不存在返回nil
- SETNX key value:只有在key不存在时才会设置值,常用于分布式锁的实现
- SETEX key seconds value:设置key的值同时指定过期时间,单位是秒
如果操作的是整数类型的value,还可以使用自增自减相关的命令:
- INCR key:将key对应的整数值加1,如果key不存在会先初始化为0再执行加1操作
- DECR key:将key对应的整数值减1,不存在则初始化为0再减1
- INCRBY key increment:给key对应的整数值加上指定的increment数值
- DECRBY key decrement:给key对应的整数值减去指定的decrement数值
典型应用场景
1. 缓存存储
Strings类型最常见的场景就是做缓存,比如缓存数据库查询结果、接口返回数据等,减少后端存储的压力。比如缓存用户信息,我们可以将用户信息序列化为JSON字符串再存储到Redis中:
# 设置缓存,过期时间300秒
SET user:1001 '{"id":1001,"name":"张三","age":25}' EX 300
# 获取缓存
GET user:1001如果使用Java操作Redis,对应的代码示例如下:
import redis.clients.jedis.Jedis;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
public class RedisStringDemo {
public static void main(String[] args) {
Jedis jedis = new Jedis("127.0.0.1", 6379);
// 模拟用户信息对象
JSONObject user = new JSONObject();
user.put("id", 1001);
user.put("name", "张三");
user.put("age", 25);
// 序列化后存入Redis,设置过期时间300秒
String userJson = JSON.toJSONString(user);
jedis.setex("user:1001", 300, userJson);
// 获取缓存并反序列化
String cacheResult = jedis.get("user:1001");
JSONObject cacheUser = JSON.parseObject(cacheResult);
System.out.println(cacheUser.getString("name"));
jedis.close();
}
}2. 计数器实现
利用Strings类型的自增自减命令,可以很方便地实现计数器功能,比如文章阅读量、接口调用次数统计等。因为Redis是单线程执行命令,所以INCR等命令是原子性的,不用担心并发问题。
# 文章阅读量初始为0,每访问一次加1 INCR article:read:1001 # 获取当前阅读量 GET article:read:1001 # 批量统计多个文章的阅读量可以用MGET MGET article:read:1001 article:read:1002
3. 分布式锁基础
SETNX命令的特性是只有key不存在时才会设置成功,这个特性可以用来实现简单的分布式锁。比如多个服务要操作同一个资源时,先尝试用SETNX获取锁,获取成功再执行操作,操作完成后删除key释放锁。
# 尝试获取锁,锁的key是lock:resource,value可以设置为唯一标识,过期时间10秒避免死锁 SETNX lock:resource 123456 # 设置过期时间 EXPIRE lock:resource 10 # 操作完成后释放锁,先判断value是否匹配再删除,避免误删其他服务的锁 GET lock:resource # 如果value是123456,执行删除 DEL lock:resource
使用注意事项
首先要注意Strings类型value的大小限制,Redis单个Strings的value最大不能超过512MB,实际使用中尽量不要存储过大的数据,避免影响性能。其次,如果是存储序列化对象,要选择合适的序列化方式,比如JSON、Protobuf等,兼顾可读性和存储效率。另外,使用SETNX做分布式锁时,最好结合过期时间和value校验,避免因为服务宕机导致锁无法释放,或者误删其他服务的锁的情况。