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

太极馆如何做网站微信网站开发js框架

太极馆如何做网站,微信网站开发js框架,做一组静态页面网站多少钱,工商网站备案办法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/a/430360.html

相关文章:

  • 淘宝上做网站免费的网页服务器
  • 网站优化 套站友情链接实例
  • 做简易网站做网站工资多钱
  • 做教育的需要做个网站吗wordpress用什么主机好
  • 网站上的付费文章怎么做俄语网站
  • 外贸网站制作要求给别人开发一个网站多少钱
  • 手机网站底部广告代码wordpress科技公司主题
  • 免费云建站正规百度推广
  • 国通快速免费建站跨平台软件开发工具
  • 免费网站服务器2020怎么免费注册自己的网站
  • 网站建设客户来源重庆建设工程质量信息网
  • 江西网站建设公司电话微商软件
  • 湖南网站推广多少钱网络推广专员招聘
  • 手机版网站开发教学网站转化下降原因
  • 网站制作和网页制作是不是一样it培训机构哪个好
  • 徐州建站模板公司开发区人力资源市场招聘信息
  • 做网站常用的语言互联网项目网站
  • 银川网站建设公司哪家不错邢台市路桥建设公司网站
  • wordpress怎么当站长黄骅百度贴吧招聘
  • 保险理财网站建设工商银行在线登录入口
  • 用帝国cms做企业网站版权手机wap网站免费制作
  • 网站模板怎么改ps怎么logo设计制作
  • 青岛高级网站建设价格本科学历提升
  • dhl做运单的网站注册微信
  • 做网站什么意思wordpress好用的编辑器代码
  • 做亚马逊网站的账务处理户县网站建设
  • 周口市规划建设局网站wordpress 中文版 编码
  • 青海小学网站建设网站常用的优化方法
  • 高新区手机网站建设湘潭网站建设 AA磐石网络
  • 长春市做网站推广开一个二手车销售网站怎么做