1@CalLimitAnno(count = 1000)2 public void testPageAnno(){3 System.out.println("成功执行");4 }Map 优化
上述我们将 package + className + methodName 作为唯一 key,导致 key 的长度变得特别长,我们是不是该想个办法降低 key 的长度 。
大家有没有想到平时收到的短信,有时候会存在一个短链接,这些短连接其实就是用的发号器 --> 从某个服务中获取唯一的自增id,然后将这个 id 进行转化 。比如这时候自增到 100000 了,那么将 100000 从十进制转化为 62 进制 q0U 。这个和短信上的链接很相似不是吗?
Map 持久化
既然是自增的,那么相同的长字符通过调用服务转化成的短字符串都是不同的 。在某些业务场景,可能调用比较频繁,就需要做kv存储 。不然也没有必要做存储了,多做多错嘛~
kv 存储优化
假设我们需要做 kv 存储,童鞋们能想到的大概也就是 jvm 内存或者 redis 了 。因为这个对应关系一般是不会长久存储的,通常在某个热点事件中作为查询 。如果是 redis,可以设置过期时间作为驱逐 。那么在 jvm 内存中,我们需要考虑到的是 LRU 。即最近最常使用:
- 使用过的 key 需要放到队列的队首 。
- 最不经常使用的一旦超过队列限制的长度,需要将其删除 。
GET
- 假设这个 key 不存在,那么返回 null 。
- 假设 key 存在,需要返回值的同时,需要将对应的 key 删除,并且将 key 放到队首 。
那就只剩下链表了如 LinkedList,但是 LinedList 查询时需要遍历链表 。如果我们在存入 LinkedList 的同时,同样存入 map,那是不是就行了 。当然 。。。。不是啦,这个 map 有个要求,node 需要保存上一个节点,这样在查到值的同时,获取前一个节点,就可以在链表中删除对应的节点了 。
PUT
- 假设 key 不存在,放入队首 。
- 假设 key 存在,删除这个 key,同时放到队首 。
结尾这边不考虑并发导致的线程不安全哈,只是一个参考~~ 讲了大半天,大家应该还是有些会看不明白的,请下方留言 。没办法,语文差啊 。
推荐阅读
- 什么是“分布式事务”?这回彻底懂了
- 安化黑茶集散中心黄沙坪古茶市项目正式启动
- 感应式小便器需要电源吗,感应式小便器一直冲水停不住怎么办
- Raw\TIFF\JPEG 格式有什么区别,哪种更好用?
- 重庆,斗茶盛宴 中式时尚在茗香中绽放
- 淘宝无货源开店模式靠谱吗 怎么开无货源淘宝店
- 改变人生的4种思维方式,学会一个受益终生
- 律师有哪些取证方式?
- 立式冷热饮水机价格清单
- 新Edge启动IE模式 如何取消ie浏览器edge默认