基于Python+OpenCV的图像搜索引擎(CBIR+深度学习+机器视觉)含全部工程源码及图片数据库下载资源

news2024/11/24 20:47:46

目录

  • 前言
  • 总体设计
    • 系统整体结构图
    • 系统流程图
  • 运行环境
  • 模块实现
    • 1. 数据预处理
    • 2. 定义图像描述符
    • 3. 索引化数据集
    • 4. 设计搜索引擎内核
    • 5. 执行搜索
  • 系统测试
    • 1. 处理数据集
    • 2. 执行搜索
  • 工程源代码下载
  • 其它资料下载

在这里插入图片描述

前言

本项目旨在开发一套完整高效的图像搜索引擎,为用户提供更加便捷的图片搜索体验。为了实现这一目标,我们采用了 CBIR(Content-based image retrieval)技术,这是目前主流的图像搜索方法之一。CBIR 技术基于图像内容的相似性来检索相似的图像,相比于传统的图像搜索方法,CBIR 技术具有更高的准确性和可靠性。

在项目中,我们基于 OpenCV 图像处理库实现了一个高效的图像搜索引擎。OpenCV 是一个广泛使用的开源计算机视觉库,提供了丰富的图像处理函数和算法,具有高效、稳定的特点。我们的搜索引擎利用 OpenCV 的图像处理功能实现了图像的特征提取、匹配和实际检测三个部分,从而有效地提高了图像搜索的精度和效率。

总之,本项目提供了一套完整的图像搜索引擎解决方案,采用 CBIR 技术、OpenCV 图像处理库和构图空间特征评价指标等技术手段,旨在提高图像搜索的精度和效率,为用户提供更加优质的图像搜索服务。

总体设计

本部分包括系统整体结构图和系统流程图。

系统整体结构图

系统整体结构如图所示。

在这里插入图片描述

系统流程图

系统流程如图所示。

在这里插入图片描述

运行环境

需要 Python 3.6 及以上配置,在 Windows 环境下推荐下载 Anaconda 完成 Python 所需的配置,下载地址:https://www.anaconda.com/。

Numpy:科学计算和矩阵运算工具,OpenCV 引用 Numpy 模块,安装 OpenCV 之前必须安装 Numpy 库。Numpy 下载地址: https://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy

OpenCV:Intel 开源计算机视觉库。由一系列 C 函数和少量 C++类构成,实现图像处理。和计算机视觉方面的通用算法。OpenCV 下载地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/#opencv

模块实现

本项目包括 5 个模块:数据预处理、定义图像描述符、索引化数据集、设计搜索引擎内核和执行搜索,下面分别给出各模块的功能介绍及相关代码。

1. 数据预处理

本项目采用 INRIA Holidays 数据集。包含个人假日照片、各种场景类型(自然、山、水和风景等),图像具有高分辨率。包含 500 个图像组,每组代表不同的场景或对象。第一幅图像是查询图像,正确的检索结果是该组的其他图像。

该数据集提供了未经处理的图像以及按不同方法提取的图像特征,本项目采用未经处理的数据集,下载网址:http://lear.inrialpes.fr/~jegou/data.php。也可以从我的资源库里面下载。

2. 定义图像描述符

本项目采用颜色空间描述符和构图空间描述符。

1) 定义颜色空间描述符

类成员 bins:记录 HSV 色彩空间生成的色相、饱和度及明度分布直方图的最佳 bins 分配。bins 分配过多则导致程序效率低下,匹配难度和匹配要求过分苛严;过少则导致匹配精度不足,不能表证图像特征。

成员函数 getHistogram(self, image, mask, isCenter):生成图像的色彩特征分布直方图。

Image:待处理图像,mask:图像处理区域的掩模,isCenter:判断是否为图像中心,从而有效地对色彩特征向量做加权处理。权重 weight 取 5.0。采用 OpenCV 的 calcHist()方法获得直方图,normalize()方法归一化。

# 颜色空间特征提取器

