浏览器知识点整理(三)存储

微机原理与接口技术知识点整理 本人:大学生一枚,只为分享经验知识。 微型计算机的体系结构: 主频:主时钟频率,CPU在单位时间内产生的时钟脉冲数。 执行部件EU,总线接口部件BIU,执行部件执行的同时,总线接口部件完成从存储器中预期后继指令的工作。 执行部件EU:负责全部指令的分析执行,并管理通用寄存器和标志寄存器。 通用寄存器组:包含4个数据寄存器(AX,BX,CX,DX),两个指针寄存器(BP,SP... 阅读详情

 

这篇文章整理浏览器的存储知识,主要是 Cookie、localStorage、sessionStorage、indexDB 等存储方式的介绍。

Cookie

Cookie 是服务器委托浏览器存储的一些数据,它让服务器有了“记忆能力”,它会在浏览器下次向服务器再发起请求时被携带并发送到服务器上。

Cookie 的工作过程

会用到两个字段:响应头字段 Set-Cookie 和请求头字段 Cookie。

  • 响应报文使用 Set-Cookie 字段发送“key=value”形式的 Cookie 值
  • 请求报文里用 Cookie 字段发送多个 Cookie 值

Cookie 的属性

Cookie 的生存周期:可以使用 Expires 和 Max-Age 两个属性来设置

  • Expires即过期时间,用的是绝对时间点,可以理解为“截止日期”(deadline)。
  • Max-Age用的是相对时间,单位是秒,浏览器用收到报文的时间点再加上 Max-Age,就可以得到失效的绝对时间。
  • Expires 和 Max-Age 可以同时出现,浏览器会优先采用 Max-Age 计算失效期。

Cookie 的作用域:让浏览器仅发送给特定的服务器和 URI,避免被其他网站盗用。

  • Domain 和 Path 指定了 Cookie 所属的域名和路径,浏览器在发送 Cookie 前会从 URI 中提取出 host 和 path 部分,对比 Cookie 的属性。
  • 如果不满足条件,就不会在请求头里发送 Cookie。

Cookie 的安全性:尽量不要让服务器以外的人看到。

  • HttpOnly:Cookie 只能通过浏览器 HTTP 协议传输,禁止其他方式访问,比如不能通过 JS 访问 Cookie,减少 XSS 攻击;
  • SameSite:SameSite 可以防范 XSRF(跨站请求伪造)攻击,设置成 SameSite=Strict 可以严格限定 Cookie 不能随着跳转链接跨站发送,而 SameSite=Lax 则略宽松一点,允许 GET/HEAD 等安全方法,但禁止 POST 跨站发送
  • Secure:表示这个 Cookie 仅能用 HTTPS 协议加密传输,明文的 HTTP 协议会禁止发送。

Cookie 的应用

  • 身份识别:Cookie 最基本的一个用途就是身份识别,保存用户的登录信息,实现会话事务
  • 广告跟踪:广告商网站(例如 Google),它会“偷偷地”给你贴上 Cookie 小纸条,这样你上其他的网站,别的广告就能用 Cookie 读出你的身份,然后做行为分析,再推给你广告。

Cookie 的特点

  • 数据生命周期:一般由服务器生成,可以设置过期时间
  • 数据存储大小:Cookie 的大小受限,一般为 4 KB
  • 与服务端通信:每次发起同域下的 HTTP 请求时,在 header 中都会携带当前域名下的 Cookie ,会影响请求的性能

Cookie 使用示例

// 读取网站下所有的 cookie 信息,获取的结果是一个以分号`;`作为分割的一个字符串
let allCookies = document.cookie;

// 往原来的已经存在的 cookie 中加入新的 cookie
document.cookie ="name=vincent";

// 还可以在后面加上可选择的选项键值对,如 domain、path、expires
document.cookie="name=vincent;domain=.test.com"

// 删除cookie,就是让这个 cookie 的 expires 过期,即设置这个 expires 的值为 0
document.cookie="name=vincent;domain=.test.com;expires=0");
复制代码

