当前位置: 首页 > wzjs >正文

网站设计官网西安专业做网站公司

网站设计官网,西安专业做网站公司,网站建设业务文案,怎么做卖花的网站Redis缓存 查询数据 操作步骤: 问题:在数据库更新后、缓存失效前存在短暂不一致期 更新数据 操作步骤: 更新数据库删除缓存中的对应数据下次读取时自动重新加载最新数据到缓存 存在的问题: 通常建议"先更新数据库&…

Redis缓存

查询数据

操作步骤:

在这里插入图片描述
问题:在数据库更新后、缓存失效前存在短暂不一致期


更新数据

操作步骤:

  1. 更新数据库
  2. 删除缓存中的对应数据
  3. 下次读取时自动重新加载最新数据到缓存

存在的问题:
在这里插入图片描述
通常建议"先更新数据库,再删除缓存"
反过来可能导致更长时间的不一致
解决方案:
设置较短的缓存时间,尽量避免长时间数据不一致问题


插入数据

操作步骤:
仅插入数据库
不需要操作Redis缓存
缓存预热:

  1. 对于重要的新数据,可以主动写入缓存
  2. 对于可能被频繁访问的新数据,设置较长的过期时间

删除数据

操作步骤:

  1. 先删除数据库记录
  2. 再删除缓存

演示数据

