1.在Linux下安装Redis,启动Redis服务
-
引入Redis的Java客户端
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency>
-
在application.properties中配置redis的基本信息
(在配置类中使用@Value注解获取这些配置属性)
spring.redis.host=192.168.163.211
spring.redis.port=6379
spring.redis.database=0
- 编写Redis工具类
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;
}
}
- 编写RedisConfig配置类将RedisUtil注入到容器中
@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;
}
}
- ServiceImpl方法中Redis的使用
(引入了分布式缓存锁防止高并发下Redis并击穿直接访问数据库导致数据库宕机的)
@Override
public SkuInfo item(String skuId) {
SkuInfo skuInfo = null;
//从缓存中取出sku的数据
Jedis jedis = redisUtil.getJedis();
String skuInfoStr = jedis.get("sku:" + skuId + ":info");
skuInfo = JSON.parseObject(skuInfoStr, SkuInfo.class);
//如果缓存中没有数据时,则去访问数据库
if (skuInfo == null) {
//设置分布式锁(在Redis缓存在高并发下宕机后,为了防止多请求访问数据库导致数据库宕机,则设置分布式锁)
String OK = jedis.set("sku:" + skuId + ":lock", "1", "nx");
//如果返回的OK为null的话则存在分布式锁,如果不为null,则设置分布式锁成功
if (StringUtils.isBlank(OK)){
//分布式锁被占用,设置一定时间线程睡眠时间,等时间过后再次请求
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//自旋(递归的访问过程,不会开启新的线程)
return item(skuId);
}else {
//拿到分布式锁,可以访问数据库
skuInfo = itemFromDB(skuId);
}
jedis.del("sku:" + skuId + ":lock");
//同步缓存到Redis
jedis.set("sku:" + skuId + ":info", JSON.toJSONString(skuInfo));
}
jedis.close();
return skuInfo;
}
注:使用Redis进行业务开发
Redis使用的规范:Redis Key的命名规范,由于Redis不像数据库那样有结构,其所以的数据全
key进行索引,所以Redis数据的可读性,全依靠key.
企业中最常用的方式就是:object:id:field
比如:sku:1314:info; user:1092:password;