1、在高并发的场景下本应该查询缓存的,都去查询数据库了
情况1例如:
if (!map.isEmpty()) { // 将查询结果放入缓存。 redisClientTemplate.set("testfuncid",(Serializable) map,-1); remap = map; } else { logger.error("Exception->AreaRegonServiceImpl-->getAreaRegonMap-->map is null"); }
此种情况下在高并发的情况下,多个进程会同时访问数据库并向redis放数据
情况1解决的办法是添加关键字
1、synchronized (效率太低了)
2、双重检测的添加
String userFuncMapKey = ConstantConfig.USER_FUNC_MAP_KEY; // 获取缓存 Map<String, List> remap = (Map<String, List>)redisClientTemplate.get("testfuncid"); // 若缓存为空,则查询DB if (remap == null || remap.isEmpty()) { synchronized (this){ remap = (Map<String, List>)redisClientTemplate.get("testfuncid");(最最关键的就是这一步) if(remap == null || remap.isEmpty()){ System.out.println( "重数据库里面获得");
2、是指查询一个数据库一定不存在的数据,这样就可以绕过缓存直接访问数据库,如此进行攻击的话,就造成数据库的压力过大。
解决的方案:查询不到的数据也放到redis里面,设置有效时间是60秒