Redis从入门到入土 --- 基础知识

0 阅读4分钟

基于黑马点评项目写的笔记

一、初识Redis

1.1 什么是NoSQL

对比项关系型数据库(SQL)非关系型数据库(NoSQL)
数据结构结构化,表结构固定非结构化,灵活松散
关联关系有关联(外键)无关联
查询方式SQL语句特定API
事务支持支持部分支持

1.2 Redis简介

  • 全称:Remote Dictionary Server(远程词典服务器)

  • 特点

    • 基于内存的键值型NoSQL数据库
    • 使用C语言开发
    • 读写速度极快(毫秒级延迟,每秒百万级读写)
    • 支持多种数据结构
    • 支持持久化

二、Redis数据结构与命令

2.1 五大基本数据类型

数据类型说明典型场景
String字符串,最基本类型缓存、计数器、分布式锁
Hash哈希,键值对集合存储对象信息
List列表,双向链表消息队列、最新列表
Set集合,无序去重好友关系、共同关注
SortedSet有序集合,带分数排行榜

2.2 常用命令

1. 通用命令

查看所有key ----- KEYS *

删除key ----- DEL key

判断key是否存在 ----- EXISTS key

设置过期时间(秒) ----- EXPIRE key

查看剩余过期时间 ----- TTL key

2. String命令:二进制安全,可存储任何数据

设置值 ----- SET key value

获取值 ----- GET key

设置值+过期时间 ----- SET key value EX seconds

自增 1 ----- INCR key

自增指定数值 ----- INCRBY key 数值

3. Hash命令:存储对象,比String更节省空间;可单独修改字段,无需整体序列化

设置字段值 ----- HSET key field value

获取字段值 ----- HGET key field

获取所有字段值 ----- HGETALL key

删除字段 ----- HDEL key field

4. List命令:有序、可重复、头尾操作O(1)

左/右插入 ----- LPUSH/RPUSH key value

左/右弹出 ----- LPOP/RPOP key

获取所有元素 ----- LRANGE key 0 -1

5. Set命令:无序、去重、支持集合运算

添加成员 ----- SADD key member

获取所有成员 ----- SMEMBERS key

求交集 ----- SINTER key1 key2

求并集 ----- SUNION key1 key2

6. SortedSet命令:有序、去重、每个元素关联一个分数

添加成员及分数 ----- ZADD key score member

获取前10名(倒序) ----- ZREVRANGE key 0 9

删除成员 ----- ZREM key member

三、Redis的Java客户端

3.1 客户端类型对比

客户端特点使用场景
Jedis经典,API直接对应Redis命令早期项目
Lettuce现代化,基于Netty,支持异步SpringBoot默认
Redisson分布式服务封装,功能丰富分布式锁等高级功能
SpringDataRedis对以上封装,提供RedisTemplate推荐

3.2 SpringDataRedis使用

引入依赖

<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson</artifactId>
    <version>3.13.6</version>
</dependency>

配置文件

redis:
  host: localhost
  port: 6379
  password: 
  lettuce:
    pool:
      max-active: 10
      max-idle: 10
      min-idle: 1
      time-between-eviction-runs: 10s
  database: 1

四、RedisTemplateStringRedisTemplate是何方神圣

在 Spring Boot 整合 Redis 时,RedisTemplateStringRedisTemplate 是最常见的两个工具类。很多人刚开始觉得它们只是名字不同,但真正的核心差异其实是:序列化和反序列化策略不同

1. 特点

  • RedisTemplate:更通用,可以操作任意对象,但一定要重视序列化/反序列化问题。
  • StringRedisTemplate:继承RedisTemplate,专门面向字符串场景,默认更适合日常业务开发。

2. 为什么要关注序列化和反序列化?

Redis 底层只能存储二进制数据,也就是 byte
所以 Java 中的对象、字符串、数字,写入 Redis 之前都要先进行序列化(如果不进行序列化则会出现乱码);读取出来以后,还要再进行反序列化

  • 序列化:Java 对象 -> Redis 可存储的字节数据
  • 反序列化:Redis 字节数据 -> Java 对象

3. RedisTemplate 的特点

RedisTemplate 是一个通用模板,支持操作各种类型的数据,比如:

@Autowired  
private RedisTemplate<String, Object> redisTemplate;

它的优点是灵活,什么都能存(Object),但它也有一个很常见的问题:如果你不自己配置序列化器,默认序列化结果通常并不友好。

比如你直接存一个对象:

redisTemplate.opsForValue().set("user:1", user);

虽然程序可能能正常运行,但 Redis 中的数据往往不是清晰可读的 JSON,而是一串不直观的二进制内容。所以使用 RedisTemplate 时,一定要重点考虑序列化器配置

4. StringRedisTemplate 的特点

StringRedisTemplate 本质上可以理解为:RedisTemplate<String, String>

它专门对字符串做了封装,适合存验证码、存token、存缓存JSON等

// user对象序列化
String json = JSON.toJSONString(user);
// 存Redis
stringRedisTemplate.opsForValue().set("cache:user:1", json);
.
.
.
// 从Redis拿数据
String json = stringRedisTemplate.opsForValue().get("cache:user:1");
// 反序列化
User user = JSON.parseObject(json, User.class);