40分布式电商项目 - 网站首页(缓存广告数据)

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 40分布式电商项目 - 网站首页(缓存广告数据)

代码已上传至Github

地址:https://github.com/ylw-github/pingyougou.git

版本:8e95815be1cdc8c8edb05eed86c32fe650ea0efc

现在我们首页的广告每次都是从数据库读取,这样当网站访问量达到高峰时段,对数据库压力很大,并且影响执行效率。我们需要将这部分广告数据缓存起来。

例如轮播图,每一次都要去访问数据库,会造成数据库的压力增大,所以可以使用Redis缓存,例如下面的片段代码:

public List<TbContent> findContentListByCategoryId(Long categoryId) {
    try {
      //先查询缓存
      List<TbContent>  adList = (List<TbContent>) redisTemplate.boundHashOps("index_cache").get(categoryId+"");
      //判断缓存数据是否存在
      if(adList!=null && adList.size()>0){
        return adList;
      }
    } catch (Exception e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    // 创建广告内容表example对象
    TbContentExample example = new TbContentExample();
    // 创建criteria对象
    Criteria createCriteria = example.createCriteria();
    // 设置查询参数
    // 外键
    createCriteria.andCategoryIdEqualTo(categoryId);
    // 查询有效广告
    createCriteria.andStatusEqualTo("1");
    // 设置排序字段
    example.setOrderByClause("sort_order");
    //执行查询
    List<TbContent> list = contentMapper.selectByExample(example);
    //添加缓存数据
    redisTemplate.boundHashOps("index_cache").put(categoryId+"",list);
    return list;
  }

更新缓存:

当广告数据发生变更时,需要将缓存数据清除,这样再次查询才能获取最新的数据

新增广告后清除缓存:

修改 pinyougou-content-service 工程ContentServiceImpl.java 的 add 方法

/**
   * 增加
   */
  @Override
  public void add(TbContent content) {
    //清空缓存
    redisTemplate.boundHashOps("index_cache").delete(content.getCategoryId()+"");
    contentMapper.insert(content);
  }

修改广告后清除缓存:

考虑到用户可能会修改广告的分类,这样需要把原分类的缓存和新分类的缓存都清除掉。

/**
   * 修改
   * 1,分类id也发生了变化
   * 2,id没法发生变化
   */
  @Override
  public void update(TbContent content) {
    //根据当前id查询广告对象
    TbContent tbContent = contentMapper.selectByPrimaryKey(content.getId());    
    //清空缓存
    redisTemplate.boundHashOps("index_cache").delete(tbContent.getCategoryId()+"");
    contentMapper.updateByPrimaryKey(content);
  }

删除广告后清除缓存:

/**
   * 批量删除
   */
  @Override
  public void delete(Long[] ids) {
    for (Long id : ids) {
      //查询广告内容对象
      TbContent content = contentMapper.selectByPrimaryKey(id);
      redisTemplate.boundHashOps("index_cache").delete(content.getCategoryId()+"");
      contentMapper.deleteByPrimaryKey(id);
    }
  }


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
2月前
|
存储 缓存 NoSQL
数据的存储--Redis缓存存储(一)
数据的存储--Redis缓存存储(一)
|
2月前
|
存储 缓存 NoSQL
数据的存储--Redis缓存存储(二)
数据的存储--Redis缓存存储(二)
数据的存储--Redis缓存存储(二)
|
28天前
|
存储 缓存 算法
分布式缓存有哪些常用的数据分片算法?
【10月更文挑战第25天】在实际应用中,需要根据具体的业务需求、数据特征以及系统的可扩展性要求等因素综合考虑,选择合适的数据分片算法,以实现分布式缓存的高效运行和数据的合理分布。
|
2月前
|
JSON 分布式计算 前端开发
前端的全栈之路Meteor篇(七):轻量的NoSql分布式数据协议同步协议DDP深度剖析
本文深入探讨了DDP(Distributed Data Protocol)协议,这是一种在Meteor框架中广泛使用的发布/订阅协议,支持实时数据同步。文章详细介绍了DDP的主要特点、消息类型、协议流程及其在Meteor中的应用,包括实时数据同步、用户界面响应、分布式计算、多客户端协作和离线支持等。通过学习DDP,开发者可以构建响应迅速、适应性强的现代Web应用。
|
2月前
|
缓存 监控 前端开发
处理页面缓存中数据不一致的问题
【10月更文挑战第9天】
43 2
|
3月前
|
缓存 NoSQL Java
谷粒商城笔记+踩坑(12)——缓存与分布式锁,Redisson+缓存数据一致性
缓存与分布式锁、Redisson分布式锁、缓存数据一致性【必须满足最终一致性】
136 14
谷粒商城笔记+踩坑(12)——缓存与分布式锁,Redisson+缓存数据一致性
|
2月前
|
存储 缓存 NoSQL
大数据-38 Redis 高并发下的分布式缓存 Redis简介 缓存场景 读写模式 旁路模式 穿透模式 缓存模式 基本概念等
大数据-38 Redis 高并发下的分布式缓存 Redis简介 缓存场景 读写模式 旁路模式 穿透模式 缓存模式 基本概念等
66 4
|
2月前
|
消息中间件 缓存 NoSQL
大数据-49 Redis 缓存问题中 穿透、雪崩、击穿、数据不一致、HotKey、BigKey
大数据-49 Redis 缓存问题中 穿透、雪崩、击穿、数据不一致、HotKey、BigKey
55 2
|
4月前
|
Java 数据库连接 微服务
揭秘微服务架构下的数据魔方:Hibernate如何玩转分布式持久化,实现秒级响应的秘密武器?
【8月更文挑战第31天】微服务架构通过将系统拆分成独立服务,提升了可维护性和扩展性,但也带来了数据一致性和事务管理等挑战。Hibernate 作为强大的 ORM 工具,在微服务中发挥关键作用,通过二级缓存和分布式事务支持,简化了对象关系映射,并提供了有效的持久化策略。其二级缓存机制减少数据库访问,提升性能;支持 JTA 保证跨服务事务一致性;乐观锁机制解决并发数据冲突。合理配置 Hibernate 可助力构建高效稳定的分布式系统。
69 0
|
2月前
|
消息中间件 缓存 NoSQL
Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。
【10月更文挑战第4天】Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。随着数据增长,有时需要将 Redis 数据导出以进行分析、备份或迁移。本文详细介绍几种导出方法:1)使用 Redis 命令与重定向;2)利用 Redis 的 RDB 和 AOF 持久化功能;3)借助第三方工具如 `redis-dump`。每种方法均附有示例代码,帮助你轻松完成数据导出任务。无论数据量大小,总有一款适合你。
78 6