Skip to content

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 使用(示例)

通过 RedisTemplateopsForXxx() 方法获取对应类型的操作对象:

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);