苍穹外卖日记 | Day5 Redis

一、回顾与概述

在第四天任务中,我们已经完成了套餐模块的独立开发。今天需要学会一项新技术Redis,主要从Redis常用命令以及如何在Java中操作Redis进行展开。

二、Redis的常用命令

1.Redis简介

在了解Redis的常用命令之前,我们先了解到底什么是Redis。Redis实质上是一个基于内存的key-value结构数据库,他存储的value类型比较丰富,也被称为结构化的非关系型数据库(NoSQL),同时支持将数据持久化到磁盘。它不仅是缓存工具,更是一个功能丰富的数据结构服务器。

(1)核心特点

  1. 纯内存存储 :数据默认在内存中读写,速度极快,单实例 QPS 可达 10 万级。

  2. 丰富的数据结构:支持字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(ZSet)等多种原生数据结构,满足复杂业务场景。

  3. 持久化机制 :提供 **RDB(快照)和 AOF(日志追加)**两种持久化方式,可在重启后恢复数据,兼顾性能与可靠性。

  4. 高并发与原子性 :所有命令都是单线程原子执行,天然避免了多线程竞争问题。

  5. 支持集群与高可用 :通过主从复制、哨兵(Sentinel)和集合(Cluster)模式,轻松实现数据冗余和故障自动切换。

  6. 丰富的扩展能力:支持发布订阅(Pub/Sub)、Lua 脚本、事务、过期策略等高级特性。

(2)主要作用

  • 缓存热点数据将数据库中的高频访问数据(如商品详情、用户信息)缓存到 Redis,减轻数据库压力,提升接口响应速度。

  • 实现分布式锁 :利用**SETNX**等命令实现分布式环境下的互斥锁,保证多服务操作的一致性。

  • 消息队列 :基于List的LPUSH/RPOP或Pub/Sub 模式,实现轻量级消息队列。

  • 计数器与排行榜 :用String做访问量计数,用ZSet实现实时排行榜(如热门商品、用户积分排名)。

  • 会话共享 :在分布式系统中,将用户Session存储到Redis,实现多服务间的 Session 共享。

(3)典型使用场景

**1.电商场景:**商品详情页缓存、库存扣减计数器、秒杀活动的库存预扣。基于用户行为的实时热门商品排行榜。

**2.社交场景:**用户点赞、关注关系存储(用Set实现共同关注)。动态时间线(用List或ZSet按时间排序存储)。

**3.支付场景:**订单状态缓存,分布式锁保证支付幂等性。

**4.高并发接口:**防刷限流(用String做请求次数计数,结合过期时间)

2.Redis入门

(1)下载地址

Redis中文网下载地址:Click Here

(2)服务器启动停止

启动方式一:双击redis-server.exe启动服务器

启动方式二:找到安装后的文件目录,输入cmd进入命令行,输入以下命令启动。

注意:启动方式二自定义配置更常用,方式一或者方式二不加配置文件会使Redis以默认配置运行。

java 复制代码
redis-server.exe redis.windows.conf // 启动服务器并使自定义配置文件生效

关闭方式一:关闭窗口

关闭方式二:CTRL + C

两种启动方式对比:

对比维度 双击启动 命令行指定配置文件启动
配置来源 硬编码默认值 读取 redis.windows.conf 中的自定义配置
持久化 默认关闭 RDB 和 AOF 可在配置文件中开启持久化,避免重启后数据丢失
网络安全 默认绑定 127.0.0.1(仅本地访问) 可配置绑定特定 IP、设置密码,限制外部访问
性能调优 无法调整内存、线程等参数 可设置内存上限、最大连接数、日志级别等
日志管理 日志仅输出到控制台 可指定日志文件路径、日志级别,便于问题排查
稳定性 关闭控制台即终止服务 可配置为 Windows 服务后台运行,稳定性更高

(3)客户端工具

下载地址:Click Here

(4)常用数据类型

Redis存储的是key-value结构的数据,其中key是字符串类型,value有五种常用数据类型:字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set / ZSet)。