import cv2
import numpy
class ColorDescriptor:
    __slot__ = ["bins"]

    def __init__(self, bins):
        self.bins = bins

    # 得到图片的色彩直方图,mask为图像处理区域的掩模
    def getHistogram(self, image, mask, isCenter):
        # 利用OpenCV中的calcHist得到图片的直方图
        imageHistogram = cv2.calcHist([image], [0, 1, 2], mask, self.bins, [0, 180, 0, 256, 0, 256])
        # 标准化(归一化)直方图normalize
        imageHistogram = cv2.normalize(imageHistogram, imageHistogram).flatten()
        # isCenter判断是否为中间点,对色彩特征向量进行加权处理
        if isCenter:
            weight = 5.0  # 权重记为0.5
            for index in range(len(imageHistogram)):
                imageHistogram[index] *= weight
        return imageHistogram

    # 将图像从BGR色彩空间转换为HSV色彩空间
    def describe(self, image):
        image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
        features = []
        # 获取图片的中心点和图片的大小
        height, width = image.shape[0], image.shape[1]
        centerX, centerY = int(width * 0.5), int(height * 0.5)
        # initialize mask dimension
        # 生成左上、右上、左下、右下、中心部分的掩模。
        # 中心部分掩模的形状为椭圆形。这样能够有效区分中心部分和边缘部分,从而在getHistogram()方法中对不同部位的色彩特征做加权处理。
        segments = [(0, centerX, 0, centerY), (0, centerX, centerY, height), (centerX, width, 0, centerY),
                    (centerX, width, centerY, height)]
        # 初始化中心部分
        axesX, axesY = int(width * 0.75) / 2, int(height * 0.75) / 2
        ellipseMask = numpy.zeros([height, width], dtype="uint8")
        cv2.ellipse(ellipseMask, (int(centerX), int(centerY)), (int(axesX), int(axesY)), 0, 0, 360, 255, -1)
        # cv2.ellipse(ellipMask, (int(cX), int(cY)), (int(axesX), int(axesY)), 0, 0, 360, 255, -1)
        # 初始化边缘部分
        for startX, endX, startY, endY in segments:
            cornerMask = numpy.zeros([height, width], dtype="uint8")
            cv2.rectangle(cornerMask, (startX, startY), (endX, endY), 255, -1)
            cornerMask = cv2.subtract(cornerMask, ellipseMask)
            # 得到边缘部分的直方图
            imageHistogram = self.getHistogram(image, cornerMask, False)
            features.append(imageHistogram)
        # 得到中心部分的椭圆直方图
        imageHistogram = self.getHistogram(image, ellipseMask, True)
        features.append(imageHistogram)
        # 得到最终的特征值
        return features

2) 定义构图空间描述符

类成员 dimension:将所有图片归一化(降低采样)为 dimension 所规定的尺寸。由此才能够用于统一的匹配和构图空间特征的生成。

# 构图空间提取器

import cv2
# 将图片进行归一化处理,返回HSV色彩空间矩阵
class StructureDescriptor:
    __slot__ = ["dimension"]
    def __init__(self, dimension):
        self.dimension = dimension
    def describe(self, image):
        image = cv2.resize(image, self.dimension, interpolation=cv2.INTER_CUBIC)
        # 将图片转化为BGR图片转化为HSV格式
        image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
        # print(image)
        return image

3. 索引化数据集

对数据集中的每幅图像提取特征(HSV),并将保存在.csv 文件中,只需搜索其特征向量即可。本项目提取两个特征,分别保存在两个.csv 文件中:color_index.csv 为色彩空间特征,structure_index.csv 为构图空间特征。

#索引化数据集

import color_descriptor
import structure_descriptor
import glob
import argparse
import cv2

# 创建解析函数
searchArgParser = argparse.ArgumentParser()
searchArgParser.add_argument("-d", "--dataset", required=True,
                             help="Path to the directory that contains the images to be indexed")
searchArgParser.add_argument("-c", "--colorindex", required=True,
                             help="Path to where the computed color index will be stored")
searchArgParser.add_argument("-s", "--structureindex", required=True,
                             help="Path to where the computed structure index will be stored")
arguments = vars(searchArgParser.parse_args())

idealBins = (8, 12, 3)
colorDesriptor = color_descriptor.ColorDescriptor(idealBins)
output = open(arguments["colorindex"], "w")

