一、回顾与概述
在第四天任务中,我们已经完成了套餐模块的独立开发。今天需要学会一项新技术Redis,主要从Redis常用命令以及如何在Java中操作Redis进行展开。
二、Redis的常用命令
1.Redis简介
在了解Redis的常用命令之前,我们先了解到底什么是Redis。Redis实质上是一个基于内存的key-value结构数据库,他存储的value类型比较丰富,也被称为结构化的非关系型数据库(NoSQL),同时支持将数据持久化到磁盘。它不仅是缓存工具,更是一个功能丰富的数据结构服务器。
(1)核心特点
纯内存存储 :数据默认在内存中读写,速度极快,单实例 QPS 可达 10 万级。
丰富的数据结构:支持字符串(String)、哈希(Hash)、列表(List)、集合(Set)、有序集合(ZSet)等多种原生数据结构,满足复杂业务场景。
持久化机制 :提供 **RDB(快照)和 AOF(日志追加)**两种持久化方式,可在重启后恢复数据,兼顾性能与可靠性。
高并发与原子性 :所有命令都是单线程原子执行,天然避免了多线程竞争问题。
支持集群与高可用 :通过主从复制、哨兵(Sentinel)和集合(Cluster)模式,轻松实现数据冗余和故障自动切换。
丰富的扩展能力:支持发布订阅(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以默认配置运行。
javaredis-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:1000的name、age、List 是一个有序的字符串链表,元素可重复,两端插入 / 删除的时间复杂度为 O (1) 支持从头部或尾部添加 / 弹出元素( LPUSH/RPOP),也能按范围读取(LRANGE)实现消息队列、时间线动态、评论列表 Set 是无序且唯一的字符串集合,不允许重复元素,支持集合间的交集、并集、差集运算 快速判断元素是否存在( SISMEMBER),以及集合间的运算(SINTER/SUNION)存储用户的点赞 / 收藏、共同关注好友、抽奖活动的中奖用户去重 Sorted Set / ZSet 和 Set 一样元素唯一,但每个元素会关联一个分数(Score),Redis 会根据分数自动排序 可以按分数范围或排名范围获取元素( ZRANGE/ZREVRANGE),也能快速获取元素的排名(ZRANK)实时排行榜(如热门商品、用户积分)、带权重的任务队列
3.Redis常用命令
(1)字符串操作命令
1.新增/修改:
javaSET key value // 设置指定key的值2.查询:
javaGET key // 获取指定key的值3.新增过期键值对:
javaSETEX key seconds value // 设置指定key的值,并将过期时间设置为seconds秒4.不存在时新增:
javaSETNX key value // 只有在key不存在的时候才设置key5.自增:
javaINCRBY key increment // 将key所存储的值加上给定的浮点增量值increment6.自减:
javaDECRBY key decrement // 将key所存储的值减去给定的减量值decrement7.拼接:
javaAPPEND key value // 将指定的value追加到该key原来值value的末尾
(2)哈希操作命令
1.新增/修改:
javaHSET key field value // 将哈希表key中的字段field的值设为value2.查询:
javaHGET key field // 获取存储在哈希表中指定字段的值3.删除:
javaHDEL key field // 删除存储在哈希表中的指定字段4.查询哈希表所有字段:
javaHKEYS key // 获取哈希表中所有字段5.查询哈希表中所有值:
javaHVALS key // 获取哈希表中所有值6.查询哈希表所有字段和值:
javaHGETALL key // 获取所有字段和值
(3)列表操作命令
1.插入:
javaLPUSH key value1 [value2] // 将一个或多个值插入到列表头部注意:L表示left,如果时RPUSH那就是插入到列表尾部。添加多个值,空格相隔。
2.查询:
javaLRANGE key strat stop // 获取列表指定范围内的元素3.移除:
javaRPOP key // 移除并获取列表最后一个元素4.获取长度:
javaLLEN key // 获取列表长度
(4)集合操作命令
1.新增:
javaSADD key member1 [member2] // 向集合添加一个或多个成员2.查询:
javaSMEMBERS key // 返回集合中的所有成员3.成员数:
javaSCARD key // 获取集合的成员数4.交集:
javaSINTER key1 [key2] // 返回给定所有集合的交集5.并集:
javaSUNION key1 [key2] // 返回所有给定集合的并集6.差集:
javaSDIFF set1 set2 // 求set1 - set2(set1里面有set2里面没有)7.删除:
javaSREM key member1 [member2] // 删除集合中一个或多个成员
(5)有序集合操作命令
1.新增:
javaZADD key score1 member1 [score2 member2] // 向有序集合添加一个或多个成员2.查询:
javaZRANGE key start stop [WITHSCORES] // 通过索引区间返回有序集合中指定区间内的成员3.自增:
javaZINCRBY key increment member // 有序集合中对指定成员的分数加上增量increment4.删除:
javaZREM key member1 [member2] // 移除有序集合中的一个或多个成员
(6)通用命令
1.查找所有符合给定模式的key:
javaKEYS pattern2.检查给定key是否存在:
javaEXISTS key3.返回key所存储的值的类型:
javaTYPE key4.该命令用于在key存在时删除key:
javaDEL key5.重命名:
javarename key 新key6.测试链接是否正常:
javaping7.设置这个key在缓存中的存活时间:
javaexpire key 秒数8.返回给定key的剩余生存时间,以秒为单位:
javattl 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的端口号、地址、密码
XMLsky: redis: port: 6379 host: localhost password: 123456在application.yml文件中配置Redis的端口号、地址、密码的引用
XMLspring: 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接口最为常用,其他的需要用的时候查资料即可。