localStorage

这是一种持久化的存储方式,即说如果不手动清除,数据就永远不会过期。它是采用键值对的方式存储数据,按域名将数据分别保存到对应数据库文件里。相比 Cookie 来说,它能保存更大的数据。

localStorage 的特点

  • 数据生命周期:除非被清理,否则会一直存在
  • 数据存储大小:5M
  • 与服务端通信:不与服务端进行通信

localStorage 使用示例

// setItem() 设置属性
localStorage.setItem('name', 'vincent');

// getItem() 获取数据
let name = localStorage.getItem('name');

// removeItem() 移除某个属性
localStorage.removeItem('name');

// clear() 移除所有数据项
localStorage.clear();
复制代码

模拟实现一个 localStorage

class myLocalStorage {
  constructor() {
    this.store = {};
  }
  setItem(key, val) {
    this.store[key] = val;
  }
  getItem(key) {
    return this.store[key] || null;
  }
  removeItem(key) {
    delete this.store[key]
  }
  clear() {
    this.store = {};
  }
}
复制代码

实现过期时间功能

(function () {
  let getItem = localStorage.getItem.bind(localStorage)
  let setItem = localStorage.setItem.bind(localStorage)
  let removeItem = localStorage.removeItem.bind(localStorage)
  localStorage.getItem = function (keyName) {
    let expires = getItem(keyName + '_expires')
    if (expires && new Date() > new Date(Number(expires))) {
      removeItem(keyName)
      removeItem(keyName + '_expires')
    }
    return getItem(keyName)
  }
  localStorage.setItem = function (keyName, keyValue, expires) {
    if (typeof expires !== 'undefined') {
      let expiresDate = new Date(expires).valueOf()
      setItem(keyName + '_expires', expiresDate)
    }
    return setItem(keyName, keyValue)
  }
})()
复制代码

sessionStorage

sessionStorage 是一种会话级别的缓存,关闭浏览器时数据会被清除。

需要注意的是 sessionStorage 的作用域是窗口级别的,也就是说不同窗口之间保存的 sessionStorage 数据是不能共享的。

sessionStorage 的特点

  • 数据生命周期:数据在页面刷新后依然存在,但是关闭浏览器标签页之后数据就会被清除
  • 数据存储大小:5M
  • 与服务端通信:不与服务端进行通信

sessionStorage 使用示例

sessionStorage 与 localStorage 拥有统一的 API 接口:

// setItem() 设置属性
sessionStorage.setItem('name', 'vincent');

// getItem() 获取数据
let name = sessionStorage.getItem('name');

// removeItem() 移除某个属性
sessionStorage.removeItem('name');

// clear() 移除所有数据项
sessionStorage.clear();
复制代码

indexDB

indexDB 是 NoSQL 数据库,是一种支持事务的浏览器数据库,用于客户端存储大量结构化数据,包括文件、二进制大型对象。

indexDB 的特点

  • 数据生命周期:除非被清理,否则会一直存在
  • 数据存储大小:无限制
  • 与服务端通信:不与服务端进行通信

indexDB 使用示例

// 使用 indexedDB.open() 方法创建或打开数据库
var request = window.indexedDB.open(dbName, version); // 数据库名 版本号
// error 事件表示打开数据库失败
request.onerror = function (event) {
  console.log('创建或打开数据库失败');
};
// success 事件表示成功打开数据库
var db;
request.onsuccess = function (event) {
  db = request.result;
  console.log('创建或打开数据库成功');
};
复制代码

下面是我之前一个项目用到的 indexDB 的一些代码:

/**
1、数据库名(mydb)
2、版本号(1.0)
3、描述(Test DB)
4、数据库大小(2*1024*1024)
*/
var sqliteDB = function (db_name, size) {
  var _db = openDatabase(db_name, '1.0.0', '', size); // 生成或打开数据库
  var currSql = null;
  return {
    /**
     * 执行sql,回调返回影响条数
     */
    execute: function (sql, param, callback) {
      currSql = sql;
      // 参数处理
      if (!param) {
        param = [];
      } else if (typeof param == 'function') {
        callback = param;
        param = [];
      }

      this.query(sql, param, function (result) {
        if (typeof callback == 'function') {
          callback(result.rowsAffected);
        }
      });
    },

    /**
     * 执行sql,回调返回sql查询对象
     * 查询时,有数据返回数组,无数据返回0
     * 增删改时:返回int,影响条数
     * void query( string[, function])
     * void query( string[, array[, function]])
     */
    query: function (sql, param, callback) {
      currSql = sql;
      // 参数处理
      if (!param) {
        param = [];
      } else if (typeof param == 'function') {
        callback = param;
        param = [];
      }

      var self = this;
      // 只有一个参数
      _db.transaction(function (tx) {
        // 4个参数:sql,替换sql中问号的数组,成功回调,出错回调
        tx.executeSql(sql, param, function (tx, result) {
          if (typeof callback == 'function') {
            callback(result);
          }
        }, self.onfail);
      }, self.onTransactionFail);
    },

    executeSql: function (sql, param, callback) {
      currSql = sql;
      // _db.transaction(fn, success, error);
      //参数处理
      if (!param) {
        param = [];
      } else if (typeof param == 'function') {
        callback = param;
        param = [];
      }

      var self = this;
      // 只有一个参数
      _db.transaction(function (tx) {
        // 4个参数:sql,替换sql中问号的数组,成功回调,出错回调
        tx.executeSql(sql, param, function (tx, result) {
          if (typeof callback == 'function') {
            callback(result);
          }
        }, self.onfail);
      }, self.onTransactionFail);
      // console.log(sql);
    },
    /**
     * 插入,回调返回last id
     * void insert( string, object[, function])
     */
    insert: function (table, data, callback) {
      if (typeof data != 'object' && typeof callback == 'function') {
        callback(0);
      }
      var k = [];
      var v = [];
      var param = [];
      for (var i in data) {
        k.push(i);
        v.push('?');
        param.push(data[i]);
      }
      var sql = "INSERT INTO " + table + "(" + k.join(',') + ") VALUES(" + v.join(',') + ")";
      currSql = sql;
      this.query(sql, param, function (result) {
        if (typeof callback == 'function') {
          callback(result.insertId);
        }
      });
    },
    /**
     * 修改,回调返回影响条数
     * void update( string, object[, string[, function]])
     * void update( string, object[, string[, array[, function]]])
     */
    update: function (table, data, where, param, callback) {
      // 参数处理
      if (!param) {
        param = [];
      } else if (typeof param == 'function') {
        callback = param;
        param = [];
      }

      var set_info = this.mkWhere(data);
      for (var i = set_info.param.length - 1; i >= 0; i--) {
        param.unshift(set_info.param[i]);
      }
      var sql = "UPDATE " + table + " SET " + set_info.sql;
      if (where) {
        sql += " WHERE " + where;
      }
      currSql = sql;
      this.query(sql, param, function (result) {
        if (typeof callback == 'function') {
          callback(result.rowsAffected);
        }
      });
    },

    /**
     * 删除
     * void toDelete( string, string[, function]])
     * void toDelete( string, string[, array[, function]])
     */
    del: function (table, where, param, callback) {
      // 参数处理
      if (!param) {
        param = [];
      } else if (typeof param == 'function') {
        callback = param;
        param = [];
      }

      var sql = "DELETE FROM " + table + " WHERE " + where;
      currSql = sql;
      this.query(sql, param, function (result) {
        if (typeof callback == 'function') {
          callback(result.rowsAffected);
        }
      });
    },
    /***
     * 事务
     */
    transaction: function (fn, success, error) {
      var hookError = function (tx, e) {
        console.log(tx.message);
        if (error) error(tx, e);
      };
      _db.transaction(fn, hookError, success);
      //_db.transaction(fn, error,success);
    },
    /**
     * 查询,回调返回结果集数组
     * void fetch_all( string[, function] )
     * void fetch_all( string[, param[, function]] )
     */
    fetchAll: function (sql, param, callback) {
      currSql = sql;
      // 参数处理
      if (!param) {
        param = [];
      } else if (typeof param == 'function') {
        callback = param;
        param = [];
      }

      this.query(sql, param, function (result) {
        if (typeof callback == 'function') {
          var out = [];
          if (result.rows.length) {
            for (var i = 0; i < result.rows.length; i++) {
              out.push(result.rows.item(i));
            }
          }
          callback(out);
        }
      });
    },

    /**
     * 查询表的信息
     * table_name: 表名称,支持 % *,
     */
    showTables: function (table_name, callback) {
      this.fetchAll("select * from sqlite_master where type='table' and name like ?", [table_name], callback);
    },
    /**
     * 组装查询条件
     */
    mkWhere: function (data) {
      var arr = [];
      var param = [];
      if (typeof data === 'object') {
        for (var i in data) {
          arr.push(i + "=?");
          param.push(data[i]);
          //console.log('data.i:'+i);
        }
      }
      return {
        sql: arr.join(' , '),
        param: param
      };
    },
    onTransactionFail: function (tx, e) {
      showSqliteError(tx);
    },
    /**
     * 错误处理
     */
    onfail: function (tx, e) {
      console.log('sql error: ' + e.message);
      console.log('执行sql:' + currSql);
    }
  };
};
// 调用 initDataBase() 生成或打开数据库
function initDataBase() {
  fgDB = new sqliteDB(dbName, 1024 * 1024 * 2);
  initFGdb();
}
// 数据库表的内容
function initFGdb() {
  fgDB.transaction(function (tx) {
    // 用户表
    tx.executeSql('CREATE TABLE IF NOT EXISTS [user] (id VARCHAR2(32) PRIMARY KEY NOT NULL, name VARCHAR2(32), password VARCHAR2(32),phone VARCHAR2(32),  remark VARCHAR2(32), define VARCHAR2(32))');
  }, function () {
    console.log('创建数据库成功!');
  }, function (err) {
    console.log('创建数据库失败!');
    console.log(err);
  });
}