# 色彩空间的特征存储
for imagePath in glob.glob(arguments["dataset"] + "/*.png"):
    imageName = imagePath[imagePath.rfind("\\") + 1:]  # 这里也是需要修改的
    image = cv2.imread(imagePath)
    features = colorDesriptor.describe(image)
    # 将色彩空间的特征写入到csv文件中去
    features = [str(feature).replace("\n", "") for feature in features]
    output.write("%s,%s\n" % (imageName, ",".join(features)))
# close index file
output.close()

idealDimension = (16, 16)
structureDescriptor = structure_descriptor.StructureDescriptor(idealDimension)
output = open(arguments["structureindex"], "w")

# 构图空间的色彩特征存储
for imagePath in glob.glob("dataset" + "/*.png"):

    imageName = imagePath[imagePath.rfind("\\") + 1:]
    image = cv2.imread(imagePath)
    structures = structureDescriptor.describe(image)
    # 将构图空间的色彩特征写入到文件中去
    structures = [str(structure).replace("\n", "") for structure in structures]
    output.write("%s,%s\n" % (imageName, ",".join(structures)))
# close index file
output.close()

4. 设计搜索引擎内核

类成员 colorIndexPath 和 structureIndexPath:记录色彩空间特征索引表路径和结构特征索引表路径。

成员函数 solveColorDistance(self,features,queryFeatures,eps = 1e-5):求 features和queryFeatures 特征向量的二范数,eps 是为避免除零错误。

成员函数 solveStructureDistance(self,structures,queryStructures,eps = 1e-5):同样是求特征向量的二范数。需作统一化处理,color 和 structure 特征向量距离相对比例适中,不可过分偏颇。

成员函数 searchByColor(self,queryFeatures)。使用 csv 模块的 reader 方法读入索引表数据:采用 re 的 split 方法解析数据格式。用字典 searchResults 存储 query 图像与库中图像的距离,键为图库内图像名 imageName,值为距离 distance。

成员函数 transformRawQuery(self,rawQueryStructures):将未处理的 query 图像矩阵转为用于匹配的特征向量形式。

成员函数 search(self, queryFeatures,rawQueryStructures,limit = 3):将searchByColor方法和 searchByStructure 的结果汇总,获得总匹配分值,分值越低代表综合距离越小,匹配程度越高,返回前 limit 个最佳匹配图像。

# 图片搜索内核

import numpy
import csv
import re


class Searcher:
    # colorIndexPath色彩空间特征索引表路径,structureIndexPath结构特征索引表路径
    __slot__ = ["colorIndexPath", "structureIndexPath"]

    def __init__(self, colorIndexPath, structureIndexPath):
        self.colorIndexPath, self.structureIndexPath = colorIndexPath, structureIndexPath

    # 计算色彩空间的距离,卡方相似度计算
    def solveColorDistance(self, features, queryFeatures, eps=1e-5):
        distance = 0.5 * numpy.sum([((a - b) ** 2) / (a + b + eps) for a, b in zip(features, queryFeatures)])
        return distance

    # 计算构图空间的距离
    def solveStructureDistance(self, structures, queryStructures, eps=1e-5):
        distance = 0
        normalizeRatio = 5e3
        for index in range(len(queryStructures)):
            for subIndex in range(len(queryStructures[index])):
                a = structures[index][subIndex]
                b = queryStructures[index][subIndex]
                distance += (a - b) ** 2 / (a + b + eps)
        return distance / normalizeRatio

    def searchByColor(self, queryFeatures):
        searchResults = {}
        with open(self.colorIndexPath) as indexFile:
            reader = csv.reader(indexFile)
            for line in reader:
                features = []
                for feature in line[1:]:
                    feature = feature.replace("[", "").replace("]", "")
                    findStartPosition = 0
                    feature = re.split("\s+", feature)
                    rmlist = []
                    for index, strValue in enumerate(feature):
                        if strValue == "":
                            rmlist.append(index)
                    for _ in range(len(rmlist)):
                        currentIndex = rmlist[-1]
                        rmlist.pop()
                        del feature[currentIndex]
                    feature = [float(eachValue) for eachValue in feature]
                    features.append(feature)
                distance = self.solveColorDistance(features, queryFeatures)
                searchResults[line[0]] = distance
            indexFile.close()
        # print "feature", sorted(searchResults.iteritems(), key = lambda item: item[1], reverse = False)
        return searchResults

    def transformRawQuery(self, rawQueryStructures):
        queryStructures = []
        for substructure in rawQueryStructures:
            structure = []
            for line in substructure:
                for tripleColor in line:
                    structure.append(float(tripleColor))
            queryStructures.append(structure)
        return queryStructures

    def searchByStructure(self, rawQueryStructures):
        searchResults = {}
        queryStructures = self.transformRawQuery(rawQueryStructures)
        with open(self.structureIndexPath) as indexFile:
            reader = csv.reader(indexFile)
            for line in reader:
                structures = []
                for structure in line[1:]:
                    structure = structure.replace("[", "").replace("]", "")
                    structure = re.split("\s+", structure)
                    if structure[0] == "":
                        structure = structure[1:]
                    structure = [float(eachValue) for eachValue in structure]
                    structures.append(structure)
                distance = self.solveStructureDistance(structures, queryStructures)
                searchResults[line[0]] = distance
            indexFile.close()
        # print "structure", sorted(searchResults.iteritems(), key = lambda item: item[1], reverse = False)
        return searchResults

    def search(self, queryFeatures, rawQueryStructures, limit=10):
        featureResults = self.searchByColor(queryFeatures)
        structureResults = self.searchByStructure(rawQueryStructures)
        results = {}
        #for key, value in featureResults.items():
           # results[key] = value + structureResults[key]
        for key, value in structureResults.items():
            results[key] = value + featureResults[key]
        results = sorted(results.items(), key=lambda item: item[1], reverse=False)

        return results[: limit]

