|
|
Caffeine 是 Java 本地缓存库,它不像 Redis 有一套命令行命令,而是通过 Java API 来完成新增、查询、修改、删除、刷新等操作。
下面整理一下实际开发中最常用的 Caffeine 操作。
1. 创建 Cache基础 Cache
- Cache<String, Object> cache =
- Caffeine.newBuilder()
- .build();
复制代码
带容量限制和过期时间
- Cache<String, Object> cache =
- Caffeine.newBuilder()
- .maximumSize(10000)
- .expireAfterWrite(30, TimeUnit.MINUTES)
- .build();
复制代码
含义:
2. 新增数据 put()
对应 Redis:
SET key value
Caffeine:
cache.put("user:1001", user);
例如:
- User user = new User();
- user.setId(1001);
- user.setName("张三");
- cache.put(
- "user:1001",
- user
- );
复制代码
结果:
3. 查询数据 getIfPresent()对应 Redis:
GET key
Caffeine:
User user = (User)cache.getIfPresent("user:1001");
如果不存在:
返回:
null 推荐:
User user = cache.getIfPresent("user:1001");if(user != null){ return user;}else{ //查询数据库} 4. 查询,没有则加载 get()这是最常用方式。
类似:
Redis GET不存在查询数据库SETCaffeine:
User user =cache.get( "user:1001", key -> queryDatabase(key));流程:
查询缓存 |存在 ↓返回不存在 ↓执行queryDatabase() ↓自动放入缓存 5. 修改缓存 put()Caffeine没有 update 命令。
修改就是覆盖:
cache.put( "user:1001", newUser);例如:
旧:
user:1001张三30岁执行:
cache.put("user:1001",张三35岁);变成:
张三35岁 6. 删除单个缓存 invalidate()对应 Redis:
DEL keyCaffeine:
cache.invalidate("user:1001");例如:
用户删除:
deleteUser(1001);cache.invalidate("user:1001"); 7. 批量删除 invalidateAll()对应:
DEL key1 key2 key3Caffeine:
cache.invalidateAll( Arrays.asList( "user:1001", "user:1002" )); 8. 清空全部缓存对应:
FLUSHDBCaffeine:
cache.invalidateAll();例如:
系统重新加载配置:
cache.invalidateAll();全部清除。
9. 判断是否存在Object value =cache.getIfPresent("user:1001");if(value != null){ System.out.println("存在");} 10. 获取缓存数量long size =cache.estimatedSize();例如:
System.out.println( cache.estimatedSize());输出:
8560 11. 获取所有缓存数据Caffeine:
Map<String,Object> map =cache.asMap();例如:
cache.asMap() .forEach( (key,value)->{ System.out.println(key); } ); 12. 更新对象内部字段(注意)例如:
缓存:
User user =cache.getIfPresent("user:1");修改:
user.setName("李四");可能存在问题:
因为:
缓存里的对象|引用同一个对象建议:
不要直接修改。
推荐:
User newUser =copy(user);newUser.setName("李四");cache.put("user:1",newUser); 13. 手动刷新 refresh()如果使用 LoadingCache:
LoadingCache<String,User> cache =Caffeine.newBuilder().build( key -> queryDatabase(key));刷新:
cache.refresh("user:1001");流程:
旧数据↓重新查询数据库↓替换缓存适合:
配置中心、热点数据。
14. 删除所有指定前缀的数据例如:
删除所有用户:
user:user:1001user:1002user:1003Caffeine没有Redis:
SCAN user:*需要自己处理:
cache.asMap().keySet().removeIf( key -> key.startsWith("user:")); 常用操作对照 Redis[td]| Redis | Caffeine | | SET | put() | | GET | getIfPresent() | | GET不存在加载 | get() | | DEL | invalidate() | | 批量DEL | invalidateAll(keys) | | 清空 | invalidateAll() | | TTL | expireAfterWrite | | KEYS | asMap().keySet() | | 刷新 | refresh() |
企业项目中最常见的三个操作实际 80% 场景就是:
查询cache.get("user:"+id,key -> userService.find(id)); 修改数据后删除userDao.update(user);cache.invalidate("user:"+user.getId()); 定时刷新热点数据cache.refresh("hot_products");
|
|