2、删除用户接口中同步清理本地缓存
只需改造下删除接口的服务实现方法即可
private CaffeineCacheUtils caffeineCacheUtils = new CaffeineCacheUtils();* 删除,同时需要删除相关的key* @param id* @return@Override@CacheEvict(value = https://www.isolves.com/it/cxkf/kj/2022-09-05/{"dbUser"},key = "#root.args[0]",cacheManager = "cacheManagerMinutes")public String deleteById(String id) {dbUserMapper.deleteByUserId(id);caffeineCacheUtils.evict("dbUser",id);return "delete success";3、方案优缺点优点
- 操作简便;
- 只要参数传入正确,就可以确保缓存一致性;
- 适合单机模式下使用
- 代码产生了一定的耦合性;
- 不适合分布式环境使用;
- 需要手动管理key的相关参数;
对zookeeper有所了解和使用的同学,应该对zk的节点管理不陌生,zk作为一款分布式协调中间件,在很多分布式场景都有着广泛的使用,比如实现集群选举,分布式锁,节点管理等等,利用zk的节点属性,可以很好的解决这个问题;
使用zk的解决思路
- 查询用户接口中,注册一个节点,节点命名最好和缓存的key保持一致;
- 删除接口中,手动触zk的节点删除;
- zk监听到删除节点的事件变化时,同步清理本地缓存;
com.101teczkclient0.10org.slf4jslf4j-log4j122、提供一个zk节点操作工具类import org.I0Itec.zkclient.IZkDataListener;import org.I0Itec.zkclient.ZkClient;import org.I0Itec.zkclient.serialize.SerializableSerializer;import org.Apache.zookeeper.CreateMode;public class ZkUtils {private ZkClient zkClient = null;private String node;/*public static void main(String[] args) {ZkUtils zkUtils = new ZkUtils();zkUtils.createNode(node);zkUtils.nodeExist(node);zkUtils.deleteNode(node);public ZkUtils(String node) {zkClient = new ZkClient("localhost:2181", 60000 * 30, 60000, new SerializableSerializer());//监听节点变化//需要通过java修改zookeeper数据,才能监听到zkClient.subscribeDataChanges("/" + node, new IZkDataListener() {//节点数据变化时触发@Overridepublic void handleDataChange(String s, Object o) throws Exception {System.out.println("change Node: " + s);System.out.println("change data: " + o);//节点数据删除时触发@Overridepublic void handleDataDeleted(String s) throws Exception {System.out.println("delete Node: " + s);* 创建zk节点* @param nodepublic void createNode(String node) {//创建持久节点String node1 = zkClient.create("/" + node, node, CreateMode.PERSISTENT);System.out.println(node1);* 修改zk节点数据* @param node* @param datapublic void writeNodeData(String node, String data) {zkClient.writeData("/" + node, 233);* 查询zk节点* @param nodepublic boolean nodeExist(String node) {boolean exists = zkClient.exists("/" + node);return exists;* 查询节点数据* @param node* @returnpublic String findNodeData(String node) {Object data = https://www.isolves.com/it/cxkf/kj/2022-09-05/zkClient.readData("/" + node);System.out.println(data);return data.toString();* 删除节点* @param nodepublic void deleteNode(String node) {boolean b2 = zkClient.deleteRecursive("/" + node);System.out.println(b2);3、查询用户接口,注册缓存的key对应的z-node节点@Override@Cacheable(value = https://www.isolves.com/it/cxkf/kj/2022-09-05/{"dbUser"},key = "#root.args[0]",cacheManager = "cacheManagerMinutes")public DbUser getById(String id) {System.out.println("首次查询走数据库");DbUser dbUser = dbUserMapper.getByUserId(id);//FIXME 将缓存注册到节点registerCacheNode(id);return dbUser;public void registerCacheNode(String id){String node = "user:" + id;ZkUtils zkUtils = new ZkUtils(node);zkUtils.createNode(node);4、删除用户接口添加删除zk节点逻辑@Override@CacheEvict(value = https://www.isolves.com/it/cxkf/kj/2022-09-05/{"dbUser"},key = "#root.args[0]",cacheManager = "cacheManagerMinutes")public String deleteById(String id) {dbUserMapper.deleteByUserId(id);//删除 z-node 节点String node = "user:" + id;ZkUtils zkUtils = new ZkUtils(node);zkUtils.deleteNode(node);return "delete success";5、改造zk监听逻辑,同步移除本地缓存private CaffeineCacheUtils caffeineCacheUtils = new CaffeineCacheUtils();public ZkUtils(String node) {zkClient = new ZkClient("localhost:2181", 60000 * 30, 60000, new SerializableSerializer());//监听节点变化//需要通过java修改zookeeper数据,才能监听到zkClient.subscribeDataChanges("/" + node, new IZkDataListener() {//节点数据变化时触发@Overridepublic void handleDataChange(String s, Object o) throws Exception {System.out.println("change Node: " + s);System.out.println("change data: " + o);//节点数据删除时触发@Overridepublic void handleDataDeleted(String s) throws Exception {System.out.println("delete Node: " + s);caffeineCacheUtils.evict("dbUser","1");
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- AMD|AMD RX 7000显卡最终规格定了!无限缓存缩水一半
- AMD|100MB缓存天下无敌!AMD锐龙7 5800X3D要第一次大降价
- SpringBoot的六边形架构案例
- AMD|AMD Zen4三级缓存带宽暴涨近60%:最多3倍碾压12代酷睿
- 「SpringBoot」 Java中如何封装Http请求
- 教你怎么清除浏览器缓存 如何删除浏览器缓存
- iPhone正确清理缓存的方法 苹果手机如何删除
- 深入浅出理解分布式一致性Paxos算法
- 如何保证数据库与缓存数据一致性?
- springboot 外部配置文件的引入
