1. 添加依赖

 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.0.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>

2. 创建测试类

import com.neo.model.User;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import java.util.Random;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.test.context.junit4.SpringRunner;import java.util.concurrent.TimeUnit;
import org.springframework.util.StringUtils;@RunWith(SpringRunner.class)
@SpringBootTest
public class TestRedis {@Autowiredprivate RedisTemplate redisTemplate;/*** 从数据库中获取数据** @return*/public String queryFromDB() {return "";}/*** 缓存穿透:是指用户查询数据,在数据库没有,自然在缓存中也不会有。这样就导致用户查询的时候,* 在缓存中找不到对应key的value,每次都要去数据库再查询一遍,然后返回空(相当于进行了两次 无用的查询)。这样请求就绕过缓存直接查数据库。* <p>* 解决方案:缓存空值,如果一个查询返回的数据为空(不管是数据不存在,还是系统故障)我们仍然把这个空结果进行缓存,* 但它的过期时间会很短,最长不超过五分钟。 通过这个直接设置的默认值存放到缓存,这样第二次到缓冲中获取就有值了,而不会继续访问数据库。* <p>*/@Testpublic String testCachePenetration() {ValueOperations<String, String> ops = redisTemplate.opsForValue();//1、从缓存中读取数据String s = ops.get("Jessie");if (StringUtils.isEmpty(s)) {//2、模拟从数据库中读取数据String sFromDB = queryFromDB();if (StringUtils.isEmpty(sFromDB)) {//库中没有此数据,存入一个空值,过期时间为5分钟ops.set("Jessie", "", 5, TimeUnit.MINUTES);//返回数据,我这里是测试方法,所以返回空,return "";} else {ops.set("Jessie", sFromDB);return sFromDB;}}return "";}/*** 缓存雪崩:如果缓存集中在一段时间内失效,发生大量的缓存穿透,所有的查询都落在数据库上,造成了缓存雪崩。* 由于原有缓存失效,新缓存未存储,期间所有原本应该访问缓存的请求都去查询数据库了,而对数据库CPU 和内存造成巨大压力,* 严重的会造成数据库宕机。* <p>* 解决方案:设置不同的过期时间,让缓存失效的时间点尽量均匀。* <p>*/@Testpublic void testCacheAvalanche() {ValueOperations<String, String> ops = redisTemplate.opsForValue();//1、从缓存中读取数据String s = ops.get("Jessie");if (StringUtils.isEmpty(s)) {//2、模拟从数据库中读取数据String sFromDB = queryFromDB();if (StringUtils.isEmpty(sFromDB)) {//库中没有此数据,解决缓存穿透问题,存入一个空值,过期时间为5分钟ops.set("Jessie", "", 5, TimeUnit.MINUTES);//返回数据,我这里是测试方法,所以返回空,return;} else {//将数据写入缓存,并设置一个随机的过期时间,解决缓存雪崩问题//生成5-15之间的一个随机数,设置缓存随机在5-15个小时内过期Random random = new Random();int randomNum = random.nextInt(10) + 5;ops.set("Jessie", sFromDB, randomNum, TimeUnit.HOURS);return;}}//缓存中有数据,直接返回return;}/*** 缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,* 又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力。* <p>* 解决方案:加互斥锁,保证同一时刻,只能有一个线程去访问数据库。类似线程安全的懒汉单例模式实现。*/@Testpublic void testRedis() {ValueOperations<String, String> ops = redisTemplate.opsForValue();//1、从缓存中读取数据String s = ops.get("Jessie");if (StringUtils.isEmpty(s)) {//2、缓存中没有,读取数据库加锁synchronized (this) {//获取到锁之后,第一个进来的线程,把数据存入缓存,后面得到锁的线程需要判断缓存中有没有数据// 避免缓存击穿时,大量请求访问数据库String sFormCache = ops.get("Jessie");if (!StringUtils.isEmpty(sFormCache)) {//缓存中有数据,直接返回数据,我这里是测试方法,就返回null了。} else {//缓存中没有时,再去数据库中读取数据,模拟从数据库中读取数据String sFromDB = queryFromDB();if (StringUtils.isEmpty(sFromDB)) {//库中没有此数据,解决缓存穿透问题,存入一个空值,过期时间为5分钟ops.set("Jessie", "", 5, TimeUnit.MINUTES);} else {//将数据写入缓存,并设置一个随机的过期时间,避免缓存雪崩问题//生成5-15之间的一个随机数,设置缓存随机在5-15个小时内过期Random random = new Random();int randomNum = random.nextInt(10) + 5;ops.set("Jessie", sFromDB, randomNum, TimeUnit.HOURS);}}}}}}

redis实战(12):Redis性能监控指标汇总相关推荐

