清理缓存简单功能实现

在程序开发中,经常会用到缓存,最常用的后端缓存技术有Redis、MongoDB、Memcache等。

而有时候我们希望能够手动清理缓存,点一下按钮就把当前Redis的缓存和前端缓存都清空。

功能非常简单,创建一个控制器类CacheController,并提供一个post请求的接口/cache/clean供用户使用。

目录

后端代码

CacheController.java

RedisUtils.java

StringRedisUtils.java

前端代码


后端代码

CacheController.java

import cn.edu.sgu.www.mhxysy.consts.MimeType;
import cn.edu.sgu.www.mhxysy.redis.RedisUtils;
import cn.edu.sgu.www.mhxysy.restful.JsonResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author heyunlin
 * @version 1.0
 */
@RestController
@Api(tags = "缓存管理")
@RequestMapping(path = "/cache", produces = MimeType.APPLICATION_JSON_CHARSET_UTF_8)
public class CacheController {

    /**
     * 应用名
     */
    @Value("${spring.application.name}")
    private String service;

    private final RedisUtils redisUtils;

    @Autowired
    public CacheController(RedisUtils redisUtils) {
        this.redisUtils = redisUtils;
    }

    @ApiOperation("清理应用的缓存")
    @RequestMapping(value = "/clean", method = RequestMethod.POST)
    public JsonResult<Void> location() {
        redisUtils.deleteByPattern(service + "*");

        return JsonResult.success("缓存清理成功~");
    }

}

RedisUtils.java

 RedisUtils是一个接口,它的实现类为StringRedisUtils是通过StringRedisTemplate封装成的工具类。

import java.util.concurrent.TimeUnit;

/**
 * redis工具类
 * @author heyunlin
 * @version 1.0
 */
public interface RedisUtils {

    /**
     * 获取key的值:get key
     * @param key redis的key
     * @return key的值
     */
    String get(String key);

    /**
     * 设置key:set key value
     * @param key redis的key
     * @param value key的值
     */
    void set(String key, String value);

    /**
     * 设置key:set key value ex timeout = set key value + expire key timeout
     * @param key redis的key
     * @param value key的值
     * @param timeout 过期时间
     * @param timeUnit 时间单位
     */
    void set(String key, String value, long timeout, TimeUnit timeUnit);

    /**
     * 删除key:del key
     * @param key redis的key
     */
    void delete(String key);

    /**
     * 根据pattern删除key:del keys pattern
     * @param pattern String
     */
    void deleteByPattern(String pattern);

    /**
     * 让key自增:incrby key
     * @param key redis的key
     * @return 自增后的值
     */
    Long incrBy(String key);

    /**
     * 判断key是否存在
     * @param key redis的key
     * @return key存在则返回true,否则返回false
     */
    Boolean hasKey(String key);

    /**
     * 设置key的过期时间:expire key seconds
     * @param key redis的key
     * @param timeout 过期时间
     * @param timeUnit 时间单位
     */
    void expire(String key, long timeout, TimeUnit timeUnit);
}

StringRedisUtils.java

import cn.edu.sgu.www.mhxysy.util.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Component;

import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
 * 封装了StringRedisTemplate的redis工具类
 * @author heyunlin
 * @version 1.0
 */
@Component
public class StringRedisUtils implements RedisUtils {

    private final StringRedisTemplate stringRedisTemplate;

    @Autowired
    public StringRedisUtils(StringRedisTemplate stringRedisTemplate) {
        this.stringRedisTemplate = stringRedisTemplate;
    }

    @Override
    public String get(String key) {
        return getValueOperations().get(key);
    }

    @Override
    public void set(String key, String value) {
        getValueOperations().set(key, value);
    }

    @Override
    public void set(String key, String value, long timeout, TimeUnit timeUnit) {
        getValueOperations().set(key, value, timeout, timeUnit);
    }

    @Override
    public void delete(String key) {
        stringRedisTemplate.delete(key);
    }

    @Override
    public void deleteByPattern(String pattern) {
        Set<String> keys = stringRedisTemplate.keys(pattern);

        if (CollectionUtils.isNotEmpty(keys)) {
            stringRedisTemplate.delete(keys);
        }
    }

    @Override
    public Long incrBy(String key) {
        return getValueOperations().increment(key);
    }

    @Override
    public Boolean hasKey(String key) {
        return stringRedisTemplate.hasKey(key);
    }

    @Override
    public void expire(String key, long timeout, TimeUnit timeUnit) {
        stringRedisTemplate.expire(key, timeout, timeUnit);
    }

    /**
     * 获取ValueOperations对象
     * @return ValueOperations<String, String>
     */
    private ValueOperations<String, String> getValueOperations() {
        return stringRedisTemplate.opsForValue();
    }

}

前端代码

点击下拉菜单的清理缓存按钮,就能完成删除前后端缓存的功能。

