1.基本类型
5大基本类型
a、String key-value(有点像map<key,value>) 一个键最大能存储512MB ---使用场景缓存/限流/秒杀
b、List 双向链表实现 栈有点像 -----栈/队列
c、Set java中hashset有点像-----抽奖/随机取值/差并集共同好友
d、Hash name-(key-value) 有点像map<name,hashmap<key,value>>------对象
e、Zset java中treeset有点像 -----有序集合排行榜
特殊结构
f、Geo地理位置详解
g、Hyperloglong基数统计
h、Bitmap
2.持久化
1.RDB(默认)
创建一个fork子进程,按照一定的时间周期策略把内存数据快照到rdb文件
2.AOP
以日志的形式来记录每个写操作,每次命令都会追加到文件最后
3.场景
订阅发布(消息队列)
4.主从复制,哨兵模式(主写重读)
5.缓存穿透、缓存击穿、缓存雪崩(宕机)布隆过滤器
1.缓存穿透(秒杀)布隆过滤器、将null变成一个值
2.缓存击穿(0.01微博服务器宕机60s)分布式锁、限流、缓存永远不过期
3.缓存雪崩(宕机)
6.更新db删除缓存
1.先删除缓存再更新DB
结论:产生脏数据的概率较大(若出现脏数据,则意味着再不更新的情况下,查询得到的数据均为旧的数据)
比如:两个并发操作,一个是更新操作,另一个是查询操作,更新操作删除缓存后,查询操作没有命中缓存,先把老数据读出来后放到缓存中,然后更新操作更新了数据库。于是,在缓存中的数据还是老的数据,导致缓存中的数据是脏的,而且还一直这样脏下去了。
2.先更新DB再删除缓存(使用场景多)
结论:产生脏数据的概率较小,但是会出现一致性的问题;若更新操作的时候,同时进行查询操作,若hit,则查询得到的数据是旧的数据。但是不会影响后面的查询。(代价较小)
7.分布式锁
1. 加锁(key自定义,value为uuid)
Boolean setNX(byte[] key, byte[] value);
2.finally中释放锁
3.如果加锁宕机(死锁):设置过期时间
4.如果加锁成功设置过期时间宕机没有原则性(死锁):api提供(加锁和超时时间同步)
5.如果业务时间超过超时时间就会锁失效(a释放了b的锁锁一直失效):开启新线程续命
redisson(api解决)