淘宝网站是用什么开发的,做视频解析网站犯法吗,什么是手机网站,百度账号官网缓存穿透请求的数据在Redis里面没有#xff0c;这种请求直接打到数据库#xff0c;然后数据库里面也没有这个数据#xff0c;数据库只能返回空#xff0c;如果继续请求#xff0c;就会一直打到数据库#xff0c;可能数据库就会因此被打崩。缓存雪崩缓存击穿第二种办法保证…缓存穿透请求的数据在Redis里面没有这种请求直接打到数据库然后数据库里面也没有这个数据数据库只能返回空如果继续请求就会一直打到数据库可能数据库就会因此被打崩。缓存雪崩缓存击穿第二种办法保证了绝对不会因为过期问题使访问直接打到数据库但是为了实现过期这个功能我们就得用更复杂的办法额外维护一个过期时间来实现过期这个功能。逻辑过期里面也有锁的使用但是是交给别的线程所以不在我们的对比行列里面。互斥锁解决击穿问题Redis设置锁的方法SETNX 是 Redis 的一个字符串String操作命令它的全称是 SET if Not eXists。功能当且仅当指定的 key 不存在时为这个 key 设置一个值。返回值1表示设置成功key 原本不存在。0表示设置失败key 已经存在。这是一个原子性操作意味着它是不可分割的。在并发环境下多个客户端同时执行 SETNX 时Redis 能确保只有一个客户端会成功。关于拆箱核心概念值类型 vs 引用类型许多语言中数据类型分为两大类值类型变量直接存储数据本身。例如int, float, char, bool 等基本数据类型。就像你口袋里直接揣着现金。引用类型变量存储的是一个内存地址引用这个地址指向实际的数据所在的内存位置。例如类、接口、数组、字符串。就像你口袋里揣着一张银行卡钱存在银行的保险柜里。 为什么需要装箱和拆箱有时候我们需要在需要引用类型的地方使用一个值类型。一个经典例子Java 中的集合如 ArrayList
Java 的 ArrayList 类的 add 方法定义是 add(Object obj)它只能接收引用类型因为 Object 是所有类的超类。但如果我们想往里面存一个整数int它是值类型该怎么办这就需要 “装箱”—— 把值类型“包装”成一个引用类型的对象。装箱装箱 就是将值类型转换为对应的引用类型的过程。这个过程通常是隐式的编译器自动完成。Java 示例在 Java 中称为“自动装箱”拆箱拆箱 是装箱的逆过程它将引用类型转换回对应的值类型。这个过程有时需要显式地进行需要手动指定目标类型。Java 示例在 Java 中称为“自动拆箱”拆箱操作本质上是一个强制类型转换。你告诉编译器“相信我这个引用类型变量里面装的一定是某个特定的值类型现在请把它拿出来。”编译器在编译时无法100%确定你的这个“信任”是否正确所以它允许代码通过编译。但如果在运行时发现你的“信任”是错的就会立即抛出一个异常来中断程序。操作代码背后原理比喻手动装箱Integer box Integer.valueOf(100);调用静态工厂方法valueOf创建一个新对象。去工厂订做一个盒子。自动装箱Integer box 100;编译器帮你写Integer.valueOf(100)。告诉助理“我要个盒子”助理帮你订做。手动拆箱int i box.intValue();调用对象实例方法intValue()取出其内部值。自己动手打开盒子拿钱。自动拆箱int i box;编译器帮你写box.intValue()。特性boolean (基本类型)Boolean (包装类)数据类型基本数据类型类引用类型默认值falsenull存储位置栈内存堆内存对象本身栈上存引用占用空间约1位实际按1字节处理一整个对象的内存开销更大比较方式 比较值 比较内存地址equals() 比较包装的值功能仅能表示 true/false是一个类拥有方法如 toString(), parseBoolean()允许为null不允许允许用途普通的条件判断、循环控制需要对象的地方如泛型、集合
public R,ID R queryWithPassThrough(String keyPrefix, ID id, ClassR type, FunctionID, R dbFallback, Long time, TimeUnit unit){String key keyPrefix id;// 1.从redis查询商铺缓存String json stringRedisTemplate.opsForValue().get(key);// 2.判断是否存在if (StrUtil.isNotBlank(json)) {// 3.存在直接返回return JSONUtil.toBean(json, type);}// 判断命中的是否是空值if (json ! null) {// 返回一个错误信息return null;}// 4.不存在根据id查询数据库R r dbFallback.apply(id);// 5.不存在返回错误if (r null) {// 将空值写入redisstringRedisTemplate.opsForValue().set(key, , CACHE_NULL_TTL, TimeUnit.MINUTES);// 返回错误信息return null;}// 6.存在写入redisthis.set(key, r, time, unit);return r;}
逻辑过期解决击穿问题