Redis学习
1.1 缓存使用场景
- 1) 访问量很大的时候,DB数据在磁盘上。如果加入缓存,可以先去缓存读,如果没有再去DB读。可以减轻访问压力Redis没有锁,单线程、单进程。读11w / s, 写 8万 /s
- 2) 做Session分离
- 在各个Tomcat间复制
- 3)做分布式锁
- 4)做乐观锁
1.2 缓存的概念
缓存是在CPU上的高速存储。
- 前端也可以缓存。
- 浏览器缓存 (离线浏览,浏览器内部有缓存)
- APP缓存,(图片,SQLite)
- 网络端缓存 (Ningx)
- 边缘缓存
2.4 Lua与Redis
Lua是一个脚本语言。可以嵌入程序中。在Nginx上使用lua来实现高并发。Lua可以直接运行Redis。
4.2 缓存穿透 cache penetration
如果缓存里面没有,则去数据库。这个现象是缓存穿透。
- 可以对不存在的Key设置默认值,加入缓存
- 布隆过滤。Bloom Filter。hash函数多,数组长度长则hash碰撞概率小。如果没有的话则打回。Bloom Filter 在Redis之前。(Bloom 要与DB同步)
1)雪崩 cache avalanche
大量Key都失效。一下给数据库带来很大压力。
- 可以的失效期分散一些
- 设置二级缓存(数据不一定一致)
- 高可用(可能是脏读。主从模式)
2)缓存击穿 cache breakdown
Key有,但是访问量很大。某个热点Key失效了。
- 用分布式锁,控制访问量
- 不设超时,会造成一致性问题
4.3 缓存问题,数据不一致
update db数据但没update,删除redis,高并发时候又有请求,把旧数据又读出来了。
- 延时双删,更新时候删一次,两秒后再删一次 delay double delete
- 设置缓存过期时间10s
- 将删除缓存失败记录日志里面,然后用脚本删除
4.4 并发竞争
多个客户端set 同一个key。
1) 分布式锁 (setnx)+时间戳
setnx 如果没有才设置。获得一把锁分布式锁。
2)利用消息队列
把读写换成串行
Hot key
1)发现
- 统计
- 大数据平台计算
2)处理
- 把读到的数据放入tomcat的缓存
- 放入本地缓存
- redis备份 hot key
Big key。Value 大
删除时间长。备份复制时间慢。占用内存大
- 尽量不存在redis。如果要用redis可以单独存
- 可以拆key
4.6 分布式锁
本地锁是线程锁。
- 进程级别操作。让进程互斥。串行化,就是分布式锁
- 进程A获得锁(分布式锁,分布式锁有生命周期)
- 则进程A允许操作。进程A操作完后释放锁。
1)乐观锁 基于CAS
乐观锁 基于CAS
利用watch和redis的事务 可以实现秒杀。检测redisKey是否改变
2)悲观锁
利用set命令,如果结果是OK则设置成功,则获得锁。
谢谢!