博客
关于我
15.缓存、分布式锁
阅读量:734 次
发布时间:2019-03-21

本文共 1434 字,大约阅读时间需要 4 分钟。

商城购物代码优化:首页商品渲染与分类查询实现

在开发商城购物系统时,首页商品渲染与分类查询是两大核心模块。以下是优化后的代码实现方案,结合了一级、二级、三级分类的渲染逻辑,并结合缓存机制进行优化。

一级、二级、三级分类渲染

一级分类渲染

  • 父分类id为0时表示一级分类,直接获取所有一级分类数据。
  • 常用的首页地址如“/”和“index.html”需要通过一级分类定制访问。

二级、三级分类渲染

  • 利用Catelog2Vo类封装二级和三级分类数据。
  • 二级分类包含以下信息:
    • 父分类id(一级分类id)
    • 三级分类集合
    • 当前分类id
    • 当前分类名称
  • 三级分类包含以下信息:
    • 父分类id(二级分类id)
    • 当前分类id
    • 当前分类名称

缓存优化

为了减少数据库查询次数,可将频繁访问的分类数据存储在缓存中。缓存机制需解决以下问题:

  • 缓存穿透:新增缓存存储null值,避免缺失数据导致数据库高负载。
  • 缓存雪崩:设置随机过期时间,防止大量数据同时过期。
  • 缓存击穿:在缓存数据过期前加锁,确保数据一致性。
  • 分布式锁实现

    选择合适的分布式锁方案,常用的有以下三种:

    1. 本地锁(synchronized)

    适用于简单场景,但对于高并发访问无法有效消除竞争。

    2. 自定义分布式锁(Redis)

    • 加锁:使用SETNX命令确保原子性,结合随机过期时间防止死锁。
    • 解锁:使用lua脚本确保原子性操作,防止自释放或锁丢失。
    • 注意事项
      • 分布式锁需高效处理SETNXdel命令。
      • 避免锁超时,定期检查并释放过期锁。

    3. Redisson

    Redisson提供更强大的分布式锁功能,支持可重入锁、读写锁等,操作简便且高效。

    数据库核心查询优化

    核心查询方法getCatelogJSONDataFromDB()需:

  • 进行加锁操作。
  • 首先查询缓存:
    • 失败则查询数据库。
    • 成功则转换为Catelog2Vo类形式返回。
  • 存储数据到缓存时,需放在finally块中,确保锁释放。
  • 使用JSON.parseObject方法转换JSON数据为Java对象。
  • 缓存机制注意事项

    1. Redis缓存

    • 区分catelogJSONlock两个缓存_key。
    • 避免netty堆外内存溢出问题,可通过设置合理的直接内存最大值或切换客户端如Jedis。
    • 确保缓存数据与数据库保持一致性,采用双写模式或失效模式结合读写锁。

    2. Spring Cache

    -配置:

    • 引入 RedisCache依赖。
    • 配置CacheAutoConfiguration,自动管理缓存配置。
    • 配置application.properties
      spring.cache.type=redis
    • 缓存策略:
      • 为业务类型取名,避免冲突。
      • 配置过期时间ttl,如:
        spring.cache.redis.expires=300 # 5分钟
      • 默认生成缓存_key,若需自定义key,可在方法参数中或缓存配置中指定。

    3. 缓存一致性解决方案

    采用失效模式配合加锁,确保数据一致性:

    • 双写模式:缓存过期时间与数据库删除同步,解决脏数据问题。
    • 失效模式:加上读写锁,确保更新操作优先读取最新数据。

    适用场景可根据业务需求选择合适模式,通常推荐失效模式结合加锁方式,兼顾一致性与性能。

    最终实现总结

    通过以上优化,实现了一级、二级、三级分类渲染,结合Redis分布式锁和Spring Cache,有效解决了缓存穿透、雪崩、击穿问题,保障了高并发场景下的数据一致性。

    转载地址:http://vmzrz.baihongyu.com/

    你可能感兴趣的文章
    ntelliJ IDEA 报错:找不到包或者找不到符号
    查看>>
    NTFS文件权限管理实战
    查看>>
    ntko web firefox跨浏览器插件_深度比较:2019年6个最好的跨浏览器测试工具
    查看>>
    ntko文件存取错误_苹果推送 macOS 10.15.4:iCloud 云盘文件夹共享终于来了
    查看>>
    ntp server 用法小结
    查看>>
    ntpdate 通过外网同步时间
    查看>>
    ntpdate同步配置文件调整详解
    查看>>
    NTPD使用/etc/ntp.conf配置时钟同步详解
    查看>>
    NTP及Chrony时间同步服务设置
    查看>>
    NTP服务器
    查看>>
    NTP配置
    查看>>
    NUC1077 Humble Numbers【数学计算+打表】
    查看>>
    NuGet Gallery 开源项目快速入门指南
    查看>>
    NuGet(微软.NET开发平台的软件包管理工具)在VisualStudio中的安装的使用
    查看>>
    nuget.org 无法加载源 https://api.nuget.org/v3/index.json 的服务索引
    查看>>
    Nuget~管理自己的包包
    查看>>
    NuGet学习笔记001---了解使用NuGet给net快速获取引用
    查看>>
    nullnullHuge Pages
    查看>>
    NullPointerException Cannot invoke setSkipOutputConversion(boolean) because functionToInvoke is null
    查看>>
    null可以转换成任意非基本类型(int/short/long/float/boolean/byte/double/char以外)
    查看>>