目录
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解决首页并发问题
- 用户第一次请求到redis
- 如果redis没有数据,redis会请求mysql
- mysql会把数据返回给用户,同时会传到redis上
- 第二次用户访问时,redis有数据,就不需要访问mysql。节省时间,降低消耗
1、缓存使用的简单设计
- 连接缓存
- 查询缓存
- 如果缓存没有,查询mysql
- 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数据库的数据