专栏首页阿林前端开发攻城狮缓存的实现核心方法有哪些
原创

缓存的实现核心方法有哪些

put()方法

  • put()方法可以将一个数据放入到缓冲区中。
  • 进行该操作后,postition的值会+1,指向下一个可以放入的位置。capacity = limit ,为缓冲区容量的值。

flip()方法

  • flip()方法会切换对缓冲区的操作模式,由写->读 / 读->写
  • 进行该操作后
    • 如果是写模式->读模式,position = 0 , limit 指向最后一个元素的下一个位置,capacity不变
    • 如果是读->写,则恢复为put()方法中的值

get()方法

  • get()方法会读取缓冲区中的一个值
  • 进行该操作后,position会+1,如果超过了limit则会抛出异常

rewind()方法

  • 该方法只能在读模式下使用
  • rewind()方法后,会恢复position、limit和capacity的值,变为进行get()前的值

clean()方法

  • clean()方法会将缓冲区中的各个属性恢复为最初的状态,position = 0, capacity = limit
  • 此时缓冲区的数据依然存在,处于“被遗忘”状态,下次进行写操作时会覆盖这些数据

mark()和reset()方法

  • mark()方法会将postion的值保存到mark属性中
  • reset()方法会将position的值改为mark中保存的值

使用展示

import java.nio.ByteBuffer;

public class demo1 {
    public static void main(String[] args) {
        ByteBuffer byteBuffer = ByteBuffer.allocate(1024);

        System.out.println("放入前参数");
        System.out.println("position " + byteBuffer.position());
        System.out.println("limit " + byteBuffer.limit());
        System.out.println("capacity " + byteBuffer.capacity());
        System.out.println();

        System.out.println("------put()------");
        System.out.println("放入3个数据");
        byte bt = 1;
        byteBuffer.put(bt);
        byteBuffer.put(bt);
        byteBuffer.put(bt);

        System.out.println("放入后参数");
        System.out.println("position " + byteBuffer.position());
        System.out.println("limit " + byteBuffer.limit());
        System.out.println("capacity " + byteBuffer.capacity());
        System.out.println();

        System.out.println("------flip()-get()------");
        System.out.println("读取一个数据");
        // 切换模式
        byteBuffer.flip();
        byteBuffer.get();

        System.out.println("读取后参数");
        System.out.println("position " + byteBuffer.position());
        System.out.println("limit " + byteBuffer.limit());
        System.out.println("capacity " + byteBuffer.capacity());
        System.out.println();

        System.out.println("------rewind()------");
        byteBuffer.rewind();
        System.out.println("恢复后参数");
        System.out.println("position " + byteBuffer.position());
        System.out.println("limit " + byteBuffer.limit());
        System.out.println("capacity " + byteBuffer.capacity());
        System.out.println();

        System.out.println("------clear()------");
        // 清空缓冲区,这里只是恢复了各个属性的值,但是缓冲区里的数据依然存在
        // 但是下次写入的时候会覆盖缓冲区中之前的数据
        byteBuffer.clear();
        System.out.println("清空后参数");
        System.out.println("position " + byteBuffer.position());
        System.out.println("limit " + byteBuffer.limit());
        System.out.println("capacity " + byteBuffer.capacity());
        System.out.println();
        System.out.println("清空后获得数据");
        System.out.println(byteBuffer.get());

    }
}

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

