聚划算 解决高并发下的缓存击穿 我做过我们公司的聚划算迷你版 有什么问题 删除和新加的时候总有人来查
(常用就是双端检索)(我们用双端加固来解决(两件防弹衣 主A缓存 从B缓存)(B存活20天A15天))
最后还可以业务上规避 到点了服务降级熔断 提示信息 但不好不见医用 占用了承诺用户的五分钟时间
分布式锁 单机版需要枷锁 Nginx 负载均衡和()下不同的jvm锁不住还是超卖 加入分布式锁 setIfAbSent(k,v)买完后删key 相当于多机器抢k 必须finally删掉有可能出异常 jar包挂了 没走到finally so k 需要过期时间 (设置锁和时间在一行 保持原子性) 又来了 张冠李戴 把别人抢到的锁删了 解决(只能自己删自己的)释放锁从数据库里捞出来看看个自己放进去的是不是同一个 又来了 判断和delete不是原子的鸭 (用脚本保持原子性) 又来了 Redis上面都是单机 几圈 AP 异步通知 主任说OK就可以 但主人刚OK就宕掉了 从机上位 表示我没有锁 cp银行 小组长都要确认通知到了— 所以我们自己写的不到位 需要Redisson 超简单 lua脚本也不用了 最后大招 锁 捞出来看看释放掉 可系 还未解决缓存续命 看门狗 解决加钟问题 必须多机 不然Redis突然宕机 over了 公司至少三台以上 官网推荐5台 Redis分布式解决不了分布式缓存问题ap 多主模式 主从模式主机宕掉 异步从机上位nonono(回顾下zk 主机宕掉了 所有都闭关选举 出新的了 出世)多个master (加锁类似可重入锁的condition) 缓存续命(看门狗) 检查持有锁的工作线程结束没 每隔着30/3=十秒检查下 每次重新续命为30秒 使用可简单了 api工程师lock 底层中间看门狗加三段lua脚本(首次新建 同线程可重入 根据返回时间确定锁还有多久过期)unlock 底层还是lua三段(判断是否同线程的锁 判断可重入锁>0刷新过期时间 小于0删K释放锁) Redis 的三大删除策略 立刻删(时间换空间) 惰性删(空间换时间) 中和定期删(抽样有漏网之鱼) 过期淘汰策略 8种 不要使用默认 使用 Allkey-lru Java一切皆对象 Redis 一切皆字典(k,v)键值对 C语言底层dictEntry(进行封装)=程序员RedisObjdect 同一个类型有三种编码格式(精确利用并节约内存) 在long取值范围内的数值int 超过embstr 长度超过44字节raw sds 可伸缩字符串 (Redis把C语言字符串重新封装)
原来 去c字符串 char数组封装 时间O(n) Redis封装后O(1)直接拿了 缩短时采用惰性删除留着看看下次有没有用
只要对embstr进行更改一定会变成raw int紧凑 embstr不分家 raw分家过(通过指针) # 就是为了极致压榨性能减少内存碎片 Redis里用的hash 底层ziplist(默认 最大不要512字节 单个最大64字节)+hashtable(数组加链表) ziplist 一旦升级 hashtable 不能降级 课外(Hashmapjdk7存的是entry 8存的是 node 数组链表红黑树) why ziplist明明有链表 因为前指针和后指针比某一个entry还要大去掉了通过len确定位置 list 底层是quicklist->底层ziplist+linkedlist set底层 intset (512)和hashtable zset底层是ziplist 和skiplist(索引升级两两取首(二分))