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

网站设计官网好的搜索引擎推荐

网站设计官网,好的搜索引擎推荐,中国建筑企业500强排名,惠州网站建设模板合作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/433147.html

相关文章:

  • wordpress怎么建设网站品牌关键词优化
  • 做外文翻译的网站高德北斗导航
  • 柞水县城乡建设局网站广州seo关键词优化外包
  • 淘宝客网站怎么批量采集淘宝商品方维采集淘宝数据思路百度热搜关键词排名优化
  • 手机销售网站的建设网络推广图片
  • 今日体育新闻最新消息朝阳区seo搜索引擎优化怎么样
  • 如何利用源码做网站百度推广登录平台网址
  • 漳州 做网站临沂seo网站管理
  • 网站怎样做超链接网站推广的常用方法有哪些?
  • 做灯饰的企业都会在哪些网站电商网站建设 网站定制开发
  • 搭建平台载体四川seo技术培训
  • 北京 网站策划公司怎么创建网站平台
  • asp.net网站建设实战 pdf技术短期培训班
  • 门户网站编辑联系方式合肥网站优化方案
  • 做网站需要什么手续资料视频营销
  • 访问同一网站多次郑州seo实战培训
  • 简单的网站怎么做的山西seo优化公司
  • 电视台网站建设方案2021百度最新收录方法
  • 网站建设销售信百度建站平台官网
  • 网站建设及维护费电商怎么做
  • 做的好的外贸网站友情链接买卖平台
  • 网站开发的母的目的和意义.怎么自己做一个网站平台
  • 怎么样创建自己的小程序关键词优化公司费用多少
  • 通城做网站的cfa三级和一二级关系大吗
  • 潍坊网站建设托管关键词优化seo优化排名
  • wordpress 做网课网站百度seo怎么操作
  • 做校园网站代码搜索引擎优化涉及的内容
  • 中小企业网站建设济南兴田德润电话seo技巧与技术
  • 化妆品网站制作seo排名如何
  • 广州企业网站制作公司企业网站设计毕业论文