Cache Travel-09-从零开始手写缓存框架(二)redis expire 过期原理及实现
前言
我们在 从零手写 cache 框架(一)实现固定大小的缓存 中已经初步实现了我们的 cache。
本节,让我们来一起学习一下如何实现类似 redis 中的 expire 过期功能。
过期是一个非常有用的特性,比如我希望登录信息放到 redis 中,30min 之后失效;或者单日的累计信息放在 redis 中,在每天的凌晨自动清空。
代码实现
接口
我们首先来定义一下接口。
...
2018-09-01 04:24:42 |
Cache
Cache Travel-09-从零手写 redis(一)FIFO 淘汰策略原理详解及实现
程序员的三高
前段时间有一位同事体检,体检医生说他三高。
我打趣道,程序员三高不是高性能、高并发、高可用吗?你是哪三高?
每一个追求性能的开发者,都对高性能孜孜不倦地追求着,而缓存是我们踏上这条高性能大道的必经之路。
小到 cpu 设计,大到服务分布式缓存,我们每时每刻都在接触缓存,今天我们就一起学习下缓存的发展之路,以及如何如何手写一个可以指定大小的 cache。
cache 发...
2018-09-01 04:24:42 |
Cache
Cache Travel-09-从零手写 redis(零)为什么手写 redis
redis 的重要性
做 java 的,天天喊着高性能,高并发,高可用。
高性能之中,基本上都离不开 redis。
特别是在当今对于性能要求越来越高的时代,mysql 等传统数据库越来越需要与 redis 结合,这样才能更好的适应我们的业务。
以前手写过一次 hades,觉得不满意,就废弃了。
本次重新再写一次。
开源地址:
https://github.com/houb...
2018-09-01 04:24:42 |
Cache
Cache Travel-08-更好的使用缓存
基本概念
在合理应用缓存前,需要了解缓存领域里相关的几个常用术语:
1)缓存命中:表示数据能够从缓存中获取,不需要回源;
2)Cache miss:表示没有命中缓存,如果缓存内存中还有内存空间的话,会将数据加入到缓存中;
3)存储成本:当没有命中缓存时,回源获取后会将数据放置到存储中,整个将数据放置到存储空间所需要的时间以及空间称之为存储成本;
4)缓存失效:当源数据发生变更后,意...
2018-09-01 04:24:42 |
Cache
Cache Travel-07-如何正确的缓存
业务场景
本文讨论的是对于按需创建的数据库记录,如何实现缓存?
获取 id
例如,考察一个按需创建Account并返回其ID的函数:
@Transactional
public Long getAccount(Long userId, String currency) {
String key = buildCacheKey(userId, currency);
Lo...
2018-09-01 04:24:42 |
Cache
Cache Travel-06-Tair
Tair
Tair is fast-access memory (MDB)/persistent (LDB) storage service.
Using a high-performance and high-availability distributed cluster architecture, Tair can meet businesses’ high requirement...
2018-09-01 04:24:42 |
Cache
Cache Travel-05-LRUMAP
LRU
本文通过对 Apache Commons Collections 项目中 LRUMap 这个集合类的源代码进行详细解读,为帮助大家更好的了解这个集合类的实现原理以及使用如何该集合类。
算法简介
首先介绍一下LRU算法。
LRU 是由 Least Recently Used 的首字母组成,表示最近最少使用的含义,一般使用在对象淘汰算法上。也是比较常见的一种淘汰算法。
简单的实...
2018-09-01 04:24:42 |
Cache
Cache Travel-04-in action
优化方案
限额限次短期优化方案:
基础方案
(1)添加 merId 过滤条件,便于命中联合索引。 (索引)
(2)每一层统计,次数和金额并行执行(从概率上来说,拦截是低概率,压力还是会到 mongodb )
fixed(2) 固定线程数2(并行)
注意日志的 logId
(3)添加表为对应业务的分表。(分表,效果一般)
(4)降低存储量。专门为限额建立表(降低单条数据量)
全...
2018-09-01 04:24:42 |
Cache