Java 如何做缓存
早上刚冲的热豆浆,放了一上午就凉透了——要是能让早餐的温度一直留着,是不是能省不少重新加热的功夫?做Java缓存其实就跟这事儿一个理:把常用的、不用每次都重新算/拿的数据,像留着热豆浆似的存在“顺手的地方”,要用的时候直接取,不用再跑老远的“厨房”(数据库)重新烧,省时间也省力气。
第一步:先搞懂,哪些数据该留着“趁热用”?
不是所有数据都适合做缓存,乱存反而会占地方。就像豆浆凉了不好喝,放太久的包子也会发硬,得挑“对的”数据留:

- 常用且不变的:比如外卖平台固定的配送费规则、公司官网的logo图,这些东西半个月、一个月都不会变,存起来下次直接拿,不用每次查数据库;
- 计算一次就够的:比如你刷短视频时,首页推荐的热门榜,每天更新一次就够,不用每次打开APP都重新算一遍;
- 读多写少的:像奶茶店的菜单,顾客天天看,但只有新品上架或下架时才改,这种“读的人多、改的人少”的数据,存缓存最划算。
要是碰到像用户刚提交的订单,每次打开都可能变,就别硬存缓存了,不然会让用户看到旧信息。
第二步:选个“顺手的小柜子”存数据
Java里做缓存,不用自己搭个“大仓库”,现成的“小柜子”工具就够,分两种常用的,跟家里放东西的场景差不多:
本地小柜子:存在自己电脑上
就像把常用的水杯、钥匙放自己家抽屉,拿起来最快。用的工具叫Guava Cache,是Google做的轻量工具,不用额外装软件,直接在项目里加几行代码就能用。
比如你是个做图书管理系统的程序员,要经常查“畅销榜Top10”,就可以把这些数据存进Guava Cache:
`java
// 就像给抽屉贴个标签,放畅销榜数据
LoadingCache<String, List<Book>> top10Cache = CacheBuilder.newBuilder()
.expireAfterWrite(1, TimeUnit.HOURS) // 1小时后“抽屉自动清空”,避免放太久变旧
.maximumSize(10) // 抽屉最多放10个榜单,满了就把最久没用到的挤出去
.build(CacheLoader.from(key -> database.getTop10Books())); // 没人用的时候,自动去“数据库(厨房)”取数据
`
这种方式快,但有个缺点:每个服务器自己存自己的“小柜子”,要是有多台服务器(比如一个APP有2个机房),这台服务器的缓存,另一台用不了,就像你家的钥匙,邻居拿不到。
共享大柜子:存在大家都能拿的地方
要是有多台服务器,就得用Redis这种共享缓存,就像小区门口的快递柜,不管哪个单元的业主,都能扫二维码取。它是单独的小软件,要先装到服务器上,项目里连个地址就能用。
还是拿图书管理系统举例,要是有2个机房的服务器都要查畅销榜,就把数据存在Redis里,两台服务器都能取:
`java
// 用Java连Redis存数据,就像把快递放进小区柜
Jedis jedis = new Jedis("redis服务器地址", 6379); // 找到快递柜的位置
jedis.setex("top10Books", 3600, json格式的畅销榜数据); // 存1小时后过期
// 取数据的时候,先查快递柜,没有再去数据库
String top10Json = jedis.get("top10Books");
if (top10Json == null) {
top10Json = database.getTop10BooksJson();
jedis.setex("top10Books", 3600, top10Json);
}
`
这种方式虽然比本地缓存慢一点,但能共享,不会让多台服务器重复查数据库,避免“数据库被挤爆”的问题——就像小区快递柜不会让每个业主都把包裹放自己家,避免楼下堆成山。
第三步:给缓存设个“保质期”,别留太久
不管是Guava还是Redis,都得给数据设个“保质期”——就像豆浆放2小时就该扔,不然会坏。要是缓存里存了过期的数据,用户看到的就是旧信息,比如奶茶店改了价格,用户手机里还显示原来的价格,就会出问题。
除了固定时间过期,还可以设“懒过期”:比如你上次查畅销榜是1小时前,这次再查就用缓存里的,要是超过1小时没查,下次查的时候直接删掉旧数据,重新去数据库取。
最后:别踩这些“缓存坑”
做缓存不是随便存,不然会出麻烦:
- 别存太杂的东西:把用户的聊天记录存缓存,会占太多空间,还可能泄露隐私;
- 别让缓存“抢了数据库的活”:要是有人频繁改订单,别硬存缓存,不然每次改都得删缓存,反而更麻烦;
- 缓存出问题别慌:就算Redis挂了,程序也能直接去数据库取数据,就像快递柜坏了,你直接去快递站取,不会耽误事儿。
说白了,Java做缓存就是“把常用的东西放随手的地方”,选对工具、存对数据、设好保质期,就能让程序跑起来又快又省力气。