总结

  • Cookie 可以设置过期时间;存储大小一般为 4KB;会被携带在 header 上与服务端通信
  • localStorage 需要主动清理,否则会一直存在;存储大小为 5M;不参与服务端通信
  • sessionStorage 和 localStorage 类似,区别在于存储在页面关闭之后就清除
  • indexDB 需要主动清理,否则会一直存在;存储大小没有限制;不参与服务端通信

存储的使用:现在已经不建议使用 Cookie 来存储数据,当没有大量数据存储需求可以用 localStorage 和 sessionStorage,不怎么改变的数据用 localStorage,否则的话用 sessionStorage;而当有大量数据存储需求时可以使用 indexDB。

【CSP-J/S初赛知识点整理】 CSP-J/S初赛知识点整理 阅读详情

相关推荐

前端知识点整理

BOM(Browser Object Model)即浏览器对象模型,它提供了独立于内容而与浏览器窗口进行交互的对象,其核心对象是 window。参考链接:BOM主要对象属性方法总结。

老余的博客 1795

浏览器存储

浏览器存储

php_martin的博客 949

整理mysql的28个知识点

整理mysql26个知识点:1、MySQL的复制原理以及流程基本原理流程,3个线程以及之间的关联:主:binlog线程——记录下所有改变了数据库数据的语句,放进master上的binlog中;从:io线程——在使用start slave 之后,负责从master上拉取 binlog 内容,放进 自己的relay log中;从:sql执行线程——执行relay log中的语句;2、MySQL中myi...

灰太狼 4859

indexDB 基本用法总结

