Redis深度历险:核心原理和应用实践

  • 更新时间:
  • 3986人关注
  • 点击下载

这是一个不错的Redis类学习资源,由郜英勋提供,主要知识点是关于Redis深度历险、核心原理、应用实践、Redis进阶、Redis的内容,已被327人关注,同类资源中评分为9.7分。

资源详情相关推荐
  • 大小:4.5 MB
  • 类别:Redis
  • 格式:PDF
  • 编辑:许妙珍
  • 热度:158
  • Redis 4.x Cookbook
  • Redis开发运维实践指南
  • 史上最全Redis面试题及答案大全
  • Redis 4.x Cookbook
  • Netty、Redis、Zookeeper高并发实战
  • Redis深度历险这本书的口碑不言而喻,本文档来源自此书,该资源是高清PDF,聚焦Redis实战,探究Redis源码与核心原理,对系统学习redis有很大帮助,喜欢的朋友可下载试试!

    总共分为基础和应用篇、原理篇、集群篇、拓展篇、源码篇共 5 大块内容。基础和应用篇讲解对读者来说有价值的内容,可以直接应用到实际工作中;原理篇、集群篇让开发者透过简单的技术表面看到精致的底层世界;拓展篇帮助读者拓展技术视野和夯实基础,便于进阶学习;源码篇让高阶的读者能够读懂源码,掌握核心技术实力。

    本教程适合有Redis 基础,渴望深度掌握 Redis 技术原理的中高级后端开发者;渴望成功进入大型互联网企业研发部的中高级后端开发者;需要支撑公司 Redis 中间件运维工作的初中级运维工程师;对 Redis 中间件技术好奇的中高级前端技术研究者。

    内容

    开篇:授人以鱼不若授人以渔一Redis 可以用来做什么?
    基础:万丈高楼平地起
    应用系列
    原理系列
    集群
    拓展
    源码

    精选笔记:springboot中redis的缓存穿透问题实现

    22小时39分钟前回答

    什么是缓存穿透问题??

    我们使用redis是为了减少数据库的压力,让尽量多的请求去承压能力比较大的redis,而不是数据库。但是高并发条件下,可能会在redis还没有缓存的时候,大量的请求同时进入,导致一大批的请求直奔数据库,而不会经过redis。使用代码模拟缓存穿透问题如下:

    首先是service里面的代码:

    @Service
    public class NewsService {
      @Autowired
      private NewsDAO newsDAO;
    
      //springboot自动初始化,不需要我们进行配置,直接注入到代码中使用
      @Autowired
      private RedisTemplate<Object,Object> redisTemplate;
    
      public /*synchronized*/ List<News> getLatestNews(int userId,int offset,int limit){
    
        //设置序列化方式,防止乱码
        redisTemplate.setKeySerializer(new StringRedisSerializer());
    
        //第一步:查询缓存
        News news= (News) redisTemplate.opsForValue().get("newsKey");
        //判断是否存在缓存
        if(null == news){//查询数据库
            news = newsDAO.selectByUserIdAndOffset(userId,offset,limit).get(0);
            //
            redisTemplate.opsForValue().set("newsKey",news);
    
            System.out.println("进入数据库。。。。。。。。");
          
        }else{
          System.out.println("进入缓存。。。。。。。。。");
        }
        return newsDAO.selectByUserIdAndOffset(userId,offset,limit);
    
      }
    }

    然后是使用线程池在Controller里面对请求进行模拟:

    @Controller
    public class HomeController {
      @Autowired
      UserService userService;
    
      @Autowired
      NewsService newsService;
    
      //遇到的坑,如果不加method,页面启动不起来。
      @RequestMapping(value = "/home",method = {RequestMethod.GET, RequestMethod.POST})
      @ResponseBody
      public String index(Model model){
        //这边是可以读出数据来的
    
        //线程池------缓存穿透问题的复现
        ExecutorService executorService = Executors.newFixedThreadPool(8*2);
    
        for(int i = 0;i < 50000;i++){
          executorService.submit(new Runnable() {
            @Override
            public void run() {
              List<News> newsList = newsService.getLatestNews(0,0,10);
            }
          });
        }
    
        List<News> newsList = newsService.getLatestNews(0,0,10);
        News news=newsList.get(0);
        return news.getImage();
      }
    }

    结果如图:大量的请求进入数据库,那么如何解决这个问题?

    方法一、在方法上加锁:

    @Service
    public class NewsService {
      @Autowired
      private NewsDAO newsDAO;
    
      //springboot自动初始化,不需要我们进行配置,直接注入到代码中使用
      @Autowired
      private RedisTemplate<Object,Object> redisTemplate;
    
      //第一种方式:方法加锁
      public synchronized List<News> getLatestNews(int userId,int offset,int limit){
    
        //设置序列化方式,防止乱码
        redisTemplate.setKeySerializer(new StringRedisSerializer());
    
        //第一步:查询缓存
        News news= (News) redisTemplate.opsForValue().get("newsKey");
        //判断是否存在缓存
        if(null == news){
    //查询数据库
            news = newsDAO.selectByUserIdAndOffset(userId,offset,limit).get(0);
            //
            redisTemplate.opsForValue().set("newsKey",news);
    
            System.out.println("进入数据库。。。。。。。。");
    
        }else{
          System.out.println("进入缓存。。。。。。。。。");
        }
    
    
        return newsDAO.selectByUserIdAndOffset(userId,offset,limit);
    
      }
    }
    
    

     直接在方法上加锁,保证每次只有一个请求可以进入。但是这个方法存在一个缺陷,每次只有一个请求可以进入,请求处理的速度变得相当的慢,不利于系统的实时性。

    方法二、使用双重校验锁:

    @Service
    public class NewsService {
      @Autowired
      private NewsDAO newsDAO;
    
      //springboot自动初始化,不需要我们进行配置,直接注入到代码中使用
      @Autowired
      private RedisTemplate<Object,Object> redisTemplate;
    
      //第一种方式:方法加锁
      public /*synchronized*/ List<News> getLatestNews(int userId,int offset,int limit){
    
        //设置序列化方式,防止乱码
        redisTemplate.setKeySerializer(new StringRedisSerializer());
    
        //第一步:查询缓存
        News news= (News) redisTemplate.opsForValue().get("newsKey");
        //判断是否存在缓存
        if(null == news){
    
          //第二种方式:双重检测锁
          synchronized (this){
            //查询数据库
            news = newsDAO.selectByUserIdAndOffset(userId,offset,limit).get(0);
            //
            redisTemplate.opsForValue().set("newsKey",news);
    
            System.out.println("进入数据库。。。。。。。。");
          }
    
        }else{
          System.out.println("进入缓存。。。。。。。。。");
        }
    
    
        return newsDAO.selectByUserIdAndOffset(userId,offset,limit);
    
      }
    }
    
    

    这个方法比较好,虽然不能保证只有一个请求请求数据库,但是当第一批请求进来,第二批之后的所有请求全部会在缓存取数据。

    到此这篇关于springboot中redis的缓存穿透问题实现的文章就介绍到这了,更多相关springboot redis缓存穿透内容请搜索码农之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持码农之家!

    相关声明:

    Redis深度历险:核心原理和应用实践下载资源由用户 聂明达 于 2021-10-08 15:34:26 分享至百度网盘。仅供想学习Redis的网友交流使用,专题参考:Redis,

    相关资源

    • Redis实战

      Redis实战

      Redis实战 深入浅出地介绍了Redis的5种数据类型,并通过多个实用示例展示了Redis的用法。除此之外,书中还讲述了Redis的优化方法以及扩展方法,是一本对于学习和使用 Redis 来说不可多得的参考

      大小:60.7 MBRedis 实战

      立即下载
    • Redis 命令参考 2019

      本文档是 Redis Command Reference 和 Redis Documentation 的中文翻译版, 阅读这个文档可以帮助你了解 Redis 命令的具体使用方法, 并学会如何使用 Redis 的事务、持久化、复制、Sentinel、集群等功能。

      大小:2.63 MBRedis命令

      立即下载
    • Redis开发与运维

      Redis开发与运维

      本书全面讲解Redis基本功能及其应用,并结合线上开发与运维中的实际案例,深入分析并总结了实际工作中遇到的“陷阱”,以及背后的原因,包含大规模集群开发与管理的场景、应用案例与开发技巧,为高效开发运维提供了大量实际经验和建议。本书不要求读者有任何Redis使用经验,对入门与进阶DevOps的开发者提供有价值的帮助。主要内容包括:Redis的安装配置、API、各种高效功能、客户端、持久化、复制、高可用、内存、哨兵、集群、缓存设计等,R

      大小:236 MBRedis

      立即下载
    • Redis深度历险:核心原理与应用实践

      Redis深度历险:核心原理与应用实践

      Redis 是互联网技术领域使用*为广泛的存储中间件,以其超高的性能、完美的文档、简洁易懂的源码和丰富的客户端库支持在开源中间件领域广受好评。

      大小:133.2 MBRedis

      立即下载
    • 左手MongoDB右手Redis:从入门到商业实战

      左手MongoDB右手Redis:从入门到商业实战

      本书配有同步教学视频。能帮助读者快速而全面地了解每章的内容。本书针对MongoDB和Redis这两个主流的NoSQL数据库编写,采用“理论 实践”的形式编写,共计45个实例。

      大小:26.38 MB数据挖掘

      立即下载
    • 深入理解Redis

      深入理解Redis

      大小:105.1 MBRedis

      立即下载
    • Java EE互联网轻量级框架整合开发:SSM框架和Redis实现

      Java EE互联网轻量级框架整合开发:SSM框架和Redis实现

      随着移动互联网的兴起,以Java技术为后台的互联网技术占据了市场的主导地位,而在Java互联网后台开发中,SSM框架(Spring Spring MVC MyBatis)成为了主要架构,《 Java EE互联网轻量级框架整合开发

      大小:489.1 MBJavaEE

      立即下载

    学习笔记

    4小时29分钟前回答

    通过RedisTemplate连接多个Redis过程解析

    前言 在集群环境的情况下连接多个Redis数据库是很正常的情况,因为平时都是使用本地环境的单Redis情况比较多,在这里用代码总结一下连接多个数据库的情况(主要是不同ip,同一个ip的不通数据库修改不通地方即可),这里还是使用的springboot提供的spring-boot-starter-data-redis工具包,具体介绍如下: 1.引入redis相关的jar parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version1.5.6.RELEASE/version /parent dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-data-redis/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-test/artifactId /dependency dependency group……

    19小时7分钟前回答

    django框架用户权限中的session缓存到redis中的方法

    django框架默认将session保存到数据库中,在高并发访问无疑会影响服务器性能,因此最好将session保存到redis中避免直接从数据库中读取session数据 settings.py中配置如下: #配置redisCACHES = { 'default': { 'BACKEND': 'redis_cache.RedisCache', 'LOCATION': '127.0.0.1:6379', 'OPTIONS': { 'DB': 0, 'PASSWORD': 'abxdcfgda', 'PARSER_CLASS': 'redis.connection.HiredisParser', # 'PICKLE_VERSION': 2, #'CONNECTION_POOL_CLASS': 'redis.ConnectionPool', 'SOCKET_TIMEOUT': 10, #'CONNECTION_POOL_CLASS_KWARGS': { # 'max_connections': 2, # } }, },}SESSION_COOKIE_AGE=30 * 60 #设置session过期时间为30分钟'''配置session引擎SESSION_ENGINE为redis,配置此处session会存储在redis中,不会再去操作数据库了'''SESSION_ENGINE = 'django.contri……

    22小时53分钟前回答

    基于Redis实现分布式应用限流的方法

    限流的目的是通过对并发访问/请求进行限速或者一个时间窗口内的的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务。 前几天在DD的公众号,看了一篇关于使用 瓜娃 实现单应用限流的方案 --》原文,参考《redis in action》 实现了一个jedis版本的,都属于业务层次限制。 实际场景中常用的限流策略: Nginx接入层限流 按照一定的规则如帐号、IP、系统调用逻辑等在Nginx层面做限流 业务应用系统限流 通过业务代码控制流量这个流量可以被称为信号量,可以理解成是一种锁,它可以限制一项资源最多能同时被多少进程访问。 代码实现 import redis.clients.jedis.Jedis;import redis.clients.jedis.Transaction;import ……