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 缓存穿透

如果缓存里面没有,则去数据库。这个现象是缓存穿透。

  • 可以对不存在的Key设置默认值,加入缓存
  • 布隆过滤。Bloom Filter。hash函数多,数组长度长则hash碰撞概率小。如果没有的话则打回。Bloom Filter 在Redis之前。(Bloom 要与DB同步)
1)雪崩

大量Key都失效。一下给数据库带来很大压力。

  1. 可以的失效期分散一些
  2. 设置二级缓存(数据不一定一致)
  3. 高可用(可能是脏读。主从模式)
2)缓存击穿

Key有,但是访问量很大。某个热点Key失效了。

  • 用分布式锁,控制访问量
  • 不设超时,会造成一致性问题

 

4.3 缓存问题,数据不一致

update db数据但没update,删除redis,高并发时候又有请求,把旧数据又读出来了。

  • 延时双删,更新时候删一次,两秒后再删一次
  • 设置缓存过期时间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则设置成功,则获得锁。

 

posted @ 2024-03-22 17:38  ylxn  阅读(3)  评论(0编辑  收藏  举报