前端的javascript代码如下

/**
 * 封装的ajax post请求
 * @param url 请求url
 * @param params 请求参数
 * @param success 成功回调函数
 * @param error 失败回调函数
 * @param async 是否异步
 */
function ajaxPost(url, params, success, error, async = true) {
	$.ajax({
		type: "POST",
		url: base + url,
		data: params,
		async: async,
		cache: false,
		dataType: "json",
		processData: true,
		success: success,
		error: error
	});
}

/**
 * 错误回调函数
 * @param res
 */
let error = (res) => {
	let response = res.responseJSON;

	// 请求有响应
	if (res && response) {
		let status = res.status;

		if (status) {
			let message;

			if (status === 404) { // 404 not found
				if (response.path) {
					message = "路径" + response.path + "不存在。";
				} else {
					message = response.message;
				}
			} else {
				message = response.message;
			}

			aler(message);
			// console.log("响应状态码:" + status + ", 响应消息:" + message);
		} else {
			console.log("请求没有响应状态码~");
		}
	} else {
		console.log("请求无响应~");
	}
}

$(function() {

    $("#clean").on("click", function() {
		ajaxPost("/cache/clean", {},function(response) {
			showMsg(response.message);

			localStorage.clear();
		}, error);
	});

});

先通过post请求访问/cache/clean接口,当清理完后端的redis缓存数据之后,再清空前端localStorage的缓存,当然也可以清除cookile里的缓存数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/616957.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

连升三级!openGauss单机版从2.1.0经停3.0.0升级至5.0.0

前言 如前文所述&#xff0c;我们的小demo项目起初安装了openGauss的2.1.0版本&#xff0c;由于2.1.0不是长期维护&#xff08;LTS&#xff09;版本&#xff0c;所以要升级到5.0.0LTS。考虑到虽然是DEMO项目&#xff0c;但也有些体验用户&#xff0c;所以为了保障业务连续性&a…

虚幻五关卡制作学习笔记

1.创建一个移动平台 这个移动平台的功能&#xff1a;从箭头1移动到箭头2来回移动&#xff0c;可移动时发绿光&#xff0c;不可移动时发红光 首先&#xff0c;创建两个材质&#xff0c;发红光和绿光 然后我们创建一个actor蓝图类&#xff0c;添加两个arrow组件&#xff0c;两个…

一文弄懂 Linux 系统调用函数之 exec 函数族

目录 简介函数原型参数说明返回值函数区别使用示例采用参数列表传递参数&#xff0c;以 execl 为例采用参数数组传递参数&#xff0c;以 execv 为例调用 PATH 下可执行文件&#xff0c;以 execlp 为例使用新的环境变量给新进程&#xff0c;以 execle 为例 更多内容 简介 exec …

22、Flink 背压下的 Checkpoint处理

1.概述 通常&#xff0c;对齐 Checkpoint 的时长主要受 Checkpointing 过程中的同步和异步两个部分的影响&#xff1b;但当 Flink 作业正运行在严重的背压下时&#xff0c;Checkpoint 端到端延迟的主要影响因子将会是传递 Checkpoint Barrier 到 所有的算子/子任务的时间&…

计算机毕业设计】springbootBBS论坛系统

本系统为用户而设计制作 BBS论坛系统&#xff0c;旨在实现BBS论坛智能化、现代化管理。本BBS论坛自动化系统的开发和研制的最终目的是将BBS论坛的运作模式从手工记录数据转变为网络信息查询管理&#xff0c;从而为现代管理人员的使用提供更多的便利和条件。使BBS论坛系统数字化…

什么是JVM中的程序计数器

在计算机的体系结构中&#xff1a; 程序计数器&#xff08;Program Counter&#xff09;&#xff0c;通常缩写为 PC&#xff0c;是计算机体系结构中的一个寄存器&#xff0c;用于存储下一条指令的地址。程序计数器是控制单元的一部分&#xff0c;它的作用是确保程序能够按正确…

用python写个控制MicroSIP自动拨号和定时呼叫功能(可用在小型酒店叫醒服务)MicroSIP定时拨号

首先直接上结果吧&#xff0c;MicroSIP 助手&#xff0c;控制MicroSIP自动拨号&#xff0c;定时呼叫的非常实用小工具&#xff01; 在使用MicroSIP 助手之前&#xff0c;我们需要了解MicroSIP是什么&#xff0c;MicroSIP是一个SIP拨号软件&#xff0c;支持注册任意SIP平台实现拨…

【Java难点】多线程-高级

悲观锁和乐观锁 悲观锁 synchronized关键字和Lock的实现类都是悲观锁。 它很悲观&#xff0c;认为自己在使用数据的时候一定有别的线程来修改数据&#xff0c;因此在获取数据的时候会一不做二不休的先加锁&#xff0c;确保数据不会被别的线程修改。 适合写操作多的场景&…

