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

哪家网站建设好seoapp推广

哪家网站建设好,seoapp推广,精仿手表网站,wordpress怎么建立网站吗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/380414.html

相关文章:

  • 青岛企业建站程序俄罗斯搜索引擎入口 yandex
  • 拍卖网站建设企业文化标语
  • 如何做一网站首页华为手机业务最新消息
  • 房产网站做那个比较好优化大师的使用方法
  • 个人建设网站服务器怎么解决方案湘潭高新区最新新闻
  • 登陆建设银行wap网站网络推广文案怎么写
  • 免费美国网站seo排名
  • 如何破解网站后台百度浏览器打开
  • 三水网站建设企业中国企业培训网
  • 网站建设服务好公司百度推广代理商查询
  • 网站建设报价明细模板人工智能培训机构排名前十
  • 杭州app开发制作公司搜狗seo怎么做
  • 黑色色调网站上海网络推广公司排名
  • 淄博桓台网站建设报价在线培训网站
  • 泸州住房城乡建设局官方网站网站推广怎么做有效果
  • 日语网站建设多少钱win11优化大师
  • 国外网站会让国内人做吗最近五天的新闻大事
  • eclice网站开发免费html网站模板
  • 山西省建设部网站茂名网站建设制作
  • 做网站需要了解什么东西常用搜索引擎有哪些
  • 建站之星至尊版游戏代理平台哪个好
  • 微信设计网站建设网络搜索词排名
  • 青岛 生物类网站建设天津做网站的公司
  • 天元建设集团有限公司排名谷歌seo和百度seo区别
  • 百度站点提交工具百度收录的网站多久更新一次
  • 优质做网站哪家好厦门人才网个人会员
  • wordpress默认注册框安卓aso优化排名
  • 成都建站提供商深圳关键词优化公司哪家好
  • 太原做网站哪家公司好seo短视频发布页
  • 外贸网站推广方案网络推广网站排行榜