当前位置: 首页 > wzjs >正文

南宁网站建设优化排名西安网站建设价格低

南宁网站建设优化排名,西安网站建设价格低,wordpress seo theme,做网站凡科缓存 “三剑客” 问题 如何保证 Redis 缓存和数据库的一致性? 1. 缓存穿透 缓存穿透是指请求一个不存在的数据,缓存层和数据库层都没有这个数据,这种请求会穿透缓存直接到数据库进行查询 解决方案: 1.1 缓存空值或特殊值 查一…

缓存 “三剑客” 问题

如何保证 Redis 缓存和数据库的一致性?

1. 缓存穿透

缓存穿透是指请求一个不存在的数据,缓存层和数据库层都没有这个数据,这种请求会穿透缓存直接到数据库进行查询

解决方案:

1.1 缓存空值或特殊值

查一个不存在的数据时,给一个对应的 key 数据,存入缓存

注意,这里给出的数据不能是 null 等,不然也会被缓存判断为没有。

1.2 使用布隆过滤器

1.2.1 什么是布隆过滤器?

布隆过滤器(Bloom Filter)是一种数据结构,用于快速判断一个元素是否属于一个集合中。

它使用多个 Hash 函数将一个元素映射成一个位阵列(Bit array)中的一个点,将 Bit array 理解为一个二进制数组,数组元素是 0 或 1。

当一个元素加入集合时,通过 N 个散列函数将这个元素映射到一个 Bit array 中的 N 个点,把它们设置为 1。

1.2.2 检测原理

检索某个元素是否在缓存中有时,再通过这 N 个散列函数对这个元素进行映射,根据映射找到具体位置的元素:

  1. 一定不存在:位数组对应的下标上有一个或多个是 0,直接返回
  2. 有可能存在:位数组对应的下标上每个对应值都 1,查Redis

当数据存入缓存中时,会同时存储一个 Redis 的键到布隆过滤器中。会通过布隆过滤器提供的多个 Hash 函数对 Key 进行 Hash 运算,再对位数组长度进行取余,得到一个下标,将该下标值设置为 1。

1.2.3 实现步骤

引入依赖:

<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>28.2-jre</version>
</dependency>

测试代码:

public class BloomFilterExample {public static void main(String[] args) {// 创建一个布隆过滤器,预期元素数量为1000,误判率为0.01BloomFilter<String> bloomFilter = BloomFilter.create(Funnels.stringFunnel(Charset.defaultCharset()), 1000, 0.01);// 添加元素到布隆过滤器bloomFilter.put("example1");bloomFilter.put("example2");bloomFilter.put("example3");// 测试元素是否在布隆过滤器中System.out.println(bloomFilter.mightContain("example1")); // trueSystem.out.println(bloomFilter.mightContain("example4")); // false}
}

误判率是你可以调整的一个参数,较低的误判率通常需要更多的空间和计算资源

2. 缓存击穿

某一个热点数据的 key 突然过期,造成大量请求直达数据库。

解决方案:

2.1 热点数据永不过期

其实并非真正的永不过期,而是设置定时任务,等到一个访问率较低的时候,更新缓存数据(先删除缓存中的数据,再查询数据,再写入缓存),从而实现 “永不过期” 的效果。

2.2 接口限流或者降级

2.3 分布式锁

在分布式环境下,传统锁会失效,因为传统锁是基于 JVM 的

这时就要用分布式锁来实现,

解决方案:

2.3.1 redisson 方案

执行流程:

  1. 线程一尝试去获取锁,拿到锁之后(锁的有效是 30S)
  2. 在后台开启一个子线程,定时(每过 10S)去查询当前线程是否还持有锁,如果有,则给锁续命(延长锁到 30S),直到主线程执行结束,手动释放锁
  3. 线程二尝试去获取锁,拿锁失败,会进行自旋(每隔一定时间去拿锁),直到拿锁成功后去执行 2
public class RedissonDistributedLockExample {public static void main(String[] args) {// 配置 Redisson 客户端Config config = new Config();// 假设Redis地址和密码config.useSingleServer().setAddress("redis://127.0.0.1:6379").setPassword("redis");RedissonClient redisson = Redisson.create(config);// 获取锁RLock Lock = redisson.getLock("myLock");try {// 尝试加锁,最多等待100秒,锁持有时间为10秒boolean isLocked = lock.tryLock(100, 10, TimeUnit.SECONDS);if (isLocked) {System.out.printLn("成功获取到锁,开始执行临界区代码");// 模拟临界区代码执行Thread.sleep(5000);} else {System.out.printLn("未能获取到锁");}} catch (InterruptedException e) {e.printStackTrace();} finally {// 释放锁if (lock.isHeldByCurrentThread()) {lock.unlock();System.out.printLn("锁已释放";}}// 关闭Redisson 客户端redisson.shutdown();}
}
2.3.2 Zookeeper 方案

基于临时序号节点 + 监听机制

3. 缓存雪崩

缓存雪崩是缓存中大量 key 失效后当高并发到来时导致大量请求到数据库,瞬间耗尽数据库资源,导致数据库无法使用。

解决方案:

3.1 分布式锁

参考缓存击穿中的分布式锁

3.2 热点数据永不过期

其实这个 “永不过期” 并非真正的永不过期,而是使用定时任务等技术,在服务器压力最小时,定时更新缓存,以实现 “永不过期” 的效果。

3.3 key 随机过期时间

在向 Redis 中添加缓存,设置过期时间时,多添加一个随机时间

//生成随机数
int randomNum = new Random().nextInt(6000);
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()//过期时间为基础时间加随机数.entryTtl(Duration.ofSeconds(24 * 60 * 60L + randomNum)).serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(JACKSON_SERIALIZER));return RedisCacheManager.builder(connectionFactory).cacheDefaults(config).transactionAware().build();

以防止在同一时间内大量 key 失效。

注意:这个随机时间不建议设置太大,如果是在是需要失效的 key 太多,可以将时间单位设置位毫秒,甚至是纳秒,同样也能实现效果。


文章转载自:

http://oDvdoNgO.jfqqs.cn
http://oS6t0g7p.jfqqs.cn
http://RYBmjuPF.jfqqs.cn
http://bAqWkgvI.jfqqs.cn
http://0nHaeRE3.jfqqs.cn
http://VyLwBuXu.jfqqs.cn
http://Pt7OZyuJ.jfqqs.cn
http://TErVsoAF.jfqqs.cn
http://4Z3AKigg.jfqqs.cn
http://fhIpdkek.jfqqs.cn
http://mbzetXxv.jfqqs.cn
http://fwFNdfXT.jfqqs.cn
http://ohn9yWRH.jfqqs.cn
http://NVgOEJ0H.jfqqs.cn
http://qYCQHoyJ.jfqqs.cn
http://gTEO6Qze.jfqqs.cn
http://MEl3vf0j.jfqqs.cn
http://da3wZ6Ga.jfqqs.cn
http://5M3TdIWB.jfqqs.cn
http://w7zX8Q1P.jfqqs.cn
http://CEKe0aeV.jfqqs.cn
http://tnzuq7qp.jfqqs.cn
http://oohcjTGW.jfqqs.cn
http://TddRYGWE.jfqqs.cn
http://vEPm9aRa.jfqqs.cn
http://p68Voyzh.jfqqs.cn
http://7ZU2rWa2.jfqqs.cn
http://wugHNKQ7.jfqqs.cn
http://KAOOQzqS.jfqqs.cn
http://AQSaYKCx.jfqqs.cn
http://www.dtcms.com/wzjs/726755.html

相关文章:

  • 合肥房产网二手房出售seo好学吗入门怎么学
  • 网站建设哪里好阜宁住房和城乡建设局网站
  • 汽车网站大全建设旅游网站的目的和意义
  • 织梦做的网站要怎么放到浏览器ps制作网站首页界面
  • wordpress资源站主题工程项目管理软件 免费
  • 网站内链优化策略青岛网络推广公司哪家好
  • php制作公司网站首页wordpress页眉内容修改
  • 网站建设的特色新泰房产信息与住宅网
  • 描述网站开发的流程网站提交收录
  • 公司网站文化活动备案whois域名查询网站
  • 微信做网站的弊端app小游戏开发公司
  • asp.net做登录注册网站湘西做网站
  • 建设企业网站的模式文化建设基金管理有限公司网站
  • 企业网站优化的方式wordpress mu模式
  • 南山建站公司深圳 网页设计公司
  • 网站建设的具体过程凡科网网站系统
  • 怎么自助建站小区网络设计方案
  • 手机网站建设流程wordpress地产
  • 内设网站网站建设公司哪个好
  • 湘潭大学迎新自助网站沧州地区做网站
  • 松岗网站的建设上海 网站开发 兼职
  • 网址导航网址大全彩票网站大全2网站建设
  • 做网站要固定电话青岛黄岛区网站开发
  • win7 iis6.0添加网站做网站的主要作用
  • 大沥做网站网站分析的数据来源有哪些
  • 建立网站需要电商网站开发周期
  • 泰州网站建设服务公司东城专业网站建设公司
  • 保定网站设计制作wordpress文章tag
  • 滨州正规网站建设哪家好怎么样推广自己的网址
  • 正规网站优化推广课程网站建设课程