什么是缓存:缓存就是数据交换的缓冲区(称作Cache),当某一硬件要读取数据时,会首先从缓存中查找需要的数据,如果找到了则直接执行,找不到的话则从内存中找。由于缓存的运行速度比内存快得多,故缓存的作用就是帮助硬件更快地运行,缓存数据存放内存条
什么是java内置缓存:将数据存放在jvm中,关闭服务,则缓存数据清空,可以用一个static Map 来实现一个简单的java缓存:
package com.example.demo;
import java.util.HashMap;
import java.util.Map;
public class MapCache {
public static Map map = new HashMap<>();
public void mapAdd(Object key, Object value) {
map.put(key, value);
}
public Object get(Object key) {
return map.get(key);
}
}
缓存中有了解到的有:(springboot中使用ehcache 只能单服务器使用)
- Oscache
OSCache由OpenSymphony设计,它是一种开创性的JSP定制标记应用,提供了在现有JSP页面之内实现快速内存缓冲的功能(mybatis 二级缓存机制使用oscache) - EhCache
EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider(hibernate二级缓存机制使用ehcache)
OsCache与EhCache区别
ehcache 主要是对数据库访问的缓存,相同的查询语句只需查询一次数据库,从而提高了查询的速度,使用spring的AOP可以很容易实现这一功能。
oscache 主要是对页面的缓存,可以整页或者指定网页某一部分缓存,同时指定他的过期时间,这样在此时间段里面访问的数据都是一样的。
java内置缓存缺点:内存溢出(static修饰),没有持久化(重启以后数据清空丢失),jvm缓存在多态服务器的时候不能数据共享,线程安全问题(多个线程操作共享变量的时候 都可能出现)
使用jvm缓存 存在很多缺陷 推荐使用Nosql(非关系型数据库) 项目中 使用的是redis,其余小组用的是mogodb
- 什么是Nosql:NoSQL 是 Not Only SQL 的缩写,意即"不仅仅是SQL"的意思,泛指非关系型的数据库。强调Key-Value Stores和文档数据库的优点,而不是单纯的反对RDBMS。NoSQL产品是传统关系型数据库的功能阉割版本,通过减少用不到或很少用的功能,来大幅度提高产品性能
- NoSQL产品: Redis、mongodb Membase、HBase
- 产品比较:
Redis 与Membase区别
Redis支持数据的持久化,可以将数据存放在硬盘上。
Memcache不支持数据的之久存储。
Redis数据类型丰富,支持set liset等类型
Memcache支持简单数据类型,需要客户端自己处理复制对象
什么是redis: Redis是一种开源(BSD许可)、内存中的数据结构存储,用作数据库、缓存和消息代理。它支持数据结构,如字符串、散列、列表、集合、带范围查询的排序集、位图、超loglogs、带半径查询的地理空间索引和流。Redis具有内置的复制、Lua脚本、LRU退出、事务和不同级别的磁盘持久性,并通过Redis Sentinel和使用Redis集群的自动分区提供高可用性。
Redis
Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。
Redis 与其他 key - value 缓存产品有以下三个特点:
Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
Redis支持数据的备份,即master-slave模式的数据备份。
Redis应用场景
主要能够体现 解决数据库的访问压力。
例如:短信验证码时间有效期、session共享解决方案
Redis优势
性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
Redis与其他key-value存储有什么不同?
Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。
Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。
redis的下载和安装(先说windows版本的):
- https://redis.io/download或者https://github.com/MicrosoftArchive/redis/releases
- 下载解压以后,新建批处理文件start.bat 启动内容 redis-server.exe redis.windows.conf
-
启动成功,默认断山口6379 以上启动不是后台启动,关闭窗口 则直接关闭 redis了
- 测试 redis 在redis目录下找到redis-cli.exe 文件 双击 启动
- 修改密码 可以在redis.windows.conf文件中修改 自己所需要的密码 (注意不要有空格)
- 登录密码 AUTH 密码 我的是 auth redis123 ok表示登录成功
-
测试添加 获取数据
-
windons下载安装测试redis 成功
- 分享关于缓存的一篇内容:原文:https://blog.csdn.net/zhengzhaoyang122/article/details/82184029
缓存穿透、缓存击穿、缓存雪崩和缓存刷新。
【1】、缓存穿透:缓存穿透是说收到一个请求,但是该请求缓存中不存在,只能去数据库中查询,然后放进缓存。但当有好多请求同时访问同一个数据时,业务系统把这些请求全发到了数据库;或者恶意构造一个逻辑上不存在的数据,然后大量发送这个请求,这样每次都会被发送到数据库,最总导致数据库挂掉。
解决的办法:对于恶意访问,一种思路是先做校验,对恶意数据直接过滤掉,不要发送至数据库层;第二种思路是缓存空结果,就是对查询不存在的数据也记录在缓存中,这样就可以有效的减少查询数据库的次数。非恶意访问,结合缓存击穿说明。
【2】、缓存击穿:上面提到的某个数据没有,然后好多请求查询数据库,可以归为缓存击穿的范畴:对于热点数据,当缓存失效的一瞬间,所有的请求都被下放到数据库去请求更新缓存,数据库被压垮。
解决的办法:防范此类问题,一种思路是加全局锁,就是所有访问某个数据的请求都共享一个锁,获得锁的那个才有资格去访问数据库,其他线程必须等待。但现在大部分系统都是分布式的,本地锁无法控制其他服务器也等待,所以要用到全局锁,比如Redis的setnx实现全局锁。另一种思想是对即将过期的数据进行主动刷新,比如新起一个线程轮询数据,或者比如把所有的数据划分为不同的缓存区间,定期分区间刷新数据。第二个思路与缓存雪崩有点关系。
【3】、缓存雪崩:缓存雪崩是指当我们给所有的缓存设置了同样的过期时间,当某一时刻,整个缓存的数据全部过期了,然后瞬间所有的请求都被抛向了数据库,数据库就崩掉了。
解决的办法:解决思路要么是分治,划分更小的缓存区间,按区间过期;要么给每个key的过期时间加一个随机值,避免同时过期,达到错峰刷新缓存的目的。
【4】、缓存刷新:既清空缓存 ,一般在insert、update、delete操作后就需要刷新缓存,如果不执行就会出现脏数据。但当缓存请求的系统蹦掉后,返回给缓存的值为null。