1057: 有向图的出度计算

解法&#xff1a; #include<iostream> using namespace std; int arr[100][100]; int main() {int vertex, edge;cin >> vertex >> edge;int i, j;while (edge--) {cin >> i >> j;arr[i][j] 1;}for (int i 0; i < vertex; i) {int sum 0;…

乡村振兴与乡村环境综合整治:加强农村环境保护,开展农村环境综合整治行动,提升乡村环境质量,打造生态宜居的美丽乡村

目录 一、引言 二、乡村振兴背景下的乡村环境现状 1、乡村环境面临的挑战 2、乡村环境问题的成因 三、加强农村环境保护的重要性 1、促进乡村振兴 2、保障生态安全 3、提升居民生活质量 四、开展农村环境综合整治行动的策略 1、制定科学规划 2、加大投入力度 3、强…

在iPad中进行截图的两种方法,总有一种适合你

在iPad上截屏就像在iPhone设备上同时按下两个按钮一样简单,或者你可以使用另一种屏幕方法。以下是操作方法。 什么是屏幕截图 屏幕截图是对设备屏幕上内容的直接捕捉。使用屏幕截图,你可以捕捉你所看到的内容,然后将其保存以备日后使用或与他人共享,而无需使用相机拍摄设…

ICode国际青少年编程竞赛- Python-4级训练场-复杂嵌套for循环

ICode国际青少年编程竞赛- Python-4级训练场-复杂嵌套for循环 1、 for i in range(4):Dev.step(i6)for j in range(3):Dev.turnLeft()Dev.step(2)2、 for i in range(4):Dev.step(i3)for j in range(4):Dev.step(2)Dev.turnRight()Dev.step(-i-3)Dev.turnRight()3、 for i …

AI换脸原理(7)——人脸分割参考文献TernausNet: 源码解析

1、介绍 这篇论文相对来说比较简单,整体是通过使用预训练的权重来提高U-Net的性能,实现对UNet的改进。该方法也是DeepFaceLab官方使用的人脸分割方法。在介绍篇我们已经讲过了UNet的网络结构和设计,在进一步深入了解TernausNet之前,我们先简单回顾下UNet。 U-Net的主要结构…

趣味软件-吃什么(Eat What)?

&#x1f354;&#x1f35c;&#x1f355; 你是否也有这样的日常烦恼&#xff1f; 每天的“世纪难题”——今天吃什么&#xff1f; &#x1f570;️ 饭点到了&#xff0c;脑袋空空&#xff0c;选择困难症大爆发&#xff01; &#x1f46b; 和女朋友约会&#xff0c;却不知道她的…

nss刷题(2)

1、[NSSCTF 2022 Spring Recruit]ezgame 打开题目是一个游戏界面 发现是有分数的&#xff0c;猜测分数达到某个之后可以获得flag&#xff0c;查看源码看一下 看到末尾显示分数超过65后显示flag 在js中找到了一个score,将他的值改为大于65的数后随意玩一次就可以得到flag同时&a…

WHAT - CSS Animationtion 动画系列(二)

目录 一、循环波浪二、关键帧呼应三、关键帧顺接四、利用 transform-origin 做拉伸五、大元素可拆分多个小元素联动六、预留视觉缓冲七、随机感&#xff1a;动画周期设置八、抛物线&#xff1a;两个内外div实现x和y向量运动 今天我们主要学习动画实现要素。 一、循环波浪 利用…

Nginx(简洁版)

基本配置 worker_processes 1; //默认为1&#xff0c;表示开启一个业务进程 events //事件驱动模块&#xff08;&#xff09;{worker_connections 1024; //单个业务进程可接受连接数 } http{include mime.types; // 引入http mime类型&#xff08;在外部已经定义好&#xff0c…

《视觉十四讲》例程运行记录(6)——运行ch9后端优化CeresBA和g2o求解BA的实践例程

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、运行ch9的例程代码1. MeshLab安装2. 编译例程代码前的修改3. 编译例程 一、运行ch9的例程代码 1. MeshLab安装 (1) 软件中心安装 搜索&#xff1a;MeshLab&am…

HCIP的学习(14)

过滤策略—filter-policy ​ 思科中&#xff1a;分发列表 ​ 过滤策略是只能够针对于路由信息进行筛选&#xff08;过滤&#xff09;的工具&#xff0c;而无法针对于LSA进行过滤。 在R4的出方向上配置过滤策略&#xff0c;使得R1不能学习到23.0.0.0/24路由信息1、抓取流量 […

CSS学习笔记之基础教程(二)

上节内容CSS学习笔记之基础教程&#xff08;一&#xff09; 6、边距 6.1 外边距&#xff1a;margin 6.1.1 外边距 marginmargin-topmargin-leftmargin-bottommargin-right <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8…