Redis 分布式缓存实现(一)

1. 什么是缓存(Cache)

  定义:就是计算机内存中的一段数据;

2. 内存中数据特点

  a. 读写快    b. 断电立即丢失

3. 缓存解决了什么问题?

  a. 提高网站吞吐量,提高网站运行效率;

  b. 核心解决问题:缓存的存在是用来减轻数据库访问压力;

4. 既然缓存能提高效率,那项目中所有数据加入缓存岂不是更好?

  注意:使用缓存时一定是数据库中数据极少发生修改,更多用于查询这种情况 例如:省份  城市  县  村

5. 本地缓存和分布式缓存的区别

  本地缓存:存储在当前应用服务器内存中的数据称之为本地缓存(local cache)

  分布式缓存:存储在当前应用服务器内存之外的数据称之为分布式缓存(distribute cache)

  集群:将同一种服务的多个节点放在一起,共同对系统提供服务的过程称之为集群(cluster)

  分布式:有多个不同服务集群共同对系统提供服务的这个系统称之为分布式系统(distribute system)

6. 利用 MyBatis 自身本地缓存结合 Redis 实现分布式缓存

  a. MyBatis 中应用级缓存(二级缓存)SqlSessionFactory 级别缓存,所有会话共享同一个 namespace

  b. 如何开启(二级缓存)

    在对应模块的Mapper.xml文件中开启二级缓存,例如:UserMapper.xml

    <cache/>  ---- 本地缓存 

  c. 查看 Cache 标签缓存实现

    结论:MyBatis底层默认使用的是:org.apache.ibatis.cache.impl.PerpetualCache 实现【底层就是一个 Map 数据结构存储】

  d. 自定义 RedisCache 实现,替换默认的 PerpetualCache

    (1)通过 MyBatis 默认 Cache 源码得知,可以只用自定义 Cache 接口的实现类 implements Cache 接口,并对里面的方法进行实现

      public class RedisCache implements Cache { }

    (2)在指定 Mapper 对应的 namespace 中开启二级缓存

      <cache type="com.study.cache.RedisCache"/>

Redis 分布式缓存实现(二)

1. 缓存在项目中应用

  a. 如果项目中表查询之间没有任何关联查询时,使用现在的这种缓存方式没有任何问题,比如:只是使用单表查询;

  b. 现有缓存方式在表连接查询过程中一定存在问题;比如:Depart 部门中有 多个 User 用户,Depart { List<User> users; }

2. 在 MyBatis 的缓存中如何要解决关联关系时更新缓存信息的问题【可参考文档:MyBatis 一级缓存和二级缓存     MyBatis 缓存 Cache

  <cache-ref  /> 用来将多个有关联关系查询缓存放在一起处理;

  在 UserMapper.xml 文件中加入以下内容:

  <cache-ref namespace="com.study.mapper.DepartMapper"/>

(1)关联关系缓存处理【用来将两个关联关系查询的结果缓存放在一起处理】
(2)存在关联关系的多个模块中,只要有一个模块更新,就应该把有关联的模块缓存都清空,否则会出现脏数据情况;
(3)此时不能使用<cache type=""/> 【只适合单模块的缓存】 要使用 <cache-ref namespace=""> 标签; <cache-ref namespace=""/> 当前模块的缓存去引用其他模块的缓存【用户模块的查询缓存放入部门模块的查询缓存中】
由于用户和部门关联,共享缓存,首先两模块的查询缓存放在一起 DepartMapper 下,无论用户或者部门做增删改,都会将 departMapper 下的缓存清空,进而关联的用户缓存也一并清空;

Redis 分布式缓存实现(三)

1. 缓存优化策略

  a. 对放入 Redis 中 Key 进行优化:Key 的长度不能太长;

  b. 尽可能将 Key 设计简洁一些:

    算法:MD5处理 加密

    特点:(1)一切文件字符字符串等经过MD5加密处理后,都会生成32位16进制字符串;(2)不同内容文件经过MD5进行加密,加密结果一定不一致;

         (3)相同内容文件多次经过MD5加密生成的结果始终一致;

  推荐:在 Redis 整合 SpringBoot 过程中建议将 Key 进行 MD5 加密优化处理;

2. 面试相关概念

  a. 什么是缓存穿透 击穿

    定义:客户端查询了一个数据库中没有的数据记录,导致缓存在这种情况下无法使用,称之为缓存穿透  缓存击穿

      MyBatis 中 Cache 解决了缓存穿透问题:将数据库中没有查询到的结果也进行缓存

  b. 什么是缓存雪崩

    定义:在系统运行的某一时刻,突然系统中缓存全部失效,恰好在这一时刻涌来大量客户的请求,导致所有模块缓存无法使用,大量请求涌向数据库导致极端情况,数据库阻塞获取挂起;

      缓存存储时:业务系统非常大,模块多,业务数据不同,不同模块在放入缓存时,都会设置一个缓存超时时间;

    解决方案:1. 缓存永久存储(不推荐) 2. 针对于不同业务数据一定要设置不同超时时间,避免同一时刻 或者 一极短时间内大量缓存失效。

目前只展示相关概念,代码实现没有展示出来,有问题大家一块讨论哈!