IndexedDB 属于非关系型数据库。(不支持SQL查询)键值对储存 IndexedDB 内部采用对象仓库(object store)存放数据。所有类型的数据都可以直接存入,包括 JavaScript 对象。对象仓库中,数据以"键值对"的形式保存,每一个数据记录都有对应的主键,主键是独一无二的,不能有重复,否则会抛出一个错误。异步 IndexedDB 操作时不会锁死浏览器,用户依然可以进行其他操作,这与 LocalStorage 形成对比,后者的操作是同步的。

qq_24418107的博客 1448

C语言面试部分知识点整理总结

1.运算符运算规则: 2.#include <head.h>与"head.h"的区别 <head.h> 表示这个头文件是一个工程或标准头文件,查找过程会首先检查预定义的目录,我们可以通过设置搜索路径环境变量或命令行选项来修改这些目录 "head.h" 表明该文件是用户提供的头文件,查找该文件时将从当前文件目录(或者文件名指定的其他目录)中寻找文件,然后在标准位置寻找文件 3.#与##在#define中的作用 #的作用是将后面的...

zhai_mu_mu666的博客 2443

国产存储器相关厂商整理汇总

由于之前需要搜寻相关国内存储器芯片,因此自己从网上查找了些许并整理汇总,便于随后的查询。如若对汝有用,也可参考。

qq_33812122的博客 2380

29.(问答题) 什么是本地存储的有效期?

参考答案: 微信JS-SDK:是开发者在网页上通过JavaScript代码使用微信原生功能的工具包,开发者可以使用它在网页上录制和播放微信语音、监听微信分享、上传手机本地图片、拍照等许多能力。 JSSDK使用步骤 步骤一:绑定域名 步骤二:引入JS文件 步骤三:通过config接口注入权限验证配置 步骤四:通过ready接口处理成功验证 步骤五:通过error接口处理失败验证 ...

weixin_46281185的博客 522

从安装到跑通第一个例程:Halcon 20.11深度学习版环境搭建全记录

本文详细记录了Halcon 20.11深度学习版环境搭建的全过程,从安装配置到运行第一个例程,特别针对CUDA版本冲突、算子验证和样本数据预处理等常见问题提供解决方案。通过实战案例展示PCB缺陷分类流程,帮助工程师快速掌握工业级图像处理技术,提升深度学习模型在工业质检中的应用效率。

weixin_28739079的博客 221

Web前端存储方式总结,可别说还不知道IndexedDB

浏览器存储的知识总结,localStorage,sessionStorage,cookie,IndexedDB和webSql,其中详述indexedDB的使用

wendZzoo的博客 2310

别再死记硬背了!用51单片机的AD/DA和PWM,亲手做个简易示波器信号发生器

本文详细介绍了如何利用51单片机的PWM和AD/DA功能制作简易示波器信号发生器。通过PWM模拟DAC输出波形,结合XPT2046 ADC进行信号测量,实现方波、三角波和正弦波的生成与显示。项目不仅成本低廉,还能帮助电子爱好者深入理解51单片机的核心功能,是理论与实践结合的绝佳案例。

weixin_28675839的博客 265

FC游戏金手指代码大全:亲测可用指南与内存修改原理

在计算机和游戏开发领域,内存修改是一项基础而强大的技术,它通过直接读写程序运行时内存中的数据,改变软件的行为和状态。其核心原理在于理解进程的内存地址空间布局,定位存储关键游戏变量(如生命值、金币数)的特定地址,并注入或锁定目标数值。这项技术的工程价值在于,它不仅能用于游戏辅助,更是软件逆向工程、漏洞分析和调试的重要实践手段。在怀旧游戏和模拟器场景中,内存修改以“金手指”或“作弊码”的形式广泛应用,帮助玩家自定义游戏体验。本文将聚焦FC(红白机)游戏,深入解析Game Genie码和Raw码两种主流金手指格式

weixin_30780649的博客 795

