博客
关于我
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学习总结(76)——MySQL执行计划(explain)结果含义总结
    查看>>
    Mysql学习总结(77)——温故Mysql数据库开发核心原则与规范
    查看>>
    Mysql学习总结(78)——MySQL各版本差异整理
    查看>>
    Mysql学习总结(79)——MySQL常用函数总结
    查看>>
    Mysql学习总结(7)——MySql索引原理与使用大全
    查看>>
    Mysql学习总结(80)——统计数据库的总记录数和库中各个表的数据量
    查看>>
    Mysql学习总结(81)——为什么MySQL不推荐使用uuid或者雪花id作为主键?
    查看>>
    Mysql学习总结(82)——MySQL逻辑删除与数据库唯一性约束如何解决?
    查看>>
    Mysql学习总结(83)——常用的几种分布式锁:ZK分布式锁、Redis分布式锁、数据库分布式锁、基于JDK的分布式锁方案对比总结
    查看>>
    Mysql学习总结(84)—— Mysql的主从复制延迟问题总结
    查看>>
    Mysql学习总结(85)——开发人员最应该明白的数据库设计原则
    查看>>
    Mysql学习总结(8)——MySql基本查询、连接查询、子查询、正则表达查询讲解
    查看>>
    Mysql学习总结(9)——MySql视图原理讲解与使用大全
    查看>>
    Mysql学习笔记 - 在Centos7环境下离线安装Mysql
    查看>>
    MySQL学习笔记十七:复制特性
    查看>>
    Mysql学习第一课-mysql的定义及sql语句
    查看>>
    mysql学号的字符长度_MYSQL--2
    查看>>
    mysql安全模式: sql_safe_updates
    查看>>
    mysql安装,卸载,连接
    查看>>
    MySQL安装之没有配置向导
    查看>>