Redis在项目中的应用(点评)
一、缓存更新策略
主动更新策略
先删除缓存时,由于更新数据库耗时较多,在此期间如有另一线程查询缓存/数据库并写入缓存,则当前线程更新数据库后会导致缓存和数据库数据不一致,而反之出现不一致的概率要小得多。
二、缓存会出现的问题
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在项目中的应用(点评)相关推荐
- (五)Redis在项目中应用
目录 1. redis实现分布式锁 2. 订单或任务缓存 3. Redis和DB数据一致性 4. 大并发Redis穿透直接访问DB 5. 接口限流器 参考: Redis在项目中的运用总结 1. red ...
- Redis在项目中的地位及使用场景剖析
Redis在项目中的地位及使用场景剖析 一. redis 特点 所有数据存储在内存中,高速读写 提供丰富多样的数据类型:string. hash. set. sorted set.bitmap.hyp ...
- Redis在项目中的使用及性能测试(续)
[前言] 在上篇博文<SCPPO:Redis在项目中的使用及性能测试>中小编为大家分享了在程序中引入Redis以及性能的提升,不过遗留了功能的完善以及性能在服务器上的测试,咱们就一鼓作气, ...
- Redis在项目中的使用及性能测试
强烈推荐一个大神的人工智能的教程:http://www.captainbed.net/zhanghan [前言] 在上篇博文中为大家分享了<SCPPO:C#中Redis封装的类>,有了这个 ...
- 8.redis解决分布式session问题 、redis在项目中难点
a.什么是session session是一种会话技术,我们知道http是无状态协议的,就是这次连接传输数据后,下次连接服务器是不知道这次的请求是谁的,因此我们要做一个标记,让服务器知道每次请求是哪个 ...
- Redis在项目中合理使用经验总结
背景 Redis 是一个开源的内存数据结构存储系统. 可以作为数据库.缓存和消息中间件使用. 支持多种类型的数据结构. Redis 内置了 复制(replication),LUA脚本(Lua scri ...
- Redis 在项目中合理使用经验总结
背景 Redis 是一个开源的内存数据结构存储系统. 可以作为数据库.缓存和消息中间件使用. 支持多种类型的数据结构. Redis 内置了 复制(replication),LUA脚本(Lua scri ...
- 【精品】Redis在项目中的应用场景
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合). String 缓存 简单key-value存储 热 ...
- 一看就懂系列之 详解redis的bitmap在亿级项目中的应用
前言 这是一篇拖了很久的总结,项目中引入了redis的bitmap的用法,感觉挺高大上的,刨根问底,故留下总结一篇当作纪念. 说清楚几个问题: 1.bitmap的原理.用法. 2.bitmap的优势. ...
最新文章
- CentOS7系统ifconfig无法使用的解决方法
- PaddleOCR——Visual Studio 2019 环境下C++推理部署 CMake 编译解决方案
- PCB上走100A电流的方法
- 国家开放大学2021春1050金融理论前沿课题题目
- C#设计模式:迭代器模式(Iterator Pattern)
- Android 开发者成神之路!
- python内置max()、min()函数与Numpy自带的max()、min()函数性能对比分析
- axure通用元件库 Pc、Web端原型图组件库高保真UI rp源文件
- 黑莓7290无信号问题
- 正斜杠,又称左斜杠,符号是/;反斜杠,也称右斜杠,符号是\。
- python的文件操作:文件定位读写,重命名,删除等操作
- python画思维导图的英文_如何使用python做出思维导图
- 朵拉影像开发 冬天真的来了
- [OpenGL]导入obj文件
- 漂亮的蓝色风格网页设计作品欣赏(系列二)
- 《OpenDRIVE1.6规格文档》2
- 欧拉法、预估校正法(改进的欧拉法)与四阶龙格库塔法求解常微分方程的数值解C++程序
- 华三交换机使用U盘导入/出配置文件
- CSLA4正式版推出啦
- Windbg常用命令详解