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

    你可能感兴趣的文章
    Nginx(2):Nginx配置server节点
    查看>>
    nginx:/usr/src/fastdfs-nginx-module/src/common.c:21:25:致命错误:fdfs_define.h:没有那个文件或目录 #include
    查看>>
    Nginx:NginxConfig可视化配置工具安装
    查看>>
    Nginx:现代Web服务器的瑞士军刀 | 文章末尾送典藏书籍
    查看>>
    ngModelController
    查看>>
    ngnix配置文件
    查看>>
    ngrok | 内网穿透,支持 HTTPS、国内访问、静态域名
    查看>>
    ngrok内网穿透可以实现资源共享吗?快解析更加简洁
    查看>>
    ngrok内网穿透可以实现资源共享吗?快解析更加简洁
    查看>>
    NHibernate动态添加表
    查看>>
    NHibernate学习[1]
    查看>>
    NHibernate异常:No persister for的解决办法
    查看>>
    Nhibernate的第一个实例
    查看>>
    NHibernate示例
    查看>>
    nid修改oracle11gR2数据库名
    查看>>
    NIFI1.21.0/NIFI1.22.0/NIFI1.24.0/NIFI1.26.0_2024-06-11最新版本安装_采用HTTP方式_搭建集群_实际操作---大数据之Nifi工作笔记0050
    查看>>
    NIFI1.21.0_java.net.SocketException:_Too many open files 打开的文件太多_实际操作---大数据之Nifi工作笔记0051
    查看>>
    NIFI1.21.0_Mysql到Mysql增量CDC同步中_日期类型_以及null数据同步处理补充---大数据之Nifi工作笔记0057
    查看>>
    NIFI1.21.0_Mysql到Mysql增量CDC同步中_补充_插入时如果目标表中已存在该数据则自动改为更新数据_Postgresql_Hbase也适用---大数据之Nifi工作笔记0058
    查看>>
    NIFI1.21.0_Mysql到Mysql增量CDC同步中_补充_更新时如果目标表中不存在记录就改为插入数据_Postgresql_Hbase也适用---大数据之Nifi工作笔记0059
    查看>>