Redis(案例二:高并发商品首页热点数据开发实战)
热点数据
经常会被查询,但是不经常被修改或者删除的数据
⾸⻚-详情⻚
链路逻辑
检查缓存是否有
缓存不存在则查询数据库
查询结果放到缓存,设置过期时间
下次访问则命中缓存
代码实现
pojo —热点视频
@Data
@NoArgsConstructor
@AllArgsConstructor
public class VideoDO {private int id;private String title;private String img;private int price;
pojo —热点卡片
@Data
import java.util.List;public class VideoCardDO {private String title;private int id;private int weight;List<VideoDO> list;
dao —模拟数据
import net.xdclass.xdclassredis.model.VideoCardDO;
import net.xdclass.xdclassredis.model.VideoDO;
import org.springframework.stereotype.Repository;import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;@Repository
public class VideoCardDao {public List<VideoCardDO> list(){try {TimeUnit.MILLISECONDS.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}List<VideoCardDO> cardDOList = new ArrayList<>();VideoCardDO videoCardDO = new VideoCardDO();videoCardDO.setId(1);videoCardDO.setTitle("热门视频");VideoDO videoDO1 = new VideoDO(1,"springcloud微服务视频","xdclass.net",43);VideoDO videoDO2 = new VideoDO(2,"Paas工业级项目实战","xdclass.net",32);VideoDO videoDO3 = new VideoDO(3,"面试专题视频","xdclass.net",43);VideoDO videoDO4 = new VideoDO(4,"spring源码实战","xdclass.net",4);List<VideoDO> videoDOS = new ArrayList<>();videoDOS.add(videoDO1);videoDOS.add(videoDO2);videoDOS.add(videoDO3);videoDOS.add(videoDO4);videoCardDO.setList(videoDOS);VideoCardDO videoCardDO2 = new VideoCardDO();videoCardDO2.setId(2);videoCardDO2.setTitle("项目实战视频");VideoDO videoDO5 = new VideoDO(1,"springcloud微服务视频项目","xdclass.net",43);VideoDO videoDO6 = new VideoDO(2,"Paas工业级项目实战项目","xdclass.net",32);VideoDO videoDO7 = new VideoDO(3,"面试专题视频项目","xdclass.net",43);VideoDO videoDO8 = new VideoDO(4,"设计模式视频","xdclass.net",4);List<VideoDO> videoDOS2 = new ArrayList<>();videoDOS2.add(videoDO5);videoDOS2.add(videoDO6);videoDOS2.add(videoDO7);videoDOS2.add(videoDO8);videoCardDO2.setList(videoDOS2);cardDOList.add(videoCardDO);cardDOList.add(videoCardDO2);return cardDOList;}}
service
import net.xdclass.xdclassredis.model.VideoCardDO;
import java.util.List;public interface VideoCardService {List<VideoCardDO> list();
}
serviceImpl
import net.xdclass.xdclassredis.dao.VideoCardDao;
import net.xdclass.xdclassredis.model.VideoCardDO;
import net.xdclass.xdclassredis.service.VideoCardService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class VideoCardServiceImpl implements VideoCardService {@Autowiredprivate VideoCardDao videoCardDao;@Overridepublic List<VideoCardDO> list() {return videoCardDao.list();}
}
controller
import net.xdclass.xdclassredis.model.VideoCardDO;
import net.xdclass.xdclassredis.service.VideoCardService;
import net.xdclass.xdclassredis.util.JsonData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;
import java.util.concurrent.TimeUnit;@RequestMapping("/api/v1/card")
@RestController
public class VideoCardController {@Autowiredprivate VideoCardService videoCardService;@Autowiredprivate RedisTemplate redisTemplate;/*** 缓存key*/private static final String VIDEO_CARD_CACHE_KEY = "video:card:key";/*** 有缓存* @return*/@GetMapping("list_cache")public JsonData listCardCache(){Object cacheObj = redisTemplate.opsForValue().get(VIDEO_CARD_CACHE_KEY);if(cacheObj != null){List<VideoCardDO> list = (List<VideoCardDO>) cacheObj;return JsonData.buildSuccess(list);} else {List<VideoCardDO> list = videoCardService.list();redisTemplate.opsForValue().set(VIDEO_CARD_CACHE_KEY,list,10,TimeUnit.MINUTES);return JsonData.buildSuccess(list);}}/*** 无缓存* @return*/@GetMapping("list_nocache")public JsonData listCardNoCache(){List<VideoCardDO> list = videoCardService.list();return JsonData.buildSuccess(list);}}
Redis(案例二:高并发商品首页热点数据开发实战)相关推荐
- 高并发环境下热点数据访问的最佳实践。
前言: 正常情况下,我们为了缓解数据库读写压力,我们会在应用程序中增加一层缓存,但在高并发场景下,热点数据的访问依旧会对缓存造成压力,通过横向扩容也并不能解决本质问题.那么,有没有一种热点预测,精准匹 ...
- SpringBoot +Redis +RabbitMQ 实现高并发限时秒杀
SpringBoot +Redis +RabbitMQ 实现高并发限时秒杀 提示:以下是本篇文章正文内容,下面案例可供参考 一.软件安装 1.安装RabbitMQ docker安装:docker安装R ...
- SpringBoot+Redis+Cookies实现高并发的购物车
案例实战:SpringBoot+Redis+Cookies实现高并发的购物车 步骤1:代码逻辑 /*** 添加购物车*/@PostMapping(value = "/addCart" ...
- PHP高并发商品秒杀问题的解决方案
前言 秒杀会产生一个瞬间的高并发,使用数据库会增加数据库的访问压力,也会降低访问速度,所以我们应该使用缓存,来降低数据库的访问压力: 可以看出这里的操作和原来的下单是不一样的:产生的秒杀预订单不会马上 ...
- java redis队列_redis队列实现高并发怎么用?Java如何使用redis队列解决高并发?
小伙伴们大家好,不知道你们有没有在Java开发中遇到redis队列高并发,这个问题让你很头疼,今天小编就来讲解一下在Java中遇到redis队列高并发了,到底该怎么办. 高并发的业务场景: 我们做商品 ...
- Redis锁解决高并发问题
Redis锁解决高并发问题 redis真的是一个很好的技术,它可以很好的在一定程度上解决网站一瞬间的并发量,例如商品抢购秒杀等活动. redis之所以能解决高并发的原因是它可以直接访问内存,而以往我们 ...
- 面试官:为什么单线程的Redis可以实现高并发访问
背景 上回说到小枫在接受面试官的拷打,所幸第一个问题回答的还不错,因此面试官对于小枫的初步印象还行.我们接着来看看小枫是怎么和面试官继续过招的吧,他还能扛得住面试官几个连环炮呢? 面试官考察目的分析 ...
- java rabbitmq 并发_RabbitMQ消息中间件 高级篇二 高并发情况下保障消息投递可靠性...
RabbitMQ消息中间件技术精讲9 高级篇二 高并发场景下,消息的延迟投递做二次确认进行回调检查来保障生产者消息投递成功的可靠性 在上一篇文章中,我们介绍了BAT大厂中一种方式保障生成者消息投递可靠 ...
- 利用Redis锁解决高并发问题
利用Redis锁解决高并发问题 参考文章: (1)利用Redis锁解决高并发问题 (2)https://www.cnblogs.com/yszr/p/11698696.html 备忘一下.
最新文章
- 阿里云 mysql 无缘无故挂掉
- LDD3学习之short
- python开发环境wingide的安装与破解
- 心得14-hibernate的优化2-抓取(fetch)
- oracle 不等于某类,Oracle如何查询不等于某数值
- IOS 如何获取ppi
- nodejs模块hashmap
- MySQL Index Merge Optimization
- 洛谷 3203 HNOI2010 BOUNCE 弹飞绵羊
- 矩阵理论——正交变换
- CAD软件绘图如何提高效率 (下)
- 无源晶振匹配电容计算方法
- 计算机共享网络的账号密码怎么设置密码,win10局域网共享怎么设置账号密码
- CNN详解——反向传播过程
- TCP的四次挥手为什么需要2MSL ?
- Mysql数据库管理
- Houdini 求中点,点连成线
- zbb20180930 java,nio,netty Netty5.0用法
- 石头剪刀布Java实现
- 单片机开发从来不用数据结构?
热门文章
- Redis遍历方式思考--字典扩容方式
- <meta name=“robots“ content=“index,follow“>的解释
- JVM解惑:消失的异常堆栈,log中打印异常堆栈为空
- Educational Codeforces Round 111 (Rated for Div. 2)
- 牛客网 【每日一题】7月27日题目精讲—乌龟棋
- 水题(water)(非详细解答)
- CF407 E. k-d-sequence(线段树+单调栈)
- [USACO19JAN,Platinum] Redistricting
- 花店橱窗布置(洛谷P1854)(动态规划)
- POJ3348-Cows【凸包,计算几何】