数据类型 基本特点 核心能力 典型场景
String 最基础的键值类型,Value 可以是字符串、数字甚至二进制数据,单个 Value 最大能存 512MB。 支持直接对数字进行加减操作(INCR/DECR),也能追加字符串(APPEND)。 缓存用户信息、接口计数器、验证码存储。
Hash 是一个键值对的集合,类似 Java 里的 HashMap,适合存储结构化对象。 可以单独对某个字段进行增删改查(HSET/HGET),不用修改整个对象。 存储用户详情(如 user:1000nameageemail 等字段)、商品信息
List 是一个有序的字符串链表,元素可重复,两端插入 / 删除的时间复杂度为 O (1) 支持从头部或尾部添加 / 弹出元素(LPUSH/RPOP),也能按范围读取(LRANGE 实现消息队列、时间线动态、评论列表
Set 是无序且唯一的字符串集合,不允许重复元素,支持集合间的交集、并集、差集运算 快速判断元素是否存在(SISMEMBER),以及集合间的运算(SINTER/SUNION 存储用户的点赞 / 收藏、共同关注好友、抽奖活动的中奖用户去重
Sorted Set / ZSet 和 Set 一样元素唯一,但每个元素会关联一个分数(Score),Redis 会根据分数自动排序 可以按分数范围或排名范围获取元素(ZRANGE/ZREVRANGE),也能快速获取元素的排名(ZRANK 实时排行榜(如热门商品、用户积分)、带权重的任务队列

3.Redis常用命令

(1)字符串操作命令

1.新增/修改:

java 复制代码
SET key value // 设置指定key的值

2.查询:

java 复制代码
GET key // 获取指定key的值

3.新增过期键值对:

java 复制代码
SETEX key seconds value // 设置指定key的值,并将过期时间设置为seconds秒

4.不存在时新增:

java 复制代码
SETNX key value // 只有在key不存在的时候才设置key

5.自增:

java 复制代码
INCRBY key increment // 将key所存储的值加上给定的浮点增量值increment

6.自减:

java 复制代码
DECRBY key decrement // 将key所存储的值减去给定的减量值decrement

7.拼接:

java 复制代码
APPEND key value // 将指定的value追加到该key原来值value的末尾

(2)哈希操作命令

1.新增/修改:

java 复制代码
HSET key field value // 将哈希表key中的字段field的值设为value

2.查询:

java 复制代码
HGET key field // 获取存储在哈希表中指定字段的值

3.删除:

java 复制代码
HDEL key field // 删除存储在哈希表中的指定字段

4.查询哈希表所有字段:

java 复制代码
HKEYS key // 获取哈希表中所有字段

5.查询哈希表中所有值:

java 复制代码
HVALS key // 获取哈希表中所有值

6.查询哈希表所有字段和值:

java 复制代码
HGETALL key // 获取所有字段和值

(3)列表操作命令

1.插入:

java 复制代码
LPUSH key value1 [value2] // 将一个或多个值插入到列表头部

注意:L表示left,如果时RPUSH那就是插入到列表尾部。添加多个值,空格相隔。

2.查询:

java 复制代码
LRANGE key strat stop // 获取列表指定范围内的元素

3.移除:

java 复制代码
RPOP key // 移除并获取列表最后一个元素

4.获取长度:

java 复制代码
LLEN key // 获取列表长度

(4)集合操作命令

1.新增:

java 复制代码
SADD key member1 [member2] // 向集合添加一个或多个成员

2.查询:

java 复制代码
SMEMBERS key // 返回集合中的所有成员

3.成员数:

java 复制代码
SCARD key // 获取集合的成员数

4.交集:

java 复制代码
SINTER key1 [key2] // 返回给定所有集合的交集

5.并集:

java 复制代码
SUNION key1 [key2] // 返回所有给定集合的并集

6.差集:

java 复制代码
SDIFF set1 set2 // 求set1 - set2(set1里面有set2里面没有)

7.删除:

java 复制代码
SREM key member1 [member2] // 删除集合中一个或多个成员

(5)有序集合操作命令

1.新增:

java 复制代码
ZADD key score1 member1 [score2 member2] // 向有序集合添加一个或多个成员

2.查询:

java 复制代码
ZRANGE key start stop [WITHSCORES] // 通过索引区间返回有序集合中指定区间内的成员

3.自增:

java 复制代码
ZINCRBY key increment member // 有序集合中对指定成员的分数加上增量increment

4.删除:

java 复制代码
ZREM key member1 [member2] // 移除有序集合中的一个或多个成员

(6)通用命令

1.查找所有符合给定模式的key:

java 复制代码
KEYS pattern

2.检查给定key是否存在:

java 复制代码
EXISTS key

3.返回key所存储的值的类型:

java 复制代码
TYPE key

4.该命令用于在key存在时删除key:

java 复制代码
DEL key

5.重命名:

java 复制代码
rename key 新key

6.测试链接是否正常:

java 复制代码
ping

7.设置这个key在缓存中的存活时间:

java 复制代码
expire key 秒数

8.返回给定key的剩余生存时间,以秒为单位:

java 复制代码
ttl key // 返回值为-1:永不过期 返回值为-2:已过期或者不存在

三、Java中操作Redis

1.Redis的Java客户端

Redis的Java客户端很多,常用的几种:Jedis、Lettuce、Spring Data Redis

Spring Data Redis是Spring的一部分,对Redis底层开发进行了高度封装。在Spring项目中,可以使用Spring Data Redis来简化操作。

2.Spring Data Redis使用方式

(1)导入Spring Data Redis的maven坐标

XML 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

(2)配置Redis数据源

在application-dev.yml文件中配置Redis的端口号、地址、密码

XML 复制代码
sky:
  redis:
    port: 6379
    host: localhost
    password: 123456

在application.yml文件中配置Redis的端口号、地址、密码的引用

XML 复制代码
spring:
  redis:
    port: ${sky.redis.port}
    host: ${sky.redis.host}
    password: ${sky.redis.password}

(3)编写配置类,创建RedisTemplate对象【可选】

@Bean配合@Configuration将RedisTemplate放入IOC容器中,同时设置Key的序列化器为StringRedisSerializer,即把键key的序列化反序列化方式设定为StringRedisSerializer。

注意:序列化与反序列化和读写操作在Redis中的关系为 -> 写操作之前需要把内存中的数据转换成字节流(序列化),读操作之前需要把传输的字节流还原成内存中可识别的数据(反序列化)。

这里重新设置Key的序列化器主要是避免在Redis客户端看到的键名存在一些多余的符号,但不推荐修改Value的序列化器,原因是修改之后可能破坏跨语言兼容性。

(4)通过RedisTemplate对象操作Redis

由于已经导入了Spring Data Redis,所以redisTemplate对象已经在IOC容器里面了,即便我们没有做第三步编写配置类,他也有默认的配置类,所有直接自动注入即可。

3.RedisTemplate归类封装下的各种Operation接口

(1)ValueOperations

无论使用哪种Operations,第一步都是先使用redisTemplate对象获取对应Operations。ValueOperations是专门用于String数据操作,通过opsForValue获取到。常用set、get方法,set四个参数分别是key名字、key的值、超时时间、超时时间单位。

(2)HashOperations

opsForHash获取对应Operations,专门用于Hash类型数据操作。常用新增操作put,三个参数,key名字,哈希桶的键名、哈希桶的值。keys方法获取所有哈希桶的键名、values方法获取所有哈希桶的值、entries方法获取所有哈希桶键值对。

(3)ZSetOperations

opsForZSet获取对应Operations,专门用于ZSet类型数据操作。常用新增操作add,三个参数,key名字,value值、value值对应的分数score。range方法三个参数,查询的ZSet的key名、起始索引、末尾索引。rangeWithScores方法同上,唯一区别就是返回的值里面第二维是带有value值和score分数的二元组。而且这个二元组DefaultTypedTuple有getValue和getScore两种方法,分别获取value和score。两种查询方法查出来的数据都是按照score升序排序的。

(4)SetOperations

opsForSet获取对应Operations,专门用于Set类型数据操作。常用新增操作add,两个参数,key名字,value值。这个value可以一次性添加多个value。查询操作members,获取给定键名的集合Set。求并集union,求交集intersect,求差集difference(前面差后面)。

(5)ListOperations

opsForList获取对应Operations,专门用于List类型的数据操作。常用新增操作leftPushAll或者rightPushAll,两个参数,key名字,value值。这个value可以一次性添加多个value。查询操作range,三个参数key名、起始索引、末尾索引。移除操作leftPop剔除头部第一个元素。

四、总结

第五天任务量并不大,主要就是学习了Redis的常用命令,以及调用常见API,记住Redis中不同数据类型大概对应有哪些操作即可,API中ValueOperations接口最为常用,其他的需要用的时候查资料即可。

相关推荐
冉冰学姐2 小时前
SSM药店管理系统fk5p7(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·计算机毕业设计、·ssm 框架应用·药店管理系统
予枫的编程笔记2 小时前
【Redis核心原理篇4】Redis 哨兵模式:自动故障转移的实现原理
数据库·redis·bootstrap
敲敲千反田2 小时前
redis事务和主从模式
数据库·redis
小北方城市网2 小时前
Spring Cloud Gateway 自定义过滤器深度实战:业务埋点、参数校验与响应改写
运维·jvm·数据库·spring boot·后端·mysql
Gary董2 小时前
redis 和 mongoDB 的优劣
数据库·redis·mongodb
indexsunny3 小时前
互联网大厂Java面试实录:Spring Boot微服务在电商场景中的应用与挑战
java·spring boot·redis·mysql·security·microservices·interview
编程彩机3 小时前
互联网大厂Java面试:从分布式缓存到微服务架构的技术场景解析
java·redis·微服务·分布式事务·分布式缓存·面试解析
海星船长丶3 小时前
预编译与sql注入,正则回溯绕过,mysql常见绕过,报错注入7大常用函数
服务器·数据库·sql·mysql·网络安全
一只自律的鸡3 小时前
【MySQL】第七章 数据库, 表, 数据的增删改查
数据库·oracle