当前位置:首页 > 问答 > 正文

树叶云上教你用Java整Redis,入门到实战那些事儿

B站UP主“树叶云上”的系列视频“Java与Redis从入门到实战”)

树叶云上这家伙的视频挺实在的,上来就先唠明白为啥要用Redis,他说你想想啊,你的Java应用现在可能全靠数据库MySQL在那儿硬扛,每次用户看个文章、查个数据,哪怕是一模一样的内容,都得跑去数据库里捞一遍,数据库压力大,速度也快不起来,尤其是人一多的时候,网站卡得不行,Redis呢,就是个内存里的“超级临时工”,速度贼快(来源:视频中比喻为“高速缓存”),把那些经常用又不太变的数据,比如网站首页的热门文章列表、用户的登录信息(临时存一下)、商品分类啥的,往Redis里一放,下次再要的时候,Java程序先问问Redis:“哥们儿,有这东西不?”有的话直接拿,唰一下就返回给用户了,根本不用去烦数据库,这样数据库轻松了,整个网站的反应速度也蹭蹭往上窜。

那具体咋用Java去使唤这个“临时工”呢?树叶云上推荐了最常用的一个工具,叫Jedis(来源:视频中明确指出“咱们先用Jedis这个客户端来演示”),他说这就好比是Java程序和Redis之间的一根电话线,让它们能说上话,第一步,你得在你的Java项目里把Jedis这个“电话线”给装上,现在一般都用Maven来管理依赖,就在那个pom.xml文件里加几行配置,把Jedis的坐标信息写进去,它自己就会从网上下载相关的jar包。

装好之后,就可以开始写代码连接了,树叶云上演示了最简单的连接代码,大概长这样(来源:视频中代码演示部分):

import redis.clients.jedis.Jedis;
public class RedisDemo {
    public static void main(String[] args) {
        // 1. 创建一个Jedis对象,告诉他Redis服务器在哪儿(比如本地就是localhost),端口号默认6379
        Jedis jedis = new Jedis("localhost", 6379);
        // 如果有密码,还得认证一下:jedis.auth("你的密码");
        // 2. 试试看连没连通,发个Ping命令,Redis会返回一个"PONG"
        System.out.println("连接状态: " + jedis.ping());
        // 3. 好了,现在可以开始存东西了,最基础的 set 和 get
        // 存一个键值对,key是"website",value是"树叶云上的小破站"
        jedis.set("website", "树叶云上的小破站");
        // 把这个key对应的value取出来
        String value = jedis.get("website");
        System.out.println("从Redis取到的值是: " + value);
        // 4. 用完了记得关掉连接,好习惯
        jedis.close();
    }
}

他一边写一边解释,说Redis最基本的就是这种Key-Value结构,简单粗暴,除了存字符串,Redis还能存别的花样,比如List(列表)、Set(集合)、Hash(哈希,像Java里的Map)等等,树叶云上举了个实际例子,比如用List来存某个用户最近浏览的10个商品ID(来源:视频中“实战场景:用户浏览历史”部分),他写的代码片段是这样的:

// 假设用户ID是123
String userId = "user:123:history";
// 用户每看一个商品,就把商品ID从左边塞进这个列表里
jedis.lpush(userId, "product1001", "product1002", "product1003");
// 控制这个列表只保留最近10条,ltrim是关键,第二个参数0,第三个参数9表示保留索引0到9的元素,也就是最新的10个
jedis.ltrim(userId, 0, 9);
// 当需要展示浏览历史时,取出这10个商品ID
List<String> history = jedis.lrange(userId, 0, -1); // -1表示直到最后一个
System.out.println("用户浏览历史: " + history);

他还强调了Redis数据可以设置过期时间,这个特性非常有用(来源:视频中“别忘了给数据加个保质期”小节),比如用户的手机验证码,存进Redis后,设置个5分钟过期,时间一到Redis自己就删了,又安全又省事,代码也就加一行:

// 存验证码,key是手机号,value是生成的随机码
jedis.setex("phone_13800138000", 300, "889977"); // 300秒就是5分钟

到了后面的实战部分,树叶云上弄了个小Demo模拟商品秒杀(来源:视频“实战:用Redis搞定秒杀库存扣减”),他说这种场景下,好多人在同一瞬间下单,库存检查和高并发扣减要是还在数据库做,很容易出问题(超卖),用Redis的原子操作就能很好地应对,他展示了用decr命令(原子递减)来扣减库存:

// 先初始化某个商品的库存,比如秒杀商品ID为SKU10001的有10件
jedis.set("seckill:SKU10001:stock", "10");
// 当用户秒杀时,执行扣减
Long remainingStock = jedis.decr("seckill:SKU10001:stock");
if (remainingStock >= 0) {
    System.out.println("扣减成功,剩余库存: " + remainingStock);
    // 这里可以进行后续的下单流程...
} else {
    System.out.println("扣减失败,库存不足!");
    // 如果减完小于0,说明没库存了,得把刚才减的加回来,或者一开始就预先检查大于0再减
    jedis.incr("seckill:SKU10001:stock"); // 补救一下,加回来
}

树叶云上提醒说,Jedis虽然简单直接,但在多线程环境下用同一个Jedis实例可能会出问题(来源:视频“进阶话题:连接池与线程安全”),他提到了可以用JedisPool连接池来管理连接,让每个线程从池子里借一个用,用完还回去,这样更高效更安全,他还简单提了一嘴另一个叫Lettuce的客户端,说它性能更好而且默认就是线程安全的,适合更复杂的项目。

整个系列看下来,树叶云上就是通过这些一个个的小例子,把Java操作Redis从最简单的连接、基础命令,到各种数据类型的运用,再到实际业务场景的解决思路,一步步讲清楚了,让人感觉Redis这东西确实挺接地气,能解决实际问题。

树叶云上教你用Java整Redis,入门到实战那些事儿