5. 执行搜索

引入 color_descriptor 和 structure_descriptor。用于解析待匹配(搜索)的图像,获得色彩空间特征向量和构图空间特征向量。用 argparse 设置命令行参数。参数包括图片库路径、色彩空间特征索引表路径、构图空间特征索引表路径、待搜索图片路径,成索引表文本并写入.csv 文件。

# 执行搜索
import color_descriptor
import structure_descriptor
import searcher
import argparse
import cv2

# 构造解析函数
searchArgParser = argparse.ArgumentParser()
searchArgParser.add_argument("-c", "--colorindex", required=True,
                             help="Path to where the computed color index will be stored")
searchArgParser.add_argument("-s", "--structureindex", required=True,
                             help="Path to where the computed structure index will be stored")
searchArgParser.add_argument("-q", "--query", required=True, help="Path to the query image")
searchArgParser.add_argument("-r", "--resultpath", required=True, help="Path to the result path")
searchArguments = vars(searchArgParser.parse_args())

idealBins = (8, 12, 3)
idealDimension = (16, 16)

# 传入色彩空间的bins
colorDescriptor = color_descriptor.ColorDescriptor(idealBins)
# 传入构图空间的bins
structureDescriptor = structure_descriptor.StructureDescriptor(idealDimension)

queryImage = cv2.imread(searchArguments["query"])
colorIndexPath = searchArguments["colorindex"]
structureIndexPath = searchArguments["structureindex"]
resultPath = searchArguments["resultpath"]

queryFeatures = colorDescriptor.describe(queryImage)
queryStructures = structureDescriptor.describe(queryImage)
imageSearcher = searcher.Searcher(colorIndexPath, structureIndexPath)
searchResults = imageSearcher.search(queryFeatures, queryStructures)

cv2.imshow("Query", queryImage)
cv2.waitKey(0)
# 对搜索到的图片进行展示
for imageName, score in searchResults:
    queryResult = cv2.imread(resultPath + "/" + imageName)
    cv2.imshow("Result Score: " + str(100-int(score)), queryResult)#转换评分
    cv2.waitKey(0)

系统测试

本部分包括处理数据集和执行搜索。

1. 处理数据集

对 INRIA Holidays 数据集进行处理,分别提取色彩空间特征和构图空间特征,得到两个CSV 文件,如图 1和图 2所示。这里给出示例图像 100002.png,如图3所示,色彩空间特征如图 4 所示。在终端输入以下指令:

python index.py --dataset dataset --colorindex color_index.csv --structure structure_index.csv

dataset 为图片库路径,color_index.csv 为色彩空间特征索引表路径,structure_index.csv为构图空间特征索引表路径。