Redis实现分布式缓存的更多相关文章

  1. 在AspNetCore 中 使用Redis实现分布式缓存

    AspNetCore 使用Redis实现分布式缓存 上一篇讲到了,Core的内置缓存:IMemoryCache,以及缓存的基础概念.本篇会进行一些概念上的补充. 本篇我们记录的内容是怎么在Core中使 ...

  2. 【转载】在AspNetCore 中 使用Redis实现分布式缓存

    原文地址:https://www.cnblogs.com/szlblog/p/9045209.html AspNetCore 使用Redis实现分布式缓存 上一篇讲到了,Core的内置缓存:IMemo ...

  3. ASP.NET Core 使用 Redis 实现分布式缓存:Docker、IDistributedCache、StackExchangeRedis

    ASP.NET Core 使用 Redis 实现分布式缓存:Docker.IDistributedCache.StackExchangeRedis 前提:一台 Linux 服务器.已安装 Docker ...

  4. WEB 应用缓存解析以及使用 Redis 实现分布式缓存

    什么是缓存? 缓存就是数据交换的缓冲区,用于临时存储数据(使用频繁的数据).当用户请求数据时,首先在缓存中寻找,如果找到了则直接返回.如果找不到,则去数据库中查找.缓存的本质就是用空间换时间,牺牲数据 ...

  5. Redis-基本概念、java操作redis、springboot整合redis,分布式缓存,分布式session管理等

    NoSQL的引言 Redis数据库相关指令 Redis持久化相关机制 SpringBoot操作Redis Redis分布式缓存实现 Resis中主从复制架构和哨兵机制 Redis集群搭建 Redis实 ...

  6. C# Redis Server分布式缓存编程 --网络转载

    这篇文章我将介绍如果用最简洁的方式配置Redis Server, 以及如何使用C#和它交互编程 一. 背景介绍 Redis是最快的key-value分布式缓存之一 缺点: 没有本地数据缓冲, 目前还没 ...

  7. redis+keeplived分布式缓存

    redis(三)redis+Keepalived主从热备秒级切换 博客分类: 分布式缓存Redis redis高可用Keepalived  一 简介 安装使用centos 5.10 Master 19 ...

  8. springboot+mybatis+redis实现分布式缓存

    大家都知道springboot项目都是微服务部署,A服务和B服务分开部署,那么它们如何更新或者获取共有模块的缓存数据,或者给A服务做分布式集群负载,如何确保A服务的所有集群都能同步公共模块的缓存数据, ...

  9. ASP.NET结合Redis实现分布式缓存

    最近一个项目ASP.NET+MySQL 有的网页打开初始化的查询需要10秒甚至更久,用户体验极差,而且并发量变大的时候网站容易崩溃 后来想了两种解决方案都不是太满意 1.数据库里建一张缓存表,后台作业 ...

随机推荐

  1. Django创建表时报错django.db.utils.InternalError: (1366问题解决记录

    问题出现 执行Python manage.py makemigrations生成创建表的py文件 执行python manage.py migrate创建数据表 界面出现报错 问题原因 网上搜索原因, ...

  2. 笔记本电脑插网线能上网,但是连不上WIFI,或者连上WiFi显示无internet,怎么解决?

    1.鼠标 右键 "此电脑",选择"属性"

  3. TNS-12541 TNS no listener

    转载:https://blog.csdn.net/haha_201510/article/details/88119587 centOS环境下的解决方案: 查看监听状态lsnrctl status 如 ...

  4. 浅谈1——用Eclipse调试JAVA程序

    本篇博客主要介绍如何用Eclipse调试简单的JAVA程序. 1.如下图,一个简单的JAVA程序  2.设置断点. 方法:选中需设置断点的行代码,按快捷键Ctrl+Shift+B,设置断点: 断点设置 ...

  5. Django( 学习第五部 Django之模板语法)

    目录 模板语法 --- 传值 摸板语法 --- 过滤器 模板语法 --- 标签 自定义过滤器.标签.inclusion_tag 模板的继承 模板语法 --- 传值 {{}}       变量相关 {% ...

  6. 「IDEA插件精选」安利一个IDEA骚操作:一键生成方法的序列图

    在平时的学习/工作中,我们会经常面临如下场景: 阅读别人的代码 阅读框架源码 阅读自己很久之前写的代码. 千万不要觉得工作就是单纯写代码,实际工作中,你会发现你的大部分时间实际都花在了阅读和理解已有代 ...

  7. WAI-ARIA无障碍网页资料

    一.ARIA是啥? WAI-ARIA指无障碍网页应用.主要针对的是视觉缺陷,失聪,行动不便的残疾人以及假装残疾的测试人员.尤其像盲人,眼睛看不到,其浏览网页则需要借助辅助设备,如屏幕阅读器,屏幕阅读机 ...

  8. 框架篇:Linux零拷贝机制和FileChannel

    前言 大白话解释,零拷贝就是没有把数据从一个存储区域拷贝到另一个存储区域.但是没有数据的复制,怎么可能实现数据的传输呢?其实我们在java NIO.netty.kafka遇到的零拷贝,并不是不复制数据 ...

  9. 第 1 篇:Vue.js 很高兴认识你

    作者:HelloGitHub--追梦人物 Hello Vue 既然是学习编程,那就遵循一下那个古老的传统仪式. 首先我们新建一个 todos.html 文件,用任何一个你喜欢的文本编辑器或者 IDE ...

  10. C语言基础-C简介

    C语言简介  C 语言是一种通用的高级语言,最初是由丹尼斯·里奇在贝尔实验室为开发 UNIX 操作系统而设计的.C 语言最开始是于 1972 年在 DEC PDP-11 计算机上被首次实现. 在 19 ...