redis 中分布式缓存实现

1.什么是缓存(cache)

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

2.内存数据特点

1.读写快 2.断点立即消失

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

1.提高网站的吞吐量,提高网站运行效率(吞:网站的处理请求,吐就是处理响应的过程)

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

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

注意:使用缓存时一定是数据库中数据极少发生修改,更多用于查询这种情况

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

本地缓存:存在应用服务器内存中的数据称之为本地缓存 (local cache)
分布式缓存:存储在当前应用服务器内存之外数据称之为分布式缓存(distribute cache)
集群:将同一种服务的多个节点放在一起共同对系统提供服务过程称之为集群
分布式:有多个不同服务集群功能对系统提供服务这个系统称之为分布式系统(distribute system)


6.利用mybatis自身本地缓存结合redis实现分布式缓存
a.mybatis中应用级缓存(一级缓存) sqlsessionFactory 级别缓存 所有会话共享

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

在mapper.xml 中加一个标签<cache/> ---->这个是本地缓存(如:占用Tomcat服务器的内存空间)

开启缓存时也要注意对象需要实现序列化,不然会报错

本地缓存有一个问题:它会随着本地的jvm进程的结束,缓存就意味着断电,数据就会丢失,
所以每次重启或测试我们的应用程序它都会先去从数据库中获取,缓存才能使用

c.查看cache标签缓存实现

结论:mybatis底层默认使用的是:org.apache.ibatis.cache.impl.PerpetualCache实现

d.自定义rediscache实现
1. 通过mybatis默认cache源码得知 可以使用自定义cache类 implement cache接口 并对里面的方法进行实现

2.使用rediscache实现
<cache type="xxxx.RedisCache"/>


Redis分布式缓存(二)

1.缓存在项目中应用

a.如果项目中表查询之间没有任何关联查询使用现在这种缓存方式,没有任何问题

b.现有缓存方式在表连接查询过程中一定存在问题

2.在mybatis的缓存中如何解决关联关系时更新缓存信息的问题?

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


Redis分布式缓存(三)

1.缓存优化策略

对放入redis中的key进行优化:key的长度不能太长
-1381290908:1029299035:com.example.dao.UserDao.findOne:0:2147483647:select id,name,age,bir from t_user where id=?:1:SqlSessionFactoryBean

尽可能将key设计简洁一些?
算法:MD5 处理 加密
特点:
1.一切文件字符串等经过md5处理之后 都会生成32位16进制字符串
2.不同内容文件经过md5进行加密,加密结果一定不一致 aa.txt bb.txt ====> Md5文件进行加密就能判断里面内容是否一致
3.相当内容文件多次经过MD5生成结果始终一致

推荐!将redis整合mybatis过程中建议将key进行md5优化处理

2.面试相关概念

1).什么是缓存穿透(缓存击穿null值的问题)
定义:客户端查询了一个数据库中没有的数据记录导致缓存在这种情况下无法利用 称之为缓存穿透 或者缓存击穿 如:id=-1 | id=long类型的最大值+随机数 进行恶意攻击
mybatis中cache解决了缓存穿透:将数据库中没有查询到结果也进行缓存


2).什么是缓存雪崩
定义:在系统运行的某一时刻,突然系统中缓存全部消失,恰好在这一时刻涌来大量客户端请求,导致所有模块无法利用,大量请求涌向
数据库导致极端情况,数据库阻塞或挂起

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

解决方案:1.缓存永久存储(不推荐 占用内存) 2.针对于不同业务数据一定要设置不同的超时时间

原文地址:https://www.cnblogs.com/pmbb/p/14086701.html