博客
关于我
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/

    你可能感兴趣的文章
    Mysql group by
    查看>>
    MySQL I 有福啦,窗口函数大大提高了取数的效率!
    查看>>
    mysql id自动增长 初始值 Mysql重置auto_increment初始值
    查看>>
    MySQL in 太多过慢的 3 种解决方案
    查看>>
    MySQL InnoDB 三大文件日志,看完秒懂
    查看>>
    Mysql InnoDB 数据更新导致锁表
    查看>>
    Mysql Innodb 锁机制
    查看>>
    MySQL InnoDB中意向锁的作用及原理探
    查看>>
    MySQL InnoDB事务隔离级别与锁机制深入解析
    查看>>
    Mysql InnoDB存储引擎 —— 数据页
    查看>>
    Mysql InnoDB存储引擎中的checkpoint技术
    查看>>
    Mysql InnoDB存储引擎中缓冲池Buffer Pool、Redo Log、Bin Log、Undo Log、Channge Buffer
    查看>>
    MySQL InnoDB引擎的锁机制详解
    查看>>
    Mysql INNODB引擎行锁的3种算法 Record Lock Next-Key Lock Grap Lock
    查看>>
    mysql InnoDB数据存储引擎 的B+树索引原理
    查看>>
    mysql innodb通过使用mvcc来实现可重复读
    查看>>
    mysql insert update 同时执行_MySQL进阶三板斧(三)看清“触发器 (Trigger)”的真实面目...
    查看>>
    mysql interval显示条件值_MySQL INTERVAL关键字可以使用哪些不同的单位值?
    查看>>
    Mysql join原理
    查看>>
    MySQL Join算法与调优白皮书(二)
    查看>>