• Redis缓存实战教程


    目录

     

    Redis缓存

    使用缓存Redis解决首页并发问题

    1、缓存使用的简单设计

    2、Redis的整合步骤

    A 将Redis整合到项目中(Redis+Spring)

    B 设计一个数据存储策越

    3、Redis的整合过程

     

    1、引入pom依赖信息(将本工程所有的Redis统一放入service-util里)

    2、写一个Redis的工具类(用来将Redis的池初始化到spring容器)

    3、写一个spring整合Redis的配置类

    4、每隔引用工程引入service-util后,单独配置只能的redis的配置文件

     

    代码

    查询结果

    查看Redis数据库的数据

     


    Redis缓存

    重点要讲的是另外一个层面:尽量避免直接查询数据库。

    解决办法就是:缓存

    缓存可以理解是数据库的一道保护伞,任何请求只要能在缓存中命中,都不会直接访问数据库。而缓存的处理性能是数据库10-100倍。

    使用缓存Redis解决首页并发问题

    1. 用户第一次请求到redis
    2. 如果redis没有数据,redis会请求mysql
    3. mysql会把数据返回给用户,同时会传到redis上
    4. 第二次用户访问时,redis有数据,就不需要访问mysql。节省时间,降低消耗

    1、缓存使用的简单设计

    1. 连接缓存
    2. 查询缓存
    3. 如果缓存没有,查询mysql
    4. mysql查询结果存入redis

    2、Redis的整合步骤

    A 将Redis整合到项目中(Redis+Spring)

    B 设计一个数据存储策越

    企业中的存储策越(核心是:如何设计k)

    数据对象名:数据对象id:对象属性

    User:123:password 用户ID为123的密码

    User:123:userename 用户ID为123的名字

    3、Redis的整合过程

     

    1、引入pom依赖信息(将本工程所有的Redis统一放入service-util里)

    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
    </dependency>

    创建两个类RedisConfig和RedisUtil

    RedisConfig负责在spring容器启动时自动注入,而RedisUtil就是被注入的工具类以供其他模块调用。

    2、写一个Redis的工具类(用来将Redis的池初始化到spring容器)

    RedisUtil

    public class RedisUtil {
    
        private  JedisPool jedisPool;
    
        public void initPool(String host,int port ,int database){
            JedisPoolConfig poolConfig = new JedisPoolConfig();
            poolConfig.setMaxTotal(200);
            poolConfig.setMaxIdle(30);
            poolConfig.setBlockWhenExhausted(true);
            poolConfig.setMaxWaitMillis(10*1000);
            poolConfig.setTestOnBorrow(true);
            jedisPool=new JedisPool(poolConfig,host,port,20*1000);
        }
    
        public Jedis getJedis(){
            Jedis jedis = jedisPool.getResource();
            return jedis;
        }
    
    }

    3、写一个spring整合Redis的配置类

    将Redis的链接池创建到spring的容器中

    RedisConfig

    @Configuration
    public class RedisConfig {
    
        //读取配置文件中的redis的ip地址
        @Value("${spring.redis.host:disabled}")
        private String host;
    
        @Value("${spring.redis.port:0}")
        private int port;
    
        @Value("${spring.redis.database:0}")
        private int database;
    
        @Bean
        public RedisUtil getRedisUtil(){
            if(host.equals("disabled")){
                return null;
            }
            RedisUtil redisUtil=new RedisUtil();
            redisUtil.initPool(host,port,database);
            return redisUtil;
        }
    
    }

    4、每隔引用工程引入service-util后,单独配置只能的redis的配置文件

     

    Service-util的配置文件没有作用

    同时,任何模块想要调用redis都必须在application.properties配置,否则不会进行注入

    #Redis配置
    //读取配置文件中的redis的ip地址
    spring.redis.host=192.168.1.111
    #Redis端口号
    spring.redis.port=6379
    #数据库
    spring.redis.database=0

    代码

    这是从数据库调用mysql,查询数据

     /**
         * 从数据库调用
         *
         * @param skuId
         * @return
         */
        public PmsSkuInfo getSkuByIdFromDb(String skuId) {
            //sku的商品对象
            PmsSkuInfo pmsSkuInfo = new PmsSkuInfo();
            pmsSkuInfo.setId(skuId);
            PmsSkuInfo skuInfo = pmsSkuInfoMapper.selectOne(pmsSkuInfo);
    
            try {
                //sku的图片集合
                PmsSkuImage pmsSkuImage = new PmsSkuImage();
                List<PmsSkuImage> pmsSkuImages = pmsSkuImageMapper.select(pmsSkuImage);
                skuInfo.setSkuImageList(pmsSkuImages);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return skuInfo;
    
        }

    这个是Redis的代码,判断redis中是否有数据,

    如果没有,就调用上面的代码,查询mysql数据库。返回结果,在写入redis数据库中。

    如果有,直接调用redis数据库中的数据。

    /**
         * 商品详细图
         * 主要是item前端的东西,调用此处的服务,方便
         * 使用Redis缓存,解决高并发
         *
         * @param skuId
         * @return
         */
        @Override
        public PmsSkuInfo getSkuById(String skuId) {
    
            PmsSkuInfo pmsSkuInfo = new PmsSkuInfo();
    
            //链接缓存
            Jedis jedis = redisUtil.getJedis();
    
            //查询缓存
            String skuKey = "sky:" + skuId + ":info";
            String skuJson = jedis.get("skuKey");
            //可以吧json的字符串转换成jav的对象类
            if (StringUtils.isNotBlank(skuJson)) {// if (skuJson!=null&&!skuJson.equals(""))
                pmsSkuInfo = JSON.parseObject(skuJson, PmsSkuInfo.class);
            } else {
                //如果缓存没有,查询mysql
                pmsSkuInfo = getSkuByIdFromDb(skuId);
    
                if (pmsSkuInfo != null) {
                    //mysql查询结果存入redis
                    jedis.set("sku" + skuId + ":info", JSON.toJSONString(pmsSkuInfo));
                }
            }
    
    
            jedis.close();
    
            return pmsSkuInfo;
        }

    查询结果

    查看Redis数据库的数据

     

  • 相关阅读:
    软件工程敏捷开发06
    学习进度条
    软件工程敏捷开发05
    软件工程敏捷开发04
    敏捷开发用户场景分析
    软件工程敏捷开发03
    软件工程敏捷开发02
    软件工程敏捷开发01
    面向对象程序设计(一)
    Java介绍、环境的搭建及结构化程序
  • 原文地址:https://www.cnblogs.com/heian99/p/11972238.html
Copyright © 2020-2023  润新知