图1

图1 color_index.csv 文件内容

在这里插入图片描述

图2 structure_index.csv 文件内容

在这里插入图片描述

图3 示例图

在这里插入图片描述

图4 色彩空间特征

2. 执行搜索

给定待搜索图像,搜索机制对其进行特征提取、比对,匹配后输出结果并评分,同时可调节输出结果的个数。待搜索如图5所示、搜索结果原图最优如图6所示。

在终端输入以下命令:

python searchEngine.py -c color_index.csv -s structure_index.csv -r dataset -q query/pyramid.jpg

dataset 为图片库路径,color_index.csv 为色彩空间特征索引表路径。structure_index.csv为构图空间特征索引表路径,query/pyramid.jpg 为待搜索图片路径。这里给出示例图像100002.png 的搜索结果,输出结果个数为 3。

在这里插入图片描述

图 5 待搜索

在这里插入图片描述

图 6 搜索结果原图最优

工程源代码下载

详见资源下载

其它资料下载

如果大家想继续了解人工智能相关学习路线和知识体系,欢迎大家翻阅我的另外一篇博客《重磅 | 完备的人工智能AI 学习——基础知识学习路线,所有资料免关注免套路直接网盘下载》
这篇博客参考了Github知名开源平台,AI技术平台以及相关领域专家:Datawhale,ApacheCN,AI有道和黄海广博士等约有近100G相关资料,希望能帮助到所有小伙伴们。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/600901.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python程序大全(7)——一元一次、一元二次方程解及函数解析

🏆一、前言 从1月到6月一直没更新,学习太忙辣。马上就要暑假了,今天是六一儿童节,所以抽出空来更新更新。 本文讲述的是1元1次方程,1元2次方程的python解法。只用给出一般形式的系数和常数,自动给出方程的…

企业为什么要进行思维与创新内训?有什么好处?

产品思维和创新在现代产品开发和管理中具有重要作用。 产品思维是指在设计和开发产品过程中,综合考虑用户需求、市场趋势、技术发展等多方面因素,以实现产品的有效性、可用性、价值和竞争力。 创新则是通过引入新的想法、方法或技术,创造出新…

table表格排序,@sort-change=“sortChange“ 取消排序

table表格排序,sort-change"sortChange" 取消排序 点击的单个进行排序时,要求isAsc对应当前字段的排序顺序;值ascending,descending,null三种情况;若指定了列对应的prop,没有指定order的话,默认ascending; desc降序,asc升序,当点升…

《水经注地图服务》下载与安装步骤

概述 《水经注地图服务》(WeServer)是一款可快速发布全国乃至全球海量卫星影像的地图发布服务产品,该产品完全遵循OGC相关协议标准,是一个基于若干项目成功经验总结的产品。它可以轻松发布100TB级海量卫星影像,从而使…

【漏洞复现】海康威视iVMS综合安防系统任意文件上传漏洞复现 (在野0day)

文章目录 前言声明一、产品简介二、漏洞概述三、影响范围四、漏洞验证五、漏洞利用六、修复建议 前言 海康威视iVMS综合安防系统存在任意文件上传漏洞 ,攻击者可通过构造特定Payload实施对目标的攻击。 声明 本篇文章仅用于漏洞复现与技术研究,请勿利用…

chatgpt赋能python:Python中出现NaN的原因及相关处理方法

Python中出现NaN的原因及相关处理方法 介绍 Python是一种灵活、可扩展的编程语言,它已经成为科学计算、数据分析、人工智能等领域的重要工具。然而,在Python编程过程中,会出现一些比较特殊的问题,其中之一就是NaN。 NaN&#x…

基于html+css的图展示105

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

chatgpt赋能python:如何用Python编写抽奖程序

如何用Python编写抽奖程序 抽奖活动是很多企业和组织引发用户关注和参与的一种有效手段。而Python作为一种简单易学,功能强大,受欢迎的编程语言,它可以很好地帮助我们实现抽奖程序的编写。本篇文章将介绍如何用Python编写抽奖程序&#xff0…

本科毕业设计-软件工程-汽车销售客户关系管理系统

仅供学习参考,严禁盗用,商用!!! 摘 要 随着国家的快速发展,人民对物质生活的需求也在逐渐增加,其中汽车需求是当前人民最主要的增长需求之一。随着汽车市场的不断扩大,汽车销售公司…

