braum源码分析(三)-cache的两种实现

开始

本篇开始分析package cache。

cacheObj

在这里插入图片描述
cacheObj用来记录访问数据,有2个属性,其中value用来存储单位时间(某个时间窗口,可以自定义时长)内ip访问次数,expire表示从第一次请求开始到时间窗口结束的时间戳。
例如,第一次访问,value=1,expire=当前时间戳+时间窗口长度,也就是期满时间。
存储的数据结构为:
private static final Map<String, CacheObj> STORE = new ConcurrentHashMap<>()
用这个数据结构可以表示某个ip在一定时间窗口内的访问次数。其中map的key用ip等关键值来生成,cacheObj存储访问数据。

cache接口

在这里插入图片描述
其中以下几个方法属于缓存比较基通用的方法。写入某个值,获取某个值,判断某个值是否村存在,删除某个值,获取某个值失效时间,清除缓存。

void set(String key, Integer value);
CacheObj get(String key);
Boolean hasKey(String key);
void del(String key);
long getExpire(String key);
default void clear();

还有两个方法 ,属于带有业务属性,下面看具体的实现。

void set(String key, Integer value, long delay, TimeUnit unit);
int incrementAndGet(String key);

cache接口的两种实现

在这里插入图片描述

ConcurrentHashMapCache
  1. 定期清理缓存
    通过CacheScheduler每5分钟清理过期无效的缓存,清除的标准是cacheObj.expire小于当前的时间戳System.currentTimeMillis()。
  2. 方法和锁
方法
set写锁
get读锁
hasKey读锁
del写锁
getExpire读锁
incrementAndGet无锁
  1. set方法写锁保护,防止多线程操作的时候出错。
    @Override
    public void set(String key, Integer value) {
        writeLock.lock();
        long delay = properties.getInterval();
        TimeUnit unit = TimeUnit.MILLISECONDS;
        try {
            CacheObj cacheObj = STORE.get(key);
            if (null == cacheObj) {
                this.set(key, value, delay, unit);
            } else {
                cacheObj.setValue(value);
                STORE.put(key, cacheObj);
            }
        } finally {
            writeLock.unlock();
        }
    }
  1. incrementAndGet的实现,这里每次访问请求把计数增加1,这里并没有显示调用锁,但是可以看到,这边get方法和set方法使用了读锁。
    @Override
    public int incrementAndGet(String key) {
        int value = 0;
        CacheObj cacheObj = get(key);
        if (null == cacheObj) {
            value = 1;
        } else {
            value = cacheObj.getValue() + 1;
        }
        this.set(key, value);
        return value;
    }

Redis的实现

由于redis是单线程操作,没有多线程并发的问题,所以相对比较简单。基本的方法都是调用BraumRedisAutoConfiguration里面的RedisTemplate来实现。

最后

更多源码解析关注我学源码网

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值