redis学习系列--Redis 高并发下的,缓存穿透问题解决方案

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/baidu_41669919/article/details/82290907

下面这段代码 如果1W个人同时访问的话,  从redis 拿 allUser 时, userList为空时,那么1W个人都要进入if判断语句,查询数据库,数据库压力承受不住

package com.tb.service;
 
import com.tb.dao.TUserMapper;
import com.tb.pojo.TUser;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
 
import javax.annotation.Resource;
import java.util.List;
 
@Service
@Transactional
public class TuserServicelmpl implements  TuserService {
 
    @Resource
    private TUserMapper  tUserMapper;
 
    @Resource
    private RedisTemplate  redisTemplate;
 
    @Override
    public List<TUser> userlist() {
 
        //高并发下有点问题,此处问题:缓存穿透
        //查询缓存
        List<TUser>  userList =  ( List<TUser>) redisTemplate.opsForValue().get("allUser");
        if (userList==null){
            //查询数据库
            userList =  tUserMapper.userlist();
            redisTemplate.opsForValue().set("allUser",userList);
        }
        return userList;
    }
}

解决方案

     Synchronized   关键字

双重检测锁 解决

package com.tb.service;
 
import com.tb.dao.TUserMapper;
import com.tb.pojo.TUser;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
 
import javax.annotation.Resource;
import java.util.List;
 
@Service
@Transactional
public class TuserServicelmpl implements  TuserService {
 
    @Resource
    private TUserMapper  tUserMapper;
 
    @Resource
    private RedisTemplate  redisTemplate;
 
    @Override
    public List<TUser> userlist() {
 
        //高并发下有点问题,此处问题:缓存穿透
        //查询缓存
        List<TUser>  userList =  ( List<TUser>) redisTemplate.opsForValue().get("allUser");
 
        //双重检测锁
        if (userList==null){
            synchronized(this){
                //从数据库获取数据
                userList =  ( List<TUser>) redisTemplate.opsForValue().get("allUser");
                if (userList==null){
                    //缓存为空,查询数据库
                    userList =  tUserMapper.userlist();
                    redisTemplate.opsForValue().set("allUser",userList);
                }
            }
 
 
        }
        return userList;
    }
}

猜你喜欢

转载自blog.csdn.net/baidu_41669919/article/details/82290907