Appearance
Redis
一、Redis 入门
什么是 Redis?
Redis 是一款基于内存的高性能 key-value 结构数据库,是互联网领域最常用的存储中间件。
核心特点:
- 基于内存存储,读写性能极高(官方 QPS 可达 10 万+)
- 适合存储热点数据(如热点商品、资讯)
- 支持多种数据类型,属于结构化 NoSql 数据库
NoSql 与关系型数据库的区别:
NoSql(非关系型数据库)是关系型数据库的补充,而非替代。
- 关系型数据库:Mysql、Oracle、SQLServer(强事务、结构化数据)
- 非关系型数据库:Redis、MongoDB、MemCached(高并发、灵活结构)
二、Redis 核心数据类型
Redis 的 key 为字符串类型,value 支持 5 种常用数据类型,特点如下:
| 数据类型 | 特点说明 | 类比 Java 集合 |
|---|---|---|
| 字符串(string) | 普通字符串,最基础类型 | String |
| 哈希(hash) | field-value 键值对集合,适合存储对象 | HashMap |
| 列表(list) | 有序可重复,按插入顺序排列 | LinkedList |
| 集合(set) | 无序不可重复,支持交集、并集运算 | HashSet |
| 有序集合(zset) | 元素关联分数(score),按分数排序,不可重复 | TreeSet(带权重) |
三、Redis 常用命令(按类型分类)
3.1 字符串(string)命令
| 命令格式 | 说明 |
|---|---|
| SET key value | 设置 key 的值 |
| GET key | 获取 key 的值 |
| SETEX key seconds value | 设置 key 的值,并指定过期时间(秒) |
| SETNX key value | 仅当 key 不存在时设置值(分布式锁常用) |
3.2 哈希(hash)命令
| 命令格式 | 说明 |
|---|---|
| HSET key field value | 设置哈希表中指定 field 的值 |
| HGET key field | 获取哈希表中指定 field 的值 |
| HDEL key field | 删除哈希表中指定 field |
| HKEYS key | 获取哈希表中所有 field |
| HVALS key | 获取哈希表中所有 value |
3.3 列表(list)命令
| 命令格式 | 说明 |
|---|---|
| LPUSH key value1 [value2] | 向列表头部添加一个或多个元素 |
| LRANGE key start stop | 获取列表中[start, stop]范围的元素(-1 表示末尾) |
| RPOP key | 移除并返回列表最后一个元素 |
| LLEN key | 获取列表长度 |
3.4 集合(set)命令
| 命令格式 | 说明 |
|---|---|
| SADD key member1 [member2] | 向集合添加一个或多个成员 |
| SMEMBERS key | 返回集合中所有成员 |
| SCARD key | 获取集合成员数量 |
| SINTER key1 [key2] | 返回多个集合的交集 |
| SUNION key1 [key2] | 返回多个集合的并集 |
| SREM key member1 [member2] | 移除集合中一个或多个成员 |
3.5 有序集合(zset)命令
| 命令格式 | 说明 |
|---|---|
| ZADD key score1 member1 [score2 member2] | 向有序集合添加成员(指定分数) |
| ZRANGE key start stop [WITHSCORES] | 返回指定范围的成员(带分数可选) |
| ZINCRBY key increment member | 为指定成员的分数增加增量 |
| ZREM key member [member...] | 移除有序集合中的成员 |
3.6 通用命令(跨类型)
| 命令格式 | 说明 |
|---|---|
| KEYS pattern | 查找符合模式的所有 key(如 KEYS *) |
| EXISTS key | 判断 key 是否存在(返回 1 存在,0 不存在) |
| TYPE key | 返回 key 的 value 类型 |
| DEL key | 删除指定 key |
| EXPIRE key seconds | 设置 key 的过期时间(秒) |
| TTL key | 返回 key 的剩余生存时间(-1 永不过期,-2 已过期) |
四、Java 中操作 Redis(Spring Data Redis)
4.1 客户端选择
Redis 的 Java 客户端有 Jedis、Lettuce 等,Spring 项目推荐使用Spring Data Redis,其对底层客户端进行了封装,提供统一 API。
4.2 环境搭建(Spring Boot 项目)
步骤 1:导入依赖
xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>步骤 2:配置 Redis 数据源
在 application-dev.yml 中配置:
yaml
sky:
redis:
host: localhost # Redis主机地址
port: 6379 # 端口
password: 123456 # 密码
database: 10 # 数据库编号(0-15)在 application.yml 中引用:
yaml
spring:
redis:
host: ${sky.redis.host}
port: ${sky.redis.port}
password: ${sky.redis.password}
database: ${sky.redis.database}步骤 3:配置 RedisTemplate(关键)
默认 RedisTemplate 的 key 序列化器会导致 key 格式异常,需自定义配置:
java
@Configuration
public class RedisConfiguration {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
// 设置key序列化器为String类型(避免乱码)
template.setKeySerializer(new StringRedisSerializer());
return template;
}
}4.3 核心 API 使用(示例)
通过 RedisTemplate 的 opsForXxx() 方法获取对应类型的操作对象:
java
@Autowired
private RedisTemplate<String, Object> redisTemplate;
// 1. 操作字符串
ValueOperations<String, Object> valueOps = redisTemplate.opsForValue();
valueOps.set("name", "小明");
String name = (String) valueOps.get("name");
// 2. 操作哈希
HashOperations<String, Object, Object> hashOps = redisTemplate.opsForHash();
hashOps.put("user:100", "name", "tom");
hashOps.put("user:100", "age", 20);
// 3. 操作列表
ListOperations<String, Object> listOps = redisTemplate.opsForList();
listOps.leftPushAll("mylist", "a", "b", "c");
// 4. 操作集合
SetOperations<String, Object> setOps = redisTemplate.opsForSet();
setOps.add("set1", "a", "b", "c");
// 5. 操作有序集合
ZSetOperations<String, Object> zSetOps = redisTemplate.opsForZSet();
zSetOps.add("zset1", "a", 10.0);