一、缓存更新策略

主动更新策略

先删除缓存时,由于更新数据库耗时较多,在此期间如有另一线程查询缓存/数据库并写入缓存,则当前线程更新数据库后会导致缓存和数据库数据不一致,而反之出现不一致的概率要小得多。

二、缓存会出现的问题

1、缓存穿透

缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,于是缓存就永远不会生效,这些请求会被直接打到数据库上。

解决方案

2、缓存雪崩

缓存雪崩是指在同一时段大量的缓存key同时失效或者redis服务宕机,导致大量请求到数据库。

解决方案

3、缓存击穿

缓存击穿也叫热点key问题,就是一个被高并发访问并且缓存重建业务较复杂的key突然失效了,无数的请求访问会在瞬间给数据库带来巨大的冲击。

解决方案

(1)示意图:

(2)优缺点对比

互斥锁保证了一致性,牺牲了可用性,逻辑过期则相反。

三、超卖问题

 解决方案

乐观锁的关键是判断之前得到的数据是否被修改过,常见的方式有版本号法和CAS法。乐观锁的缺点是失败率高,需要做业务控制,如改成where id=10 and stock>0即可。

注意:更新数据时才用乐观锁

四、一人一单问题(防止一个用户抢多个券)

为了防止同一用户抢到多个券,可以先查询前查询当前用户-券的订单是否已经存在,但在多线程下,多个查询的结果可以均为0,然后做添加订单操作,这仍会导致部分用户抢到多个券。

 解决方案

单机情况下通过给用户加synchronized锁(内部维护锁监视器),但是集群模式下不行,多个JVM会有各自的锁,所以仍会出现一个用户抢了多个券的情况。解决方案是让多个JVM使用同一把锁,即分布式锁。

分布式锁:满足分布式系统或集群模式下多进程可见互斥的锁。

 基于redis的分布式锁

(1)可能出现的问题1

当线程1由于业务阻塞而锁时间到期释放锁,线程2就可以获取锁,在线程2执行业务时,线程1业务完成并释放了锁,就会出现新的并发问题。解决方案是在释放锁的时候,进行标识(线程id、uuid等)判断。

(2)可能出现的问题2

当线程1业务执行完并判断锁标识是否一致后,这时候却由于gc而出现阻塞,导致超时而释放了锁,于是线程2就可以获取锁。在线程2执行业务时,线程1的gc完成。由于线程1已经判断了锁因而可以直接释放锁,但此时redis锁是线程2的,这样就释放了线程2的锁,又会出现新的并发问题。

解决方案是在释放锁的时候,进行标识(线程id、uuid等)判断。

Redis在项目中的应用(点评)相关推荐

  1. (五)Redis在项目中应用

    目录 1. redis实现分布式锁 2. 订单或任务缓存 3. Redis和DB数据一致性 4. 大并发Redis穿透直接访问DB 5. 接口限流器 参考: Redis在项目中的运用总结 1. red ...

  2. Redis在项目中的地位及使用场景剖析

    Redis在项目中的地位及使用场景剖析 一. redis 特点 所有数据存储在内存中,高速读写 提供丰富多样的数据类型:string. hash. set. sorted set.bitmap.hyp ...

  3. Redis在项目中的使用及性能测试(续)

    [前言] 在上篇博文<SCPPO:Redis在项目中的使用及性能测试>中小编为大家分享了在程序中引入Redis以及性能的提升,不过遗留了功能的完善以及性能在服务器上的测试,咱们就一鼓作气, ...

  4. Redis在项目中的使用及性能测试

    强烈推荐一个大神的人工智能的教程:http://www.captainbed.net/zhanghan [前言] 在上篇博文中为大家分享了<SCPPO:C#中Redis封装的类>,有了这个 ...

  5. 8.redis解决分布式session问题 、redis在项目中难点

    a.什么是session session是一种会话技术,我们知道http是无状态协议的,就是这次连接传输数据后,下次连接服务器是不知道这次的请求是谁的,因此我们要做一个标记,让服务器知道每次请求是哪个 ...

  6. Redis在项目中合理使用经验总结

    背景 Redis 是一个开源的内存数据结构存储系统. 可以作为数据库.缓存和消息中间件使用. 支持多种类型的数据结构. Redis 内置了 复制(replication),LUA脚本(Lua scri ...

  7. Redis 在项目中合理使用经验总结

    背景 Redis 是一个开源的内存数据结构存储系统. 可以作为数据库.缓存和消息中间件使用. 支持多种类型的数据结构. Redis 内置了 复制(replication),LUA脚本(Lua scri ...

  8. 【精品】Redis在项目中的应用场景

    Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合). String 缓存 简单key-value存储 热 ...

  9. 一看就懂系列之 详解redis的bitmap在亿级项目中的应用

    前言 这是一篇拖了很久的总结,项目中引入了redis的bitmap的用法,感觉挺高大上的,刨根问底,故留下总结一篇当作纪念. 说清楚几个问题: 1.bitmap的原理.用法. 2.bitmap的优势. ...

最新文章

  1. CentOS7系统ifconfig无法使用的解决方法
  2. PaddleOCR——Visual Studio 2019 环境下C++推理部署 CMake 编译解决方案
  3. PCB上走100A电流的方法
  4. 国家开放大学2021春1050金融理论前沿课题题目
  5. C#设计模式:迭代器模式(Iterator Pattern)
  6. Android 开发者成神之路!
  7. python内置max()、min()函数与Numpy自带的max()、min()函数性能对比分析
  8. axure通用元件库 Pc、Web端原型图组件库高保真UI rp源文件
  9. 黑莓7290无信号问题
  10. 正斜杠,又称左斜杠,符号是/;反斜杠,也称右斜杠,符号是\。
  11. python的文件操作:文件定位读写,重命名,删除等操作
  12. python画思维导图的英文_如何使用python做出思维导图
  13. 朵拉影像开发 冬天真的来了
  14. [OpenGL]导入obj文件
  15. 漂亮的蓝色风格网页设计作品欣赏(系列二)
  16. 《OpenDRIVE1.6规格文档》2
  17. 欧拉法、预估校正法(改进的欧拉法)与四阶龙格库塔法求解常微分方程的数值解C++程序
  18. 华三交换机使用U盘导入/出配置文件
  19. CSLA4正式版推出啦
  20. Windbg常用命令详解

热门文章

  1. 最长不含重复字符的子串
  2. JVM语言Xtend优缺点速览
  3. Pandas数据分析——Task2
  4. 小程序 订阅消息 wx.requestSubscribeMessage 允许 拒绝 情况的返回 结果
  5. uploadify---jQuery多文件上传
  6. 关于mobi书籍文件合并
  7. 手把手教你入门Hadoop(附代码资源)
  8. VUE前端删除和批量删除
  9. Mobile(3)-攻防世界-APK逆向
  10. win10服务器修改远程密码,win10系统远程桌面保存密码后无法修改的解决方案...