浏览器数据库IndexedDB初探

由于公司项目的订单系统架构中需要前端存储大量数据,然后分批次传给后端进行处理,所以一个前端存储技术的使用和探索就势在必行了。本文旨在介绍对于indexedDB数据库的使用

有财的博客 842

通达信双紫擒龙指标实战指南:从源码解析到精准安装

本文详细解析了通达信双紫擒龙指标的核心逻辑、源码获取与安全验证、安装流程及实战应用技巧。通过紫紫红黄四种颜色信号捕捉趋势转折点,结合MACD、布林通道和成交量加权算法,提升交易准确性。文章还提供了个性化设置、信号解读及常见问题解决方案,帮助投资者高效运用该指标。

weixin_29248611的博客 1054

Mysql知识点整理

组合索引的最左前缀原则是指,在查询时,MySQL会使用组合索引中的最左边的列(即索引定义中的第一个列)来进行查找,然后尽可能地使用接下来的列,直到遇到范围查询(例如。主要包括引擎(myisam和innodb),索引,索引类型,锁机制,事务特性,隔离级别,悲观锁乐观锁和字段类型等。INNER JOIN A INNER JOIN B ON A.id=B.id 只返回两表中匹配的行 两表的交集。1.事务的四大特性:原子性,一致性,隔离性,持久性。1)原子性:操作要么都全部完成,要么全部不完成。

Ivan_Leuang的博客 1892

pytest-bdd封装

简介 pytestbdd主要是用于代码封装 代码封装的好处: 1、提升代码复用率 2、提示测试效率 手工测试–使用框架0代码 流程+数据驱动 产品经理这样的不懂测试的人员–流程驱动 自动化测试–数据驱动 pytest-bdd:流程驱动封装 行为驱动–敏捷开发模式,消除开发/测试对需要了解的歧义 使用方式: 描述需求/用户场景 Feature(需求) Scenario(场景) Given(假设) When(操作步骤) Then(验证,清除) #新建feature 文件之前 需要提取安装支持featrue文.

liao_11的博客 2733

医疗AI多智能体资源调度:用Python构建高性能MCU资源池

本文介绍了医疗AI服务平台中多智能体资源争用问题的解决方案。作者设计了一个基于MCU(多点控制单元)理念的中央资源调度器,通过三层架构(资源抽象层、调度策略层、执行控制层)实现对GPU、API、数据库等医疗资源的统一管理。系统采用增强版信号量机制处理可计数并发资源,优化令牌桶算法管理速率资源,并支持急诊优先、配额限制、审计合规等医疗场景特殊需求。核心代码提供了带优先级抢占的并发控制和医疗专用令牌桶实现,可有效解决多智能体资源争用导致的优先级混乱、资源利用不均等问题。

AllenLV的博客 3219

Java核心知识点整理大全18-笔记

partition 中的每条 Message 包含了以下三个属性:offset,MessageSize,data,其中 offset 表 示 Message 在这个 partition 中的偏移量,offset 不是该 Message 在 partition 数据文件中的实际存储位置,而是逻辑上一个值,它唯一确定了 partition 中的一条 Message,可以认为 offset 是 partition 中 Message 的 id;消息,消息是不具名的,它由消息头和消息体组成。

私信up主,有惊喜 5457

为YOLOv11引入自适应特征融合模块(ASFF)

本文探讨了在YOLOv11中引入ASFF(自适应空间特征融合)模块以解决多尺度目标检测性能不均衡的问题。作者分析了传统FPN固定融合策略的缺陷,详细介绍了ASFF模块的实现原理,包括动态权重生成网络设计和特征融合机制。通过将ASFF集成到YOLOv11颈部网络,实现了特征在双向流动时的自适应融合,在复杂场景下mAP提升1.2%而推理时间仅增加3-5ms。文章还分享了训练调参技巧和部署注意事项,指出ASFF特别适合交通监控等目标尺度变化大的场景,但强调需根据实际需求平衡模型复杂度与性能。最后提供了工程实践建议

