1 分布式缓存常见的技术选型方案有哪些?
Redis、Memcached
2 说一下有缓存情况下查询数据和修改数据的流程
修改流程:
1 先写db,在写缓存
先写缓存,在写db;
2 先更新db,再删除缓存
先删除缓存,再更新数据库
3 延迟双删
3 redis有哪些数据结构,sds了解么
Redis有5大类型,string、list、hash、set、sort set
SDS字符串类型(简单动态字符串)
sdshdr
len 5
alloc 10
flags 1
buf -->[ | | | | | …]
4 Redis内存满了怎么办?
增加redis内存大小
删除过期数据
使用Redis持久化
redis内存淘汰算法:LRU RFU 是否到过期时间
redis给缓存设置过期时间,可以惰性删除和定时删除
5 Redis事务
可以通过Multi\exec、discard和watch等命令实现事务功能
6 缓存穿透和缓存雪崩了解过么?有哪些解决办法?
雪崩、击穿、穿透
缓存同时过期或者夯机;热点问题;恶意攻击访问没有值
前两个都是让大量缓存同时失效:给过期时间+随机值
服务降级
防御式编程;布隆过滤器
7 如何基于redis实现分布式锁
先说下分布式锁(性能高->低):
缓存
zk
数据库唯一值
redis分布式锁方案:
1 setnx + expire
2 setnx + value值(系统时间+过期时间)
3 lua脚本(包含setnx + expire两条指令)
4 Redisson框架
redission是假设在redis基础上的一个java主内存数据网络,redission在NIO的Netty框架上,生产环境使用分布式锁
执行步骤
1 根据负载均衡策略选择一个redis主节点。
2 执行lua脚本加锁,加锁成功返回null,否则返回当前锁的剩余过期时间。
3 watchlog机制,定时线程给当前锁每个10s执行一次续命
4 获取锁成功,则return,失败则自旋获取锁。