1. MySQL 和 Redis的区别
2. Redis 和 memcached 的区别
Redis 和 memcached 都是从内存中读取,memcached比Redis读取更快,
但是redis有很多优点
- redis支持更丰富的数据类型,memcached只支持String。
- Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,而Memecache不支持。
- memcached没有原生的集群模式,但是 redis支持集群.
- Memcached是多线程;Redis使用单线程的多路 IO 复用模型。
3. Redis的数据结构
- 字符串String
- 字典Hash
- 有序非唯一列表List
- 无序唯一集合Set
- 有序唯一集合SortedSet
4. Redis持久化
- RDB 全量的快照,默认5分钟备份一次
- AOF 增量的日志,实时追加
当Redis停机时,会先用RDB恢复到一个点,然后用AOF补缺
5. Redis缓存击穿、缓存雪崩、缓存穿透
缓存雪崩:
大面积的缓存失效,全部打在了数据库----过期时间随机值,热点key永不过期
缓存穿透:
不断发起数据库和缓存中都不存在的请求(因为数据库不存在,则不会再缓存中存储),导致数据库压力增大----布隆过滤器、限流
缓存击穿:
热点key失效的瞬间,大量请求打到数据库—热点key永不过期
6. 布隆过滤器
如何判断一个元素在亿级数据中是否存在?—布隆过滤器
7. Redis高可用,同步
高可用:
- 主从模式
读写分离,master写,slave读。master挂了需要手动切换 - 哨兵模式
主从模式的基础上又增加了哨兵角色来监听master,master挂了会自动选举新的master - 集群模式
无中心节点,数据分片存储,每一片都是一个多台机子组成的主从结构。互相监听
同步:
- 主从同步
首先从通知主,然后主备份rdb,发送给从,从更新
最后主再把备份期间的数据通过aof发送给从,从就全部同步完了
8. Redis保持热点数据
首先设置过期时间
然后是设置淘汰机制,最常用的是一个机制是:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key
9. Redis分布式锁
实现原理
利用setNx命令
- 返回1,当 key 的值被设置
- 返回0,当 key 的值没被设置
为了防止死锁,需要设上过期时间。并且要保证这两步的原子性,需要保证原子性
Redission
用lua脚本保证原子性
我们项目中调用方法需要的参数
- 锁的范围key,比如一个前缀+订单id,就是锁这票订单
- 获取锁超时时间
- 过期时间(大于业务执行时间,或者不设)
另外还提供了一个WatchDog来续期
默认的加锁时间为 30s。如果你自己自定义时间,超过这个时间,锁就会自定释放,并不会延长。Watch Dog 机制其实就是一个后台定时任务线程,会每隔10秒检查一下,如果还持有锁key,就会重新设置过期时间为30s
跟zk实现分布式锁的区别
原理:zk的非临时节点,加上节点是有顺序的。当我们获取锁时,会在zk上加一个临时节点,标记01.其他线程在获取锁时,会排在后面02.然后01锁释放后会通知02