as1225120794的博客 320

PHP 面试知识点整理归纳

全文已整理补充完毕,以后还会继续更新文章里面的错误,以及补充尚不完善的问题。 该篇文章是针对Github上wudi/PHP-Interview-Best-Practices-in-China资源的答案个人整理 lz也是初学者,以下知识点均为自己整理且保持不断更新,也希望各路大神多多指点,若发现错误或有补充,可直接comment,lz时刻关注着。 由于内容比较多,没有直接目录,请自行对照 Gi...

PHP学习日志——地雷 1万+

Python从0到100(十九):Python标准库初探

哈希函数又称哈希算法或散列函数,是一种为已有的数据创建“数字指纹”(哈希摘要)的方法。哈希函数把数据压缩成摘要,对于相同的输入,哈希函数可以生成相同的摘要(数字指纹),需要注意的是这个过程并不可逆(不能通过摘要计算出输入的内容)。举一个简单的例子,用户注册时我们希望在数据库中保存用户的密码,很显然我们不能将用户密码直接保存在数据库中,这样可能会导致用户隐私的泄露,所以在数据库中保存用户密码时,通常都会将密码的“指纹”保存起来,用户登录时通过哈希函数计算密码的“指纹”再进行匹配来判断用户登录是否成功。

拥有百余位万粉技术博主、200余位可合作代发博主,私域技术社群规模达千人,商务合作私信 5004

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

搞定PHP面试 - MySQL基础知识点整理 - 存储引擎

MySQL基础知识点整理 - 存储引擎0. 查看 MySQL 支持的存储引擎可以在 mysql 客户端中,使用 show engines;命令可以查看MySQL支持的引...

代码技巧 482

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

操作系统知识点整理

进程:是具有一定的程序关于一个的一次,是。线程:又叫轻进程,是进程内的一个相对独立的,是cpu的单位。

uuuranuu的博客 1258

分布式存储ceph知识点整理

如何选择存储底层协议兼容性产品要有定位,功能有所取舍针对特定市场的应用存储被市场认可的存储系统稳定性是第一位的性能第二数据功能要够用软件定义存储 (SDS) 利用基于软件的方法管理数据存储,并提供基于策略的数据层控制,独立于底层的存储硬件。Ceph支持对象存储(RADOSGW)、块存储(RBD)和文件存储(CephFS)。一个Ceph存储集群至少包含一个Ceph monitor、Ceph manager及Ceph OSD(Object Store Daemon)。

happy_king_zi的博客 2113

C语言考研复试知识点整理

C语言考研复试知识点整理 1.由float x=3e-6,y=3e-6;不能得到x= =y的逻辑值为真。 解析:float类型的变量只能进行>或<运算,不能进行==运算 2.自增和自减运算: int a=5;a++;使用时a=5;使用完a=a+1;a=6; int a=5;++a;使用前a=a+1;使用时a=6; 3.只有在使用时才为该类型变量分配内存的存储类型是auto和regist...

liudaoqun的博客 4011

sql小白入门基础知识点整理

对于SQL小白来说,入门基础知识点主要包括SQL的基本概念、语法要求、数据类型、数据库操作、表操作以及数据操作等。

chengxuyuan66666的博客 1443

浏览器的本地存储方法

浏览器本地存储是一种在浏览器中长久保存数据的方法,可以说为本地数据持久化,在我们刷新页面,或者同域名内页面跳转之后仍然可以将数据保留,对于服务器来说存储的压力小了,对用户来说,会感觉相应速度变快了,提升用户体验。 1、cookie cookie是我们最熟知的了,但是cookie 能存储的数据有限,如IE8,Firefox,opera每个域可以保存的50个cookie,Safari/WebKit没

yCharlee的博客 4546
上一篇: 浏览器知识点整理(二)事件机制
下一篇: 浏览器知识点整理(四)网络协议
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时光机上敲代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值