一、redis是什么?
redis 是一个key-value类型的高速存储数据库
redis常被用做 缓存 队列 发布 订阅等
二、redis怎么测试其实就是缓存怎么测试?
2.1 缓存的分类
文件缓存 数据库缓存 内存缓存 浏览器缓存
场景1:用户->访问浏览器页面->读取缓存文件
- 【浏览器缓存】css js等资源文件下载一次后缓存一段时间,直到缓存失败或请求明确告知需要更新
- 【文件缓存】后台编辑的文章和分类页面,更新缓存立即生成多个文件,前台访问的都是缓存文件,加快访问速度,减少服务器和数据库压力,通过后端语言直接渲染smarty等模板渲染方式输出界面的 一般会选文件类型缓存
场景2:用户->访问浏览器页面->加载前端资源->调用后端接口->读取缓存
- 【数据库缓存】前后端分离,对后端接口响应时间要求更高,这时候使用数据库缓存,常用redis和memcached,都属于分布式key-value高速缓存系统
场景3:用户->访问浏览器页面->加载前端资源->调用后端接口->读取内存缓存->读取redis缓存->读取db数据
- 【内存缓存】内存缓存比数据库缓存更快,但是内存有限易出现内存泄露问题,且技术栈有限,实际使用中,java会把高频数据塞到内存缓存中作为一级缓存,次高频放redis做二级缓存,最后才从db中去查询数据
2.2 缓存的作用
(快) 加快访问速度,从内存取出很快
(省) 节省数据处理流程和服务器的资源消耗,减少服务器和db压力
2.3缓存的使用场景
- 用在什么地方
- 缓存、数据共享分布式、分布式锁、全局 ID、计数器、限流、购物车、消息队列、抽奖、点赞、签到、打卡、排行榜、电商销售排行等场景。
- 什么时候使用
- qps较高、对RT响应速度有要求、服务器性能差、db性能较差——用来提升性能
场景1 微信我的状态:app中有缓存 调用app缓存,否则调用接口,接口调用内存缓存 ,不在内存缓存则读取redis缓存,再没有再查询数据库
场景2 服务器、db压力不大的不需要使用缓存
小型电商的商品管理后台列表页面,访问人数不多,sku改动频次很低,可能3天才被访问几十次。
这种场景一不需要使用缓存,二在商品信息被更新之后需要立即看到更新后的数据,不适合使用缓存,所以不建议使用缓存。
同样的电商管理后台,这次是一个统计页面,统计昨天/今天/近一周的商品销售情况。
这个场景可以分情况来看,有多种不同的解决方案。
(我们抛开大数据统计的各类技术方案,简单实现一个系统的统计功能)
a. 不需要实时统计,只需要定时统计一次即可,比如只看昨天一天统计数据:可以由定时脚本统计之后直接存储在db,需要查看统计数据时直接查询db即可
b. 需要查询实时统计数据,但需要查询的各个统计sql执行效率满足预期:每次查看数据直接查询db即可,此时db压力不大
2.4 缓存的生成方式
这是一个典型的MVC,由Controller接收和处理请求数据,由Service处理Model中获取的数据,再由View输出。
【外缓存】接口过滤,缓存有效时间设置短
针对请求参数多变,返回的数据如果跟请求参数强相关,适合在 请求参数过滤 之后,缓存查询到的数据。
这类数据一般缓存时间短,比如缓存5分钟。主要应对相同请求参数在短时间内的重复请求。
如果遇到请求攻击,即使这个缓存有效期只有1秒,也是很有效的,能挡住大量的请求。
【内缓存】 缓存有效时间可设置很长
针对请求参数变化不大, 返回的数据跟db中存储的数据很接近的情况, 适合在“里面”缓存数据, 也就是在更新db的同时更新缓存, 这种情况最优的状态下, 只需要读缓存就够了, 不需要跟db直接交互, 能大大缓解db压力。
获取和过滤请求参数这边异步代码处理多用户处理需要加互斥锁 否则会出现数据覆盖
2.5 缓存的更新方式
- 过期后自动更新:这是最懒的更新方式。通过设置缓存有效期,让缓存失效后通过新的请求自动创建新的缓存。
- 删除缓存:在更新db数据后,直接删除缓存,通过新的请求自动创建新的缓存。
- 重新设置缓存:在更新db数据后,直接重新设置缓存。