  1. Redis性能监控指标汇总

    监控指标 性能指标:Performance 内存指标: Memory 基本活动指标:Basic activity 持久性指标: Persistence 错误指标:Error 性能指标:Performa ...

  2. 面试官:Redis熟悉吗?谈谈Redis都有哪些性能监控指标

    点击关注公众号,实用技术文章及时了解 来源:blog.51cto.com/yht1990/2503819 监控指标 性能指标:Performance 内存指标: Memory 基本活动指标:Basic ...

  3. mysql性能监控指标_mysql性能监控指标

    mysql性能监控指标1.系统mysql的进程数 ps-ef | grep "mysql" | grep -v "grep" |wc –l2.Slave_run ...

  4. redis(二)redis实战 使用redis进行文章的排序

    2019独角兽企业重金招聘Python工程师标准>>> http://www.beckbi.cn/?p=172 redis实战使用redis进行文章的排序 转载于:https://m ...

  5. 机器学习性能评估指标汇总

    机器学习性能评估指标汇总 Accuracy:准确率 Precision:精确率 / 查准率 Recall:召回率 / 查全率 F1 score:F1 值 PR:查准率.查全率曲线 ROC:真正率.假正 ...

  6. Jmeter(十八):硬件性能监控指标

    硬件性能监控指标 一.性能监控初步介绍 性能测试的主要目标 1.在当前的服务器配置情况,最大的用户数 2.平均响应时间ART,找出时间较长的业务 3.每秒事务数TPS,服务器的处理能力 性能测试涉及的 ...

  7. Redis实战之Redis + Jedis

    用Memcached,对于缓存对象大小有要求,单个对象不得大于1MB,且不支持复杂的数据类型,譬如SET 等.基于这些限制,有必要考虑Redis! 相关链接: Redis实战 Redis实战之Redi ...

  8. Redis实战 - 09 Redis BitMaps 实现用户签到,统计签到次数,统计签到情况等功能

    文章目录 1. 需求分析 2. 设计思路 3. 用户签到和统计连续签到的次数 1. 签到控制层 SignController 2. 签到业务逻辑层 SignService 3. 测试 4. 按月统计用 ...

  9. 磁盘 I/O 性能监控指标和调优方法

    在介绍磁盘 I/O 监控命令前,我们需要了解磁盘 I/O 性能监控的指标,以及每个指标的所揭示的磁盘某方面的性能.磁盘 I/O 性能监控的指标主要包括: 指标 1:每秒 I/O 数(IOPS 或 tp ...

最新文章

  1. Demo4 Slides.js的使用
  2. 祝贺中国队夺得第十届苏迪曼杯冠军!
  3. 解决java前后端分离端口跨域问题
  4. VS2010 VS2012 的快捷键
  5. 联想android手机驱动,驱动天空 - 手机驱动 - 联想手机 lenovo
  6. Fuchsia 对 Android 到底意味着什么?
  7. sjms-2 创建型模式
  8. 413 Request Entity Too Large
  9. CodeForces - 484E Sign on Fence(主席树区间合并+二分)
  10. Spark精华问答 | Spark的计算方法是什么?
  11. 威马EX6 Plus探险之旅!房山郊区竟藏着个1万平超大废弃矿洞?
  12. 算法熟记-排序系列-归并排序
  13. 限时删!我亲自整理一套目标检测、卷积神经网络和OpenCV学习资料(教程/PPT/代码)...
  14. js判断移动端或是pc端
  15. 杭电HDUacm2098
  16. 一个简单的HTML5后台登陆界面及登录实现
  17. win10无线断开无法连接服务器,win10wifi自动断开什么原因_win10wifi自动断开且无法连接如何解决...
  18. 每日一学20——凉鞋的简易消息机制
  19. 如何搭建短信中心号码服务器,短信中心号码怎么设置?设置短信中心号码两种方法介绍...
  20. python 常用股票走势图绘制

热门文章

  1. python AIOT教程一1.必备多元函数微分学理论基础
  2. 网络水军第一课:手写自动弹幕
  3. 2016年中国智能手机市场发展趋势研究
  4. makefile和make
  5. tomcat发布前端项目
  6. 【花雕动手做】有趣好玩的音乐可视化系列小项目(17)--光导纤维灯
  7. SQL server-数据库的查询(初级)
  8. 2019各大互联网公司产品校招笔试
  9. 变频空调和定频空调的区别
  10. 认识Hive,以及Hive的数据定义与数据操作,hive的数据查询和hive函数