Bitmap三级缓存+二次采样

本文探讨了Bitmap在Android应用中的缓存策略,详细介绍了三级缓存的原理及实现,包括内存缓存、SD卡缓存和网络下载。同时,文章也讲解了Bitmap的二次采样技术,用于在网络请求图片时进行尺寸压缩,减少内存占用。并提供了一个将Bitmap以50%质量压缩到SD卡的案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Bitmap三级缓存

一.为什么使用Bitmap三级缓存?

1.没有缓存的弊端:费流量,加载速度慢
2.加入缓存的优点:省流量,支持离线浏览

二.原理

在这里插入图片描述
思路:
1.从内存获取图片,如果存在,则显示;如果不存在,则从SD卡中获取图片
2.从SD卡中获取图片,如果文件中存在,显示,并且添加到内存中,否则开启网络下载图片

三.代码

(1).添加读写SD卡的权限和网络权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET"/>

(2)操作内存工具类:提供从内存中读写的方法,内存不能持久保存,可能过一会就会被回收掉

 //Lrucache存储工具类
public class LruUtils {
   
   
    //TODO 1:实例化LruCache对象
    private LruCache<String,Bitmap> lruCache;
    private long max=Runtime.getRuntime().maxMemory();//获得手机的最大内存
    public LruUtils(){
   
   
        lruCache=new LruCache<String,Bitmap>((int)max/8){
   
   //给内存大小,一般是最大内存的1/8
            //重写该方法返回每个对象的大小
            @Override
            protected int sizeOf(String key, Bitmap value) {
   
   
                return value.getByteCount();
            }
        };
    }
    //TODO 2:读图片
    public Bitmap getBitmap(String key){
   
   
        return lruCache.get(key);
    }
    //TODO 3:存图片
    public  void setBitmap(String key,Bitmap bitmap){
   
   
        lruCache.put(key,bitmap);
    }
}

(3).操作SD卡工具类:提供从SD卡中读写的方法

//TODO 读图片和写图片
public class SDUtils {
   
   
    //TODO 1:存图片:bitmap.compress()
    public static void setBitmap(String name,Bitmap bitmap){
   
   
        //获取路径存储图片
        if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
   
   
            File file=Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
            File file1=new File(file,name);
            //存储图片:bitmap对象---->SD卡
            try {
   
   
                //参数一 图片的格式 参数二 图片质量 0-100  参数三:输出流
                bitmap.compress(Bitmap.CompressFormat.JPEG,100,new FileOutputStream(file1));
            } catch (FileNotFoundException e) {
   
   
                e.printStackTrace(
### Redis 中布隆过滤器与 Bitmap 的使用场景 #### 布隆过滤器的特点及其在 Redis 中的应用 布隆过滤器(Bloom Filter)是一种高效的空间节约型概率数据结构,主要用于快速判断某个元素是否属于一个集合。这种特性使得其非常适合应用于需要频繁查询大量数据集成员关系的场合[^4]。 对于 Redis 来说,虽然本身并不直接提供原生支持的布隆过滤器模块,但是可以通过第三方扩展或者利用现有的命令组合来模拟实现这一功能。例如,在某些特定版本或通过安装额外插件的方式可以启用布隆过滤器的支持;而在其他情况下,则可能依赖于像 `SETBIT` 和 `GETBIT` 这样的底层指令配合哈希函数构建自定义解决方案[^2]。 #### Bitmap 特性概述 另一方面,Bitmap 是指由一系列二进制位组成的序列,其中每一位都可以单独设置为0或1。Redis 提供了一组专门针对 bitmap 操作的功能,允许用户方便地执行按位运算以及统计操作。由于每个 bit 只占用一位存储空间,因此当面对海量布尔状态记录需求时显得尤为经济有效[^1]。 #### 实现方式对比 - **布隆过滤器** - 利用多个独立散列函数将输入映射到固定长度的比特向量上; - 对应位置设为 true (即置1),以此表示该元素已被加入过; - 查询时只需检查对应索引处的状态即可得出结论; - 存在误报的可能性——即认为不存在但实际上存在的情况,但绝不会漏检真正存在过的项目。 - **Bitmap** - 主要是用来保存大量的布尔值信息; - 支持高效的批量更新和读取; - 不涉及复杂的算法逻辑,更侧重于简单直观的数据表达形式。 #### 使用场景分析 - **布隆过滤器适用范围** - 缓存穿透防护:防止恶意请求绕过缓存层直击数据库造成压力过大; - 黑名单管理:快速筛选出已知不良行为者而不必每次都访问持久化存储; - URL 去重:辅助网络爬虫识别并忽略重复抓取的内容资源。 - **Bitmap 应用领域** - 用户签到打卡系统:每天标记一次完成相应动作的时间戳; - 统计在线人数变化趋势:每分钟采样当前活跃连接数的变化曲线; - 大规模权限控制机制:精细化设定不同角色所能触及的操作权限列表[^3]。 综上所述,尽管两者都涉及到位级操作的概念,但在实际应用中的侧重点各有千秋。选择合适的技术方案取决于具体业务需求和技术栈现状等因素考量。 ```python import redis from hashlib import md5, sha1 def add_to_bloom_filter(r, key, item): """Add an element to the bloom filter.""" hashes = get_hashes(item) for h in hashes: r.setbit(key, h % 8 * 1024, 1) def check_in_bloom_filter(r, key, item): """Check if an element is possibly in the set represented by a bloom filter.""" hashes = get_hashes(item) return all(r.getbit(key, h % 8 * 1024) == 1 for h in hashes) def get_hashes(value): """Generate multiple hash values from one input value using different algorithms.""" algos = [md5, sha1] results = [] for algo in algos: hasher = algo() hasher.update(str.encode(value)) result = int(hasher.hexdigest(), base=16) results.append(result) return results r = redis.Redis(host='localhost', port=6379, db=0) add_to_bloom_filter(r, 'bloomfilter_key', 'example_item') print(check_in_bloom_filter(r, 'bloomfilter_key', 'example_item')) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值