关注作者,阅读全部精彩内容

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python实现自省的方法有哪些?

    公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一...

    程序IT圈
  • Python实现自省的方法有哪些?

    公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一...

    用户1564362
  • Redis实现缓存,你应该懂的哪些思路!

    场景一:类似于微博,实现关注和被关注功能。 思路: 对每个用户使用两个集合类型键,用来存储关注别人的用户和被该用户关注的用户。当用户A关注用户B的时候,执行两步...

    思梦php
  • 用Redis构建缓存集群的最佳实践有哪些?

    Redis 从 3.0 版本开始,提供了官方的集群支持,也就是 Redis Cluser。Redis Cluster 相比于单个节点的 Redis,能保存更多的...

    码农架构
  • 功能点方法核心思想是什么?功能点估算方法有哪些优势?

    功能点方法的核心思想是把软件系统按照组件进行分解,从而确定系统的功能点数量。功能点方法是一种预测软件系统总规模的方法。通过量化系统功能来度量软件的规模,这种度量...

    软件造价评估联盟
  • 现有的实时直播互动技术有哪些实现方向?

    各类视频直播平台层出不穷,但是永远都逃不开实时性的话题。几年前,我们评价一个直播平台是否优秀的标准就是平台播放视频的实时性是否能控制在几秒之内,也就是低延迟,然...

    TSINGSEE青犀视频
  • 记录不存在则插入,存在则更新 → MySQL 的实现方式有哪些?

      我没想到她会来这一出,我从我爸碗里夹回我的鸡腿,对女儿说道:不是,你这样问问你爷爷

    青石路
  • xml 技术的有哪些方面?如何实现的?

    数据组装成 XML 文件,然后将 XML 文件压缩打包加密后通过网络传送给接收者,

    MickyInvQ
  • 【高并发】面试官:说说缓存最关心的问题?有哪些类型?回收策略和算法?

    作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。自开源半年多以来,已成功为十几家中小型企业提供了...

    冰河
  • 单点登录落地实现技术有哪些,有哪些流行的登录方案搭配?

    实现单点登录说到底就是要解决如何产生和存储那个信任,再就是其他系统如何验证这个信任的有效

    艾编程
  • 实现Android 获取cache缓存的目录路径的方法

    Android开发中,有时需要知道cache缓存的路径。我写了一个静态类,供大家能参考

    砸漏
  • redis 的过期策略都有哪些?内存淘汰机制都有哪些?手写一下 LRU 代码实现?

    所谓定期删除,指的是 redis 默认是每隔 100ms 就随机抽取一些设置了过期时间的 key,检查其是否过期,如果过期就删除。

    IT技术小咖
  • [NewLife.XCode]实体列表缓存(最土的方法实现百万级性能)

    NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netcore,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCo...

    大石头
  • seo排名注重哪些方法?实现seo排名的实操技巧

    作为一个网站优化者来说,seo排名显得尤为重要,只有获得了搜索引擎好的排名,才会被更多的搜索者检索,从而获取一定流量的增长或客源量的增加转化,对企业和个人都非常...

    梅子玩域名
  • 阿里面试题(1)redis的过期策略都有哪些?内存淘汰机制都有哪些?手写一下 LRU 代码实现?

    阿里面试题(1)redis的过期策略都有哪些?内存淘汰机制都有哪些?手写一下 LRU 代码实现...

    Java架构师必看
  • 面试:如何保证接口的幂等性?常见的实现方案有哪些?

    在说幂等性之前,我们先来看一种情况,假如老王在某电商平台进行购物,付款的时候不小心手抖了一下,连续点击了两次支付,但此时服务器没做任何验证,于是老王账户里面的钱...

    JAVA日知录
  • 如何高效实现图片搜索?Dropbox 的核心方法和架构优化实践

    当你寻找一张几年前某次野餐拍摄的照片时,你肯定不记得相机设置的文件名是“2017-07-0412.37.54.jpg”。

    深度学习与Python
  • 实现WordPress提交评论的时删除该页面的WP-Super-Cache缓存的方法

    这篇文章依然是围绕缓存问题展开的,lnmp 环境下的 WordPress 使用 WP-Super-Cache 插件,若要开启 mod_rewrite 缓存模式,...

    张戈
  • 29.MyBatis体系结构与工作原理

    启动MyBatis时要解析配置文件,包括全局配置文件和映射器配置文件,这里面包含了我们怎么控制MyBatis的行为,和我们要对数据库下达的指令,也就是我们的SQ...

    编程之心

扫码关注云+社区

领取腾讯云代金券