光栅尺磁栅尺编码器4倍频脉冲计数器Modbus RTU模块 支持PNP和NPN输入

1、 信号输入 1路光栅尺磁栅尺编码器信号输入,可接NPN和PNP信号,通过命令设置输入类型。 2、 通讯协议 通讯接口: 1路标准的RS-485通讯接口。 通讯协议:支持两种协议,命令集定义的字符协议和MODBUS RTU通讯协议。模块自…

Debian11之基于kubeadm安装K8S(v1.26.0) 集群

Debian10之基于kubeadm安装K8S(v1.26.0) 集群 参考文章 原文链接:https://blog.csdn.net/qq_30818545/article/details/128056996 版权声明:本文为CSDN博主「大能嘚吧嘚」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出…

游戏封包加密方案解析

当下游戏市场已全面回暖,暑期档临近更将迎来大量新游上线,如此关键节点,游戏厂商应当更加注重游戏安全。 FairGuard发现近期游戏黑灰产攻击角度愈发刁钻,除了常见的内存修改外挂、注入挂,针对游戏封包破解的「脱机挂」…

Springboot项目开发常遇到的问题

一、Springboot,修改默认端口,无效 Springboot是一个轻量级Web开发工具。里面内嵌了tomcat,所以我们不需要安装tomcat了。但是多个项目放在一起的时候,总不能都访问8080端口吧。所以我们需要修改默认端口。 默认是8080&#xff0…

jQuery 基础知识

1.jQuery的使用 要想使用 jQuery 的话,我们必须先要官网上下载( http://jquery.com/ )3.7 到 4.0的开发版本就可以,下载到文件夹以后桌面都可以 ,然后拖动到代码编辑器根目录下即可 在需要使用 jQuery 的页面引入 j…

使用chartgtp写Android代码

<LinearLayout android:layout_width"match_parent" android:layout_height"match_parent" android:orientation"horizontal"> <TextView android:id"id/姓名" …

FME教程:批量提取面要素图形的拐点坐标到Excel,其他类型图形的坐标提取、输出可参考本文方法

目录 一、提取成果 二、实现过程 1.读取数据 2.分离内外边界 3.提取坐标 4.获取边界序号 5.坐标处理 6.数据输出 三、总结 今天给大家介绍使用FME提取几何图形拐点坐标&#xff0c;并输出到Excel中的案例。这里以shapefile格式&#xff0c;且内部存在环洞的面要素为例…

linux nohup命令如何使用?

Linux nohup 命令 nohup 英文全称 no hang up&#xff08;不挂起&#xff09;&#xff0c;用于在系统后台不挂断地运行命令&#xff0c;退出终端不会影响程序的运行。 nohup 命令&#xff0c;在默认情况下&#xff08;非重定向时&#xff09;&#xff0c;会输出一个名叫 nohup…

低价乱价问题怎么处理

消费者遇到商品价格混乱的时候&#xff0c;选择不购买即可&#xff0c;但是品牌商遇到线上低价、乱价的局面又怎么办呢&#xff0c;不处理当然是不可以的。品牌放任低价、乱价不管的后果就是&#xff0c;经销商流失、顾客流失、品牌价值受损。那品牌应如何解决低价问题呢。 什么…

《嵌入式存储器架构、电路与应用》----学习记录(二)

第3章 嵌入式动态随机存储器 6T SRAM存储单元由六个晶体管组成&#xff0c;单元面积相对较大。为了增加存储密度&#xff0c;eDRAM是SRAM最具有潜力的替代品&#xff0c;根据存储单元不同分类&#xff1a; 传统的单晶体管单电容的(1T1C)eDRAM&#xff0c;其存储单元由一种特殊…

Redis的缓存过期淘汰策略

Redis的缓存过期淘汰策略 一 面试题引入二 Redis内存满了怎么办&#xff1f;2.1 redis默认内存多少&#xff1f;在哪里查看&#xff1f;如何设置修改&#xff1f;2.2 如果Redis内存使用超出了设置的最大值会怎样&#xff1f; 三 Redis里的数据怎么没的&#xff1f;它如何删除呢…