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

    你可能感兴趣的文章
    Oracle 并行原理与示例总结
    查看>>
    oracle 并集 时间_Oracle集合运算符 交集 并集 差集
    查看>>
    Oracle 序列sequence 开始于某个值(10)执行完nextval 发现查出的值比10还小的解释
    查看>>
    ORACLE 异常错误处理
    查看>>
    oracle 执行一条查询语句,把数据加载到页面或者前台发生的事情
    查看>>
    oracle 批量生成建同义词语句和付权语句
    查看>>
    oracle 抓包工具,shell 安装oracle和pfring(抓包) 及自动环境配置
    查看>>
    Oracle 拆分以逗号分隔的字符串为多行数据
    查看>>
    Oracle 排序中使用nulls first 或者nulls last 语法
    查看>>
    oracle 插入date日期类型的数据、插入从表中查出的数据,使用表中的默认数据
    查看>>
    Oracle 操作笔记
    查看>>
    oracle 数据库 安装 和优化
    查看>>
    oracle 数据库dg搭建规范1
    查看>>
    Oracle 数据库常用SQL语句(1)
    查看>>
    Oracle 数据库特殊查询总结
    查看>>
    Oracle 数据类型
    查看>>
    Oracle 数据自动备份 通过EXP备份
    查看>>
    oracle 数据迁移 怎么保证 和原表的数据顺序一致_一个比传统数据库快 1001000 倍的数据库,来看一看?...
    查看>>
    oracle 时间函数
    查看>>
    oracle 时间转化函数及常见函数 .
    查看>>