资讯动态

黑马点评Redis基础篇:从安装到Java客户端实战

发布时间:2026/10/9 3:03:58 来源:尧图企业网站定制
开头我第一次完整跟黑马点评这个项目的时候说实话有点被劝退的念头。不是代码看不懂而是Redis这一趴突然冒出来的时候我脑子里全是问题这玩意儿到底解决什么问题的为什么项目非要引入一个内存数据库Java那边又是怎么跟它打交道的等到真正把黑马点评的缓存流程跑通才发现这些问题的答案其实高度统一——Redis入门最难的不是命令而是建立项目视角。这篇文章是黑马点评学习笔记的基础篇第一弹核心就两件事Redis到底是什么、在项目里怎么落地以及Java客户端怎么选、怎么用。我会按照自己当时的学习路径来写从本地把Redis跑起来到用命令行过一遍五种数据类型再到Java客户端Jedis、Lettuce、Spring Data Redis的选型和实战最后把新手最容易踩的连接不上序列化乱码这类坑单独拎出来讲。适合正在跟黑马点评、或者想快速把Redis和Spring Boot打通的同学参考。1. 黑马点评里Redis到底站在什么位置1.1 一个店铺缓存需求把Redis的价值暴露得明明白白黑马点评这个项目本质上是仿大众点评写的。你去搜附近的门店、点开一个店铺详情、刷点评这些操作全都要查数据库。问题就来了门店信息属于那种读多写少的数据一个店可能一天被看几千次但真正修改信息的情况少得可怜。如果每次请求都去翻MySQL数据库连接池很快就顶不住响应延迟也会上来。当时我看到项目里给出的方案其实就是行业里最经典的缓存套路第一次请求过来从数据库查出店铺数据然后塞进Redis后面再有人查直接走Redis内存MySQL的压力瞬间就降下去。那个感受我在笔记里写了一句Redis不是用来炫技的它是被大流量逼出来的。这句话我建议各位学的时候反复揣摩因为整个黑马点评的缓存部分不管是后面的缓存穿透、缓存击穿、分布式锁全都是围绕怎么让Redis更稳地扛住流量展开的。1.2 基础篇阶段Redis只需要掌握到会用的程度很多人在这一步会陷入一个误区——先去刷什么AOF、RDB、哨兵集群、持久化策略结果刷了一周回到项目里还是不知道怎么连Redis。基础的阶段我认为目标应该收敛一点能在本地把Redis跑起来能ping通能读写Key知道五种基本数据结构String、Hash、List、Set、ZSet分别是干什么用的会用至少一种Java客户端读写Redis并理解序列化的坑能说清楚连接池的必要性会做基础配置持久化、主从复制、分布式锁这些确实重要但放到黑马点评的进阶篇去学更合理。基础篇你只需要做到项目里给我一个Redis我能马上用Java代码把缓存读写跑通这就够了。2. 本地把Redis跑起来安装、启动与可视化2.1 三种安装姿势我建议从Windows版起步黑马点评课程里很多人卡在第一步Redis装不上。我把自己踩过的几种方式列出来你们按自己系统选。Windows直接解压版最省事Redis官方其实没有Windows版但是GitHub上有社区维护的移植版本比如tporadowski/redis。直接下载zip包解压后进目录双击redis-server.exeRedis就起来了默认端口6379。再开一个命令窗口运行redis-cli.exe就是它的命令行客户端。WSL / Linux 安装如果你用Ubuntusudo apt install redis-server装完执行redis-server。好处是跟生产环境更接近后面学主从复制、哨兵这些在Linux下配置更顺手。Docker方式docker run -d --name redis -p 6379:6379 redis一条命令搞定。这也是最贴近真实团队协作环境的方式因为很多公司开发环境就是用容器跑中间件的。我当时是先走的Windows解压版5分钟内见到了PING返回PONG那种我装成功了的反馈来得非常及时。装好了别急着碰Java先用命令行把五种数据结构过一遍。2.2 命令行五分钟把五种数据结构混个脸熟Redis的命令行其实特别适合用来建立直觉。我建议你打开redis-cli照着下面敲一遍# String最常用存字符串、数字、JSON序列化后的文本 SET shop:1 {\name\:\老王生煎\} GET shop:1 INCR pageview:shop:1 # Hash适合存对象相当于一个key下面挂多个字段 HSET shop:1 name 老王生煎 score 4.5 HGET shop:1 name HGETALL shop:1 # List双向链表适合做最近浏览记录、消息队列 LPUSH user:1:viewed shop:1 LPUSH user:1:viewed shop:2 LRANGE user:1:viewed 0 -1 # Set无序去重集合适合做共同关注、标签 SADD user:1:follow shop:1 SADD user:1:follow shop:2 SADD user:2:follow shop:1 SINTER user:1:follow user:2:follow # ZSet有序去重集合适合做排行榜 ZADD shop:rank 100 shop:1 ZADD shop:rank 80 shop:2 ZRANGE shop:rank 0 -1 WITHSCORES光看命令你可能觉得简单但请相信我后面Java客户端里你操作的类型就是这五种。提前在命令行里敲一遍等你在代码里看到redisTemplate.opsForHash()时心里就会浮现出HSET/HGET的画面学习曲线会平缓很多。2.3 可视化客户端不是必需品但能让调试效率翻倍命令行虽然够用但当你Redis里的Key多起来之后满屏命令效率确实低。我当时试过好几个可视化工具包括Redis Desktop Manager、Another Redis Desktop Manager、还有Tiny RDM。最终长期留下来的是Tiny RDM界面干净、跨平台、支持按库浏览、还能直接看Key的TTL和类型。可视化客户端解决的核心痛点是Debug。比如你序列化配错了Key显示成\xac\xed\x00\x05t...用可视化界面一眼就能看出来而命令行你得用KEYS *或者SCAN去慢慢扫。工具不是重点你觉得哪个顺手就用哪个我只有一个建议如果用的是老版本RDM注意它是收费的找开源替代品反而省心。3. Java客户端怎么选Jedis、Lettuce还是Spring Data Redis3.1 三个名字三种不同的面向开发者层级把Redis在本地跑通之后下一步就是接到Java代码里。黑马点评用的Spring Boot 2.x默认引入的其实是Lettuce但你如果去看社区老教程又会看到一堆Jedis代码。这三个东西的关系我用一个表理清楚客户端类型线程安全并发模型适用场景Jedis直连客户端实例不安全每个线程拿独立连接简单学习、老项目Lettuce异步客户端实例安全Netty多路复用一个连接跑大并发Spring Boot默认、生产推荐Spring Data Redis封装层安全内部基于Lettuce或Jedis项目中最常用的API层通俗点说Jedis是一辆车只能一个人开你多开几个线程就得多开几辆车开完还得还回去连接池。Lettuce是一辆大巴大家共乘靠Netty支撑很多请求共用连接。Spring Data Redis则是你不需要关心车的问题只用会买车票——它把底层客户端完全封装成了Spring风格的RedisTemplate。3.2 黑马点评项目里代码层面接触最多的是RedisTemplate黑马点评基于Spring Boot所以项目中实际注入的是StringRedisTemplate和RedisTemplate。课程里可以看到大量这样的代码Service public class ShopService { Resource private StringRedisTemplate stringRedisTemplate; public Shop queryById(Long id) { String key CACHE_SHOP_KEY id; // 1. 先查缓存 String shopJson stringRedisTemplate.opsForValue().get(key); if (StrUtil.isNotBlank(shopJson)) { return JSONUtil.toBean(shopJson, Shop.class); } // 2. 缓存没命中查数据库 Shop shop getById(id); // 3. 回写缓存 stringRedisTemplate.opsForValue().set(key, JSONUtil.toJsonStr(shop)); return shop; } }这里其实已经覆盖了Spring Data Redis最重要的使用模式用opsForValue()操作String类型用JSONUtil把对象转成JSON字符串存进去。为什么存字符串而不是直接存对象因为默认的JDK序列化会把对象变成一串难懂的二进制可读性差、体积大所以在基础阶段我强烈建议统统转为JSON字符串再存宁可多一步序列化动作也不要让乱码折磨你。3.3 用Jedis感受一下直连的原始感虽然黑马点评里RabbitMQ不对是Redis这块主要用Spring Data Redis但我还是建议你手写一段Jedis代码。不是为了用它而是为了理解连接池的来龙去脉。// 引入依赖redis.clients:jedis Jedis jedis new Jedis(127.0.0.1, 6379); jedis.auth(yourpassword); // 如果设了密码 jedis.set(user:1, {\name\:\zhangsan\}); String value jedis.get(user:1); System.out.println(value); jedis.close();这段代码跑通之后你会意识到一个问题如果每次操作都new Jedis()那并发一高连接开销会很恐怖。所以才有了连接池JedisPool pool new JedisPool( new JedisPoolConfig(), 127.0.0.1, 6379); try (Jedis jedis pool.getResource()) { jedis.set(user:2, hello); }理解了Jedis连接池你再看Lettuce的长连接多路复用就明白为什么Spring Boot默认选它了——省资源、抗并发、代码还更优雅。4. 把Redis用好必须跨过的三道坎连接池、序列化、缓存工具封装4.1 连接池参数不是配了就完事你得知道每个参数在保护什么在Spring Boot的配置文件中连接池参数长这样spring: data: redis: host: 127.0.0.1 port: 6379 password: lettuce: pool: max-active: 8 max-idle: 8 min-idle: 0 max-wait: -1ms很多人直接把配置抄过去就完事我建议你按这个逻辑记max-active是你同时能拿到多少个连接max-idle就是空闲时最多保留几条连接min-idle是最低保持几条max-wait是拿不到连接的时候排队等多久。回到黑马点评的查询场景如果突然来个流量尖峰缓冲查询的线程去获取连接max-wait设置一个具体的毫秒数比如1000ms比-1ms无限等待更安全否则连接池被占满时线程会一直挂在那里用户体验就是接口卡死。4.2 序列化RedisTemplate存进去的东西怎么变成了乱码这一节我必须单独拿出来讲因为十个人里有八个会栽在这。现象是这样的你往Redis里存了一个name的Key结果用Redis可视化工具一看Key变成了\xac\xed\x00\x05t\x00\x04name——一串不可读的字符。原因就是Spring Data Redis默认使用JDK序列化器。JDK序列化会把Key和Value都变成二进制流虽然能存能取但你看不到原始字符串大小也膨胀。解决方案非常固定在配置类里把Key和HashKey的序列化器换成StringRedisSerializerValue和HashValue用GenericJackson2JsonRedisSerializerConfiguration public class RedisConfig { Bean public RedisTemplateString, Object redisTemplate( RedisConnectionFactory redisConnectionFactory) { RedisTemplateString, Object template new RedisTemplate(); template.setConnectionFactory(redisConnectionFactory); StringRedisSerializer stringSerializer new StringRedisSerializer(); GenericJackson2JsonRedisSerializer jsonSerializer new GenericJackson2JsonRedisSerializer(); template.setKeySerializer(stringSerializer); template.setHashKeySerializer(stringSerializer); template.setValueSerializer(jsonSerializer); template.setHashValueSerializer(jsonSerializer); template.afterPropertiesSet(); return template; } }这就是搜索词里高频出现的redis序列化问题的标准解法。如果不想配这个类直接注入StringRedisTemplate也可以避开因为它默认就是字符串序列化器这也是黑马点评项目里大量使用StringRedisTemplate的原因之一少配置少出错。4.3 黑马点评的缓存工具封装把读写Redis变成模板方法正式项目不会在每个Service里都重复写查缓存、没命中查库、回写缓存这三步。黑马点评课程里封装了一个CacheClient我觉得这个设计思路是基础篇最值得模仿的地方。Component public class CacheClient { private final StringRedisTemplate stringRedisTemplate; private final StringRedisSerializer stringRedisSerializer new StringRedisSerializer(); public void set(String key, Object value, Long time, TimeUnit unit) { stringRedisTemplate.opsForValue().set(key, JSONUtil.toJsonStr(value), time, unit); } public T T queryWithPassThrough( String keyPrefix, Long id, ClassT type, FunctionLong, T dbFallback, Long time, TimeUnit unit) { String key keyPrefix id; String json stringRedisTemplate.opsForValue().get(key); if (StrUtil.isNotBlank(json)) { return JSONUtil.toBean(json, type); } if (json ! null) { return null; } T data dbFallback.apply(id); if (data null) { stringRedisTemplate.opsForValue().set(key, , time, unit); return null; } this.set(key, data, time, unit); return data; } }这个方法叫queryWithPassThrough翻译过来就是缓存穿透解决版查询。注意那个json ! null的判断如果缓存里存的是空字符串说明之前查过数据库但没查到这时候直接返回空不再打DB。这就是黑马点评里缓存空值解决缓存穿透的最小实现。你在基础篇先把这段结构看明白后面理解缓存穿透、逻辑过期就会轻松很多。5. 黑马点评连不上Redis这套排查清单帮你止血5.1 从最常见的五个原因说起搜索黑马点评连接不上redis的人非常多这个坑我太熟了。当年我是在Windows环境跑项目服务起不来控制台报Connection refused。整理一份排查清单现象最常见原因处理方式Connection refused: connectRedis进程没启动先启动redis-server.exe再跑Spring Boot连接超时防火墙拦截6379端口防火墙放行6379或临时关防火墙验证指定IP无法访问本机可以Redis只bind了127.0.0.1修改redis.confbind 0.0.0.0NOAUTH Authentication required密码没配对检查spring.data.redis.password配置报错信息里提到protected-mode保护模式挂起设置密码或显式--protected-mode no5.2 用redis-cli和日志双管齐下排错第一步不是去翻Spring Boot配置而是先确认Redis自己还活着。命令行里敲redis-cli -h 127.0.0.1 -p 6379 ping如果返回PONG说明Redis本身没问题问题出在Java这边。如果返回Connection refused那说明进程没起来或者端口不对先回头启动Redis。密码相关的验证redis-cli -h 127.0.0.1 -p 6379 -a yourpassword ping如果ping通了再去看Spring Boot的报错日志。有一个非常容易忽略的点Spring Boot 2.4之后配置项从spring.redis.*迁移到了spring.data.redis.*。如果你照着老教程把spring.redis.host写进application.yml那配置是不会生效的默认还是会去连localhost:6379。很多连接不上其实就是这个迁移细节害的。5.3 我自己的排查顺序照做能省半小时后来我总结了一套极简排查顺序每次连接出问题就按这个来redis-cli ping确认Redis进程和端口正常检查Spring Boot配置项是spring.data.redis还是spring.redis确认没写错版本看连接报错是refused还是timeout前者多半是进程/端口后者多半是防火墙确认有没有配置密码配置了就同步到redis.conf的requirepass最后还不行用IDEA的Run Dashboard看启动参数有没有被环境变量里的REDIS_HOST覆盖这套流程帮我在好几个环境里快速定位过问题也推荐你们固化下来。我在实际跟黑马点评基础篇的过程中最大的体会是Redis入门最忌讳的就是只看不动。你可以把安装到Java客户端整个链路自己完整走一遍——从命令行SET一个Key到用RedisTemplate把这个Key读出来再故意配错一次序列化器看看乱码长什么样最后把Redis停掉看Spring Boot报什么错。这一套下来你对Redis的体感会完全不一样。后面再进入缓存击穿、分布式锁这些进阶内容时你会发现自己没那么怕了因为底层这些东西你已经亲手摸过。下一篇笔记我打算写黑马点评里Redis五种数据类型在项目中的实际玩法到时候见。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