清理缓存简单功能实现

在程序开发中,经常会用到缓存,最常用的后端缓存技术有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;
			}

			alert(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里的缓存数据。

  • 8
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Redis 缓存实现需要以下步骤: 1. 安装 Redis:首先需要在你的系统上安装 Redis 服务器。 2. 连接到 Redis:使用 Redis 客户端连接到 Redis 服务器。 3. 将数据存入 Redis:使用 Redis 客户端操作将数据存入 Redis 服务器。 4. 获取数据:使用 Redis 客户端操作从 Redis 服务器获取数据。 5. 设置缓存过期时间:可以为存储在 Redis 中的数据设置过期时间,以便在数据过期后将其从 Redis 中删除。 这些步骤可以使用各种语言的 Redis 客户端库来实现,例如 Java、Python、Ruby 等。 ### 回答2: Redis(Remote Dictionary Server)是一种使用内存存储的开源缓存数据库,它支持各种数据结构,并提供了高性能的读写操作。 实现Redis缓存可以通过以下步骤: 1. 安装:首先,在服务器上安装Redis。可以下载官方的Redis安装包,然后根据官方文档进行安装和配置。 2. 连接:使用代码连接Redis服务器。可以选择不同的编程语言,如Java、Python等。通过连接操作可以实现与Redis服务器的通信。 3. 存储数据:使用SET命令将数据存储到Redis中。可以将数据作为键值对存储,例如:使用一个字符串作为键,将某个对象序列化为字符串后作为值存储到Redis中。 4. 获取数据:使用GET命令从Redis中获取数据。根据键名获取对应的值,并对值进行反序列化,以获得原始数据。 5. 过期和失效:可以为存储的键值对设置过期时间,使其在一定时间后自动过期。通过设置过期时间,可以实现自动清理过期数据的功能。当数据过期后,再次获取对应的键值对时会返回空值。 6. 缓存更新策略:在应用程序中,根据不同的业务需求,可以选择合适的缓存更新策略。例如,可以设置当某个键值对更新时,自动更新Redis中对应的数据。 7. 集群和分片:当需要支持更大的数据量或更高的并发访问时,可以考虑使用Redis的集群和分片功能。通过将数据分片或分布在多个节点上,可以提高系统的性能和可靠性。 总结来说,实现Redis缓存需要安装Redis服务器,使用代码连接服务器进行数据存储和获取,设置过期时间,选择适当的缓存更新策略等。通过合理使用Redis缓存,可以提升系统性能和响应速度。 ### 回答3: Redis是一种常见的高性能缓存数据库,它具有快速读写能力和灵活的数据结构,可以有效地加速应用程序的访问速度。下面是关于如何实现Redis缓存的一些步骤和方法。 首先,需要在应用程序中引入Redis客户端库。Java语言中,可以使用Jedis或Lettuce等库来操作Redis。在项目中添加相关的依赖项,并配置连接Redis服务器的参数。 接着,需要确定要缓存的数据。通常来说,缓存的数据可以是经常读取但是不经常变化的数据,比如配置信息、用户信息、常用查询结果等。将这些数据存储到Redis中,可以避免每次请求都访问繁重的数据库。 然后,通过Redis的API来存储和访问数据。可以使用键值对的方式存储数据,并设置生存时间,使得数据在一定时间后自动过期。这样,可以有效地管理内存和释放不再需要的数据。 在进行数据库读取之前,首先检查Redis缓存中是否存在所需的数据。通过检查数据的键是否存在,可以避免不必要的数据库查询。如果缓存中无数据,再从数据库中读取,并将结果存储到缓存中。 除了简单的键值对存储之外,Redis还支持其他的数据结构,比如列表、哈希表、集合和有序集合等。根据不同的场景,可以选择合适的数据结构来存储数据,并利用Redis提供的操作方法,实现更复杂的缓存需求。 最后,需要在应用程序中正确处理数据更新和删除的操作。当数据库中的数据发生变化时,需要及时更新Redis缓存中相应的数据,以保证数据的一致性。可以在数据更新和删除操作后,强制删除Redis中的缓存数据,以便下一次访问时重新从数据库中获取最新的数据。 总而言之,实现Redis缓存需要引入Redis客户端库,确定要缓存的数据,使用Redis的API存储和访问数据,选择合适的数据结构,处理数据更新和删除操作。通过合理地使用Redis缓存,可以提升应用程序的性能和响应速度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值