DROP TABLE IF EXISTS `products`;
CREATE TABLE `products`  (`product_id` int NOT NULL AUTO_INCREMENT,`product_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,`category` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,`price` decimal(10, 2) NOT NULL,`stock_quantity` int NOT NULL DEFAULT 0,`description` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL,`created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,`updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY (`product_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of products
-- ----------------------------
INSERT INTO `products` VALUES (1, 'iPhone 15', '智能手机', 2999.00, 100, '苹果最新款智能手机,A16芯片,超视网膜XDR显示屏', '2025-07-12 23:51:28', '2025-07-12 23:51:28');
INSERT INTO `products` VALUES (2, '小米电视65英寸', '家用电器', 3299.00, 50, '4K超高清,MEMC运动补偿,全面屏设计', '2025-07-12 23:51:28', '2025-07-12 23:51:28');
INSERT INTO `products` VALUES (3, '耐克Air Max运动鞋', '运动鞋服', 899.00, 200, '经典气垫设计,舒适缓震,多种配色可选', '2025-07-12 23:51:28', '2025-07-12 23:51:28');

缓存问题

缓存穿透

大量请求查询数据库中不存在的数据,导致请求直接打到数据库上
缓存穿透解决方案:

  1. 缓存空对象
    对查询结果为null的数据也进行缓存,设置较短的过期时间
	@GetMapping("getNull")public Result getNull(@RequestParam Integer pid){//redis keyString key = PRODUCT_PRE+pid;//1.redis查询Products products = (Products)redisTemplate.opsForValue().get(key);//如果redis没查到去数据库查询if(products != null || redisTemplate.hasKey(key)) //数据不等于空或者key是存在的{return Result.ok("查询成功",products);}//查到数据就将数据保存到redisQueryWrapper<Products> qw = new QueryWrapper<>();qw.eq("product_id",pid);Products one = productsService.getOne(qw);//添加过期时间,防止读到旧数据redisTemplate.opsForValue().set(key,one,10, TimeUnit.MINUTES);//设置10分钟过期return Result.ok("查询成功",one);}
  1. 布隆过滤器
    在缓存前加一层布隆过滤器
    快速判断数据是否存在,不存在则直接返回
    布隆过滤器如果判断不存在一定不存在,如果判断存在不一定存在
    优点:
    空间效率极高:不需要存储元素本身
    查询时间快:O(k)时间复杂度(k通常很小)
    安全:不存储原始数据,适合敏感数据场景
    缺点:
    存在误判(False Positive):可能判断存在的元素实际不存在
    不能删除元素:标准布隆过滤器不支持删除操作
    不能获取元素:仅能判断存在性,不能获取元素内容

缓存击穿

问题描述:热点key过期瞬间,大量请求直接打到数据库

  1. 设置热点数据永不过期
    物理不过期:不设置TTL过期时间
    逻辑过期:值中包含过期时间字段,异步刷新

创建RedisDataExpire记录过期时间

@Data
public class RedisDataExpire 
{private Object o;private LocalDateTime expire;
}
	private static final String LOCK = "shop:lock:"; @GetMapping("expireGet")public Result expireGet(@RequestParam Integer pid){//redis keyString key = PRODUCT_PRE+pid;//1.redis查询RedisDataExpire redisDataExpire = (RedisDataExpire)redisTemplate.opsForValue().get(key);//如果redis没查到去数据库查询//数据为空或者数据过期if(redisDataExpire == null || redisDataExpire.getExpire().isBefore(LocalDateTime.now())){String lockKey = LOCK + pid;//上锁if(redisTemplate.opsForValue().setIfAbsent(lockKey, "lock", 60, TimeUnit.SECONDS)){//异步处理Thread t = new Thread(){@Overridepublic void run() {try {//查询数据库QueryWrapper<Products> qw = new QueryWrapper<>();qw.eq("product_id",pid);Products one = productsService.getOne(qw);if(one == null){throw new RuntimeException("数据不存在");}//创建对象,将数据库查到的对象放进去RedisDataExpire data = new RedisDataExpire();data.setO(one);data.setExpire(LocalDateTime.now().plusSeconds(30));//设置30秒后过期redisTemplate.opsForValue().set(key,data);//设置10分钟过期}finally {redisTemplate.delete(lockKey);//解锁}}};t.start();//线程开始}}//如果为空就返回空数据,如果不为空就返回Productsreturn Result.ok("查询成功",redisDataExpire==null?null:redisDataExpire.getO());}
  1. 互斥锁(Mutex Lock):
	private static final String LOCK = "shop:lock:"; @GetMapping("mutexGet")public Result mutexGet(@RequestParam Integer pid) {//redis keyString key = PRODUCT_PRE+pid;//1.redis查询Products products;while( (products = (Products)redisTemplate.opsForValue().get(key)) == null) //如果查不到数据就阻塞在这里{//上锁的keyString lockKey = LOCK + pid;//设置过期时间,防止死锁//上锁,将其它线程阻塞、if (redisTemplate.opsForValue().setIfAbsent(lockKey, "lock", 60, TimeUnit.SECONDS)) {try {//查询数据库QueryWrapper<Products> qw = new QueryWrapper<>();qw.eq("product_id", pid);Products one = productsService.getOne(qw);if (one == null) {throw new RuntimeException("数据不存在");}redisTemplate.opsForValue().set(key, one, 10, TimeUnit.MINUTES);//设置10分钟过期}finally {redisTemplate.delete(lockKey);//解锁}}}return Result.ok("查询成功",products);}
  1. 缓存预热:
    系统启动时加载热点数据

缓存雪崩

问题描述:大量缓存同时失效,导致所有请求直接访问数据库

缓存穿透解决方案:

  1. 过期时间随机化
  2. 高可用架构:
    Redis集群部署
    哨兵模式或Cluster模式保证高可用
  3. 熔断降级机制:
    当数据库压力过大时,返回降级数据或默认值

项目Demo

https://gitee.com/xi-ri/cache-redis

http://www.dtcms.com/wzjs/181880.html

相关文章:

  • 做网站一个月能挣多少seo搜索引擎的优化
  • 高青网站建设重庆百度地图
  • 如何查看网站建设的时间关键词优化排名seo
  • 手机版网站建设价格网络广告推广服务
  • 深圳宝安区最新疫情seo专员岗位职责
  • 都匀市政府网站建设新产品宣传推广策划方案
  • 网站建设的背景意义广州百度推广代理公司
  • 企业网站建设模板多少钱网站推广与优化方案
  • 郑州企业网站制作公司58百度搜索引擎
  • 做一个网站需要什么条件做一个私人网站需要多少钱
  • 免费中介系统房产软件泰安网站seo推广
  • 做装修公司网站费用外链代发2分一条
  • 个人手机网站建设网络营销网站建设
  • 网站地址怎么申请注册网站seo外链
  • 做网站seo赚钱吗乔拓云智能建站
  • 西安网站北京营销公司比较好的
  • 如何做网站呢2023年适合小学生的新闻
  • 咖啡的网站建设策划书专业精准网络营销推广
  • 定制商城网站的费用网站关键词推广工具
  • 个性化定制网站有哪些seo搜索引擎优化就业指导
  • 前端接私活一个页面多少钱优化最狠的手机优化软件
  • 吉安做网站我为什么不建议年轻人做销售
  • 调用其他网站文章列表太原seo优化
  • 郑州做网站建设公司排名个人域名注册流程
  • 通化网站建设怎么样把广告做在百度上
  • 临漳+网站建设百度关键词价格查询软件
  • 服装商店的网站建设要求直播引流推广方法
  • CSS3网站开发如何找客户资源
  • java电商网站模板做销售怎么和客户聊天
  • 西安网站建设 盈科成都网站制作费用