16-1 Redis分布式缓存引入与保存缓存功能实现
16-1 Redis分布式缓存引入与保存缓存功能实现
现在功能已经完成了,但是我们还是要考虑一下性能问题,现在任何请求都是要到数据库中查询很多的数据,才能知道当前的用户是否有权限可以访问当前的url,当我们的请求量很大时,它对我们数据库的请求量也是非常大的,这时,我们就会想到对我们的权限进行缓存,
这里就讲一下权限的缓存如何进行,
这里使用的是redis
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><!-- 引用配置文件 --><context:property-placeholder location="classpath:redis.properties" /><!-- 定义连接池 --><bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig" /><!-- 这个bean非常重要 --><bean id="shardedJedisPool" class="redis.clients.jedis.ShardedJedisPool" scope="singleton" > <!-- 上面定义的连接池 --><constructor-arg index="0" ref="jedisPoolConfig" /><constructor-arg index="1"><list> <!-- 连接池的信息 读取配置文件 --><bean class="redis.clients.jedis.JedisShardInfo"><constructor-arg name="host" value="${redis.host}"/><constructor-arg name="port" value="${redis.port}"/><constructor-arg name="timeout" value="${redis.timeout}"/></bean></list></constructor-arg></bean></beans>
redis.host=127.0.0.1 redis.port=6379 redis.timeout=3000
**************************************************************************************************************************************
package com.mmall.service;import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import redis.clients.jedis.ShardedJedis; import redis.clients.jedis.ShardedJedisPool;import javax.annotation.Resource;// 封装一下radis @Service("redisPool")//加注释让spring来管理 @Slf4j public class RedisPool {// 使用刚刚定义的spring管理的类radis@Resource(name = "shardedJedisPool")//直接调用radis了 单例的servieceprivate ShardedJedisPool shardedJedisPool;//返回单例的实例public ShardedJedis instance() {return shardedJedisPool.getResource();}//安全关闭的方法public void safeClose(ShardedJedis shardedJedis) {try {if (shardedJedis != null) {shardedJedis.close();}} catch (Exception e) {log.error("return redis resource exception", e);}} }
********************************************************************************************************************************
package com.mmall.service;import com.google.common.base.Joiner; import com.mmall.beans.CacheKeyConstants; import com.mmall.util.JsonMapper; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import redis.clients.jedis.ShardedJedis;import javax.annotation.Resource;@Service @Slf4j public class SysCacheService {//引用刚定义的reaispool@Resource(name = "redisPool")private RedisPool redisPool;/**** @param toSavedValue 要保存的值* @param timeoutSeconds 要保存多少秒* @param prefix 前缀 自定义*/public void saveCache(String toSavedValue, int timeoutSeconds, CacheKeyConstants prefix) {//调用下面的方法saveCache(toSavedValue, timeoutSeconds, prefix, null);}//保存cachepublic void saveCache(String toSavedValue, int timeoutSeconds, CacheKeyConstants prefix, String... keys) {if (toSavedValue == null) {return;}ShardedJedis shardedJedis = null;//网络连接可能会有问题 try catchtry {//1.生成对应的keyString cacheKey = generateCacheKey(prefix, keys);//拼接key 系统所有权限大家一样 但是单个用户权限大家不一样//2.拿到资源shardedJedis = redisPool.instance();//单例获取redis//提供好的方法处理 一定要写radis 的apishardedJedis.setex(cacheKey, timeoutSeconds, toSavedValue);} catch (Exception e) {log.error("save cache exception, prefix:{}, keys:{}", prefix.name(), JsonMapper.obj2String(keys), e);} finally {//别忘了释放radisredisPool.safeClose(shardedJedis);}}//获取cache// 参数 前缀 keypublic String getFromCache(CacheKeyConstants prefix, String... keys) {ShardedJedis shardedJedis = null;String cacheKey = generateCacheKey(prefix, keys);//拼接key 系统所有权限大家一样 但是单个用户权限大家不一样try {shardedJedis = redisPool.instance();//单例获取redisString value = shardedJedis.get(cacheKey);//获取值return value;//返回值} catch (Exception e) {log.error("get from cache exception, prefix:{}, keys:{}", prefix.name(), JsonMapper.obj2String(keys), e);return null;} finally {//别忘了释放radisredisPool.safeClose(shardedJedis);}}private String generateCacheKey(CacheKeyConstants prefix, String... keys) {String key = prefix.name();//多个string可以进行拼接if (keys != null && keys.length > 0) {key += "_" + Joiner.on("_").join(keys);}return key;} }
package com.mmall.beans;import lombok.Getter;@Getter public enum CacheKeyConstants {SYSTEM_ACLS,//缓存系统内的所有权限USER_ACLS;//缓存用户的权限}
********************************************************************************************************************************
//从缓存中获取数据public List<SysAcl> getCurrentUserAclListFromCache() {//userIdint userId = RequestHolder.getCurrentUser().getId();//通过key获取valueString cacheValue = sysCacheService.getFromCache(CacheKeyConstants.USER_ACLS, String.valueOf(userId));if (StringUtils.isBlank(cacheValue)) {//为空说明出问题了 重新获取一次List<SysAcl> aclList = getCurrentUserAclList();if (CollectionUtils.isNotEmpty(aclList)) {//重新保存 value 600s有效期 key的值(前缀和userid)sysCacheService.saveCache(JsonMapper.obj2String(aclList), 600, CacheKeyConstants.USER_ACLS, String.valueOf(userId));}return aclList;//没从cache中获取到值从数据库取出来}//缓存中有return JsonMapper.string2Obj(cacheValue, new TypeReference<List<SysAcl>>() {});} }
********************************************************************************************************************************
不是每个方法都要缓存的
有些必须是实时数据不就不能进行缓存
不需要进行特别多的数据访问 就不要缓存
********************************************************************************************************************************
********************************************************************************************************************************
********************************************************************************************************************************
********************************************************************************************************************************
********************************************************************************************************************************
********************************************************************************************************************************
16-1 Redis分布式缓存引入与保存缓存功能实现相关推荐
- Java:Redis分布式缓存
1.Redis作为缓存 Redis是一款内存高速缓存数据库: 数据模型为:key - value,非关系型数据库使用的存储数据的格式: 可持久化:将内存数据在写入之后按照一定格式存储在磁盘文件中,宕机 ...
- JAVA社交平台项目第六天 Redis分布式缓存
第6章 - Redis分布式缓存 学习目标: 掌握Redis性能测试 掌握Redis读写分离搭建 掌握Redis高可用Sentinel搭建 掌握Sentinel整合SpringBoot 掌握Redis ...
- redis 分布式缓存 详解
1.Redis概述 1.1.NoSQL NoSQL(Not Only SQL),意即不仅仅是SQL, 泛指非关系型的数据库. 1.2.Redis安装 首先需要从Redis官网上下载Redis的源码包, ...
- 电商项目实战之缓存与Redis分布式锁
电商项目实战之缓存与Redis分布式锁 缓存失效 缓存穿透 缓存雪崩 缓存击穿 分布式缓存 分布式锁 SpringBoot整合Redisson实现分布式锁 实现过程 缓存和数据库一致性 场景分析 解决 ...
- Redis分布式缓存、秒杀
目录 一.单点Redis的问题 二.RDB 三.AOF 四.Redis优化秒杀流程 1.秒杀步骤: 2.Redis优化秒杀步骤: 3.秒杀的lua脚本 4.调用秒杀的lua脚本 5.通过线程池,操作阻 ...
- 一文弄懂redis分布式缓存之微博推送技术方案
1️⃣业务场景分析 关注微博 登录首页展示了我关注的所有人发的微博,展示形式是列表 滚动有分页加载 2.个人微博 我发的微博展示在个人微博,展示形式也是列表 滚动有分页加载 2️⃣ 基于redis技术 ...
- Redis分布式缓存集群技术
Redis分布式缓存集群技术(也支持持久化),是关系型数据库的互补产品 特点:追求高性能\高并发,对数据一致性要求比数据库要差一些. # 1. Redis在集群架构中的角色及工作流程 1)内存 ...
- Redis 分布式缓存 Java 框架
https://dzone.com/articles/java-distributed-caching-in-redis 为什么要在 Java 分布式应用程序中使用缓存? 在提高应用程序速度和性能上, ...
- Redis分布式锁防止缓存击穿
缓存击穿 和缓存穿透不同的是,缓存击穿是指:缓存中没有,但是数据库中存在的热点数据. 例如:首页的热点新闻,并发访问量非常大的热点数据,如果缓存过期失效,服务器会去查询DB,这时候如果大量的并发去查询 ...
最新文章
- 吐血整理所有常用端口,遇到端口问题一查就懂!
- 外挂学习之路(14)--- 游戏中的二叉树
- 7 学大厂,拓展基础组件封装思路 BAT?TMD
- Cheatsheet: 2014 06.01 ~ 06.30
- if else if else语句格式_计算机各语言之间if...else区别
- 针对巴基斯坦的某APT活动事件分析
- curl上传图片的大坑
- 黑马程序员——双列集合、泛型 笔记第十一篇
- 读取阿里云服务器图片到本地
- 如何使用计算机来线性拟合,非线性数据拟合
- JQuery实现shift键多选
- 自建exchange邮箱有什么成熟的超大附件解决方案?
- 统计学中cv表示什么_cv是什么意思
- MYSQL登录错误:mysqladmin: connect to server at 'localhost' failed acess denied for user 'root'@'localhos
- 2022年5月语音合成(TTS)和语音识别(ASR)论文月报
- 微信小程序别踩白方块(有效果图)
- 计算机启用无线网络,有无线网络,电脑也开启了无线网络了,但是就是搜索不到无线网,怎么设置?...
- Linux打印添加水印,Linux 下给图片批量加水印
- figma设计_设计优化向figma的迁移
- Python学习笔记 之 从入门到放弃