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分布式缓存引入与保存缓存功能实现相关推荐

  1. Java:Redis分布式缓存

    1.Redis作为缓存 Redis是一款内存高速缓存数据库: 数据模型为:key - value,非关系型数据库使用的存储数据的格式: 可持久化:将内存数据在写入之后按照一定格式存储在磁盘文件中,宕机 ...

  2. JAVA社交平台项目第六天 Redis分布式缓存

    第6章 - Redis分布式缓存 学习目标: 掌握Redis性能测试 掌握Redis读写分离搭建 掌握Redis高可用Sentinel搭建 掌握Sentinel整合SpringBoot 掌握Redis ...

  3. redis 分布式缓存 详解

    1.Redis概述 1.1.NoSQL NoSQL(Not Only SQL),意即不仅仅是SQL, 泛指非关系型的数据库. 1.2.Redis安装 首先需要从Redis官网上下载Redis的源码包, ...

  4. 电商项目实战之缓存与Redis分布式锁

    电商项目实战之缓存与Redis分布式锁 缓存失效 缓存穿透 缓存雪崩 缓存击穿 分布式缓存 分布式锁 SpringBoot整合Redisson实现分布式锁 实现过程 缓存和数据库一致性 场景分析 解决 ...

  5. Redis分布式缓存、秒杀

    目录 一.单点Redis的问题 二.RDB 三.AOF 四.Redis优化秒杀流程 1.秒杀步骤: 2.Redis优化秒杀步骤: 3.秒杀的lua脚本 4.调用秒杀的lua脚本 5.通过线程池,操作阻 ...

  6. 一文弄懂redis分布式缓存之微博推送技术方案

    1️⃣业务场景分析 关注微博 登录首页展示了我关注的所有人发的微博,展示形式是列表 滚动有分页加载 2.个人微博 我发的微博展示在个人微博,展示形式也是列表 滚动有分页加载 2️⃣ 基于redis技术 ...

  7. Redis分布式缓存集群技术

    Redis分布式缓存集群技术(也支持持久化),是关系型数据库的互补产品 特点:追求高性能\高并发,对数据一致性要求比数据库要差一些. # 1. Redis在集群架构中的角色及工作流程     1)内存 ...

  8. Redis 分布式缓存 Java 框架

    https://dzone.com/articles/java-distributed-caching-in-redis 为什么要在 Java 分布式应用程序中使用缓存? 在提高应用程序速度和性能上, ...

  9. Redis分布式锁防止缓存击穿

    缓存击穿 和缓存穿透不同的是,缓存击穿是指:缓存中没有,但是数据库中存在的热点数据. 例如:首页的热点新闻,并发访问量非常大的热点数据,如果缓存过期失效,服务器会去查询DB,这时候如果大量的并发去查询 ...

最新文章

  1. 吐血整理所有常用端口,遇到端口问题一查就懂!
  2. 外挂学习之路(14)--- 游戏中的二叉树
  3. 7 学大厂,拓展基础组件封装思路 BAT?TMD
  4. Cheatsheet: 2014 06.01 ~ 06.30
  5. if else if else语句格式_计算机各语言之间if...else区别
  6. 针对巴基斯坦的某APT活动事件分析
  7. curl上传图片的大坑
  8. 黑马程序员——双列集合、泛型 笔记第十一篇
  9. 读取阿里云服务器图片到本地
  10. 如何使用计算机来线性拟合,非线性数据拟合
  11. JQuery实现shift键多选
  12. 自建exchange邮箱有什么成熟的超大附件解决方案?
  13. 统计学中cv表示什么_cv是什么意思
  14. MYSQL登录错误:mysqladmin: connect to server at 'localhost' failed acess denied for user 'root'@'localhos
  15. 2022年5月语音合成(TTS)和语音识别(ASR)论文月报
  16. 微信小程序别踩白方块(有效果图)
  17. 计算机启用无线网络,有无线网络,电脑也开启了无线网络了,但是就是搜索不到无线网,怎么设置?...
  18. Linux打印添加水印,Linux 下给图片批量加水印
  19. figma设计_设计优化向figma的迁移
  20. Python学习笔记 之 从入门到放弃

热门文章

  1. 2021牛客暑期多校训练营4 E - Tree Xor 线段树 + 拆分区间
  2. 【CF1020C】Election【贪心】
  3. AGC004E - Salvage Robots(dp,思维)
  4. 学习三分 (概念 + 模板 + 例题:曲线)
  5. 不止代码:迷宫问题(bfs)
  6. nssl1476-联【线段树】
  7. P2055-假期的宿舍【网络流,最大流,最大匹配】
  8. 【做题记录】[NOIP2011 提高组] 观光公交
  9. 初一模拟赛总结(2019.4.13)
  10. Java 并发总结——进程与线程