SpringBoot环境下Redis的使用

1.在Linux下安装Redis,启动Redis服务

  1. 引入Redis的Java客户端

    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
    </dependency>
    
  2. 在application.properties中配置redis的基本信息
    (在配置类中使用@Value注解获取这些配置属性)

       spring.redis.host=192.168.163.211
       spring.redis.port=6379
       spring.redis.database=0
  1. 编写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;
    }
}
  1. 编写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;
    }
}
  1. 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;

猜你喜欢

转载自blog.csdn.net/qq_38697437/article/details/86533318