Featured image of post Redis缓存实战教程

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里)

 

1
2
3
4
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
</dependency>

创建两个类RedisConfig和RedisUtil

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

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

RedisUtil

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
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

 

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@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配置,否则不会进行注入

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

代码

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 /**
     * 从数据库调用
     *
     * @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数据库中的数据。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/**
     * 商品详细图
     * 主要是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数据库的数据

 

未来的你,会感谢今天仍在努力奋斗的你