
转换类型或浏览器。
浏览器的大小不统一,并且在IE8以上的IE版本才支持LocalStorage这个属性,目前所有的浏览器中都会把LocalStorage的值类型限定为string类型,这个在对我们日常比较常见的JSON对象类型需要一些转换,本质上是对字符串的读取,如果存储内容多的话会消耗内存空间,会导致页面变卡。
LocalStorage中一般浏览器支持的是5M大小,这个在不同的浏览器中LocalStorage会有所不同,LocalStorage的使用也是遵循同源策略的。
在HTML 5中,localstorage是个不错的东西,在支持localstorage的浏览器中, 能持久化用户表单的输入,即使关掉浏览器,下次重新打开浏览器访问,也能读出其值, 下面给出的例子是使用jquery 在每次表单加载的时候,读localstorage的值,而在表单每次提交时则清楚其值的例子
首先是一个表单:
复制代码 代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>HTML5 Local Storage Example</title>
<!-- include Bootstrap CSS for layout -->
<link href="//netdnabootstrapcdncom/twitter-bootstrap/221/css/bootstrap-combinedmincss" rel="stylesheet">
</head>
<body>
<div class="container">
<h1>HTML5 Local Storage Example</h1>
<form method="post" class="form-horizontal">
<fieldset>
<legend>Enquiry Form</legend>
<div class="control-group">
<label class="control-label" for="type">Type of enquiry</label>
<div class="controls">
<select name="type" id="type">
<option value="">Please select</option>
<option value="general">General</option>
<option value="sales">Sales</option>
<option value="support">Support</option>
</select>
</div>
</div>
<div class="control-group">
<label class="control-label" for="name">Name</label>
<div class="controls">
<input class="input-xlarge" type="text" name="name" id="name" value="" maxlength="50">
</div>
</div>
<div class="control-group">
<label class="control-label" for="email">Email Address</label>
<div class="controls">
<input class="input-xlarge" type="text" name="email" id="email" value="" maxlength="150">
</div>
</div>
<div class="control-group">
<label class="control-label" for="message">Message</label>
<div class="controls">
<textarea class="input-xlarge" name="message" id="message"></textarea>
</div>
</div>
<div class="control-group">
<div class="controls">
<label class="checkbox">
<input name="subscribe" id="subscribe" type="checkbox">
Subscribe to our newsletter
</label>
</div>
</div>
</fieldset>
<div class="form-actions">
<input type="submit" name="submit" id="submit" value="Send" class="btn btn-primary">
</div>
</form>
</div>
然后是js部分代码:
复制代码 代码如下:
<script src="//codejquerycom/jquery-latestjs"></script>
<script>
$(document)ready(function () {
/
判断是否支持localstorage
/
if (localStorage) {
/
读出localstorage中的值
/
if (localStoragetype) {
$("#type")find("option[value=" + localStoragetype + "]")attr("selected", true);
}
if (localStoragename) {
$("#name")val(localStoragename);
}
if (localStorageemail) {
$("#email")val(localStorageemail);
}
if (localStoragemessage) {
$("#message")val(localStoragemessage);
}
if (localStoragesubscribe === "checked") {
$("#subscribe")attr("checked", "checked");
}
/
当表单中的值改变时,localstorage的值也改变
/
$("input[type=text],select,textarea")change(function(){
$this = $(this);
localStorage[$thisattr("name")] = $thisval();
});
$("input[type=checkbox]")change(function(){
$this = $(this);
localStorage[$thisattr("name")] = $thisattr("checked");
});
$("form")
/
如果表单提交,则调用clear方法
/
submit(function(){
localStorageclear();
})
change(function(){
consolelog(localStorage);
});
}
});
在k8s中,replicaset和deployment是处理无状态的服务,但对于有状态的应用,就需要statefulset来处理
stateful不仅能管理pod对象,还能确保这些pod的顺序性和一致性
会创建volumeClaimTemplates配置,包括持久卷persistentVolume和用于绑定持久卷和pod的persistVolumeClaim资源,pod中保存了序号,哪怕重新调度或重启也不会变
由StatefulSetController,StatefulSetControl ,StatefulPodControl 三个组件协作完成,StatefulSetController 从podInformer和ReplicasetInformer中接受增改时间将事件推入队列,StatefulSetController 在run方法中启动多个协程,从队列中获取带出里的StatefulSet 资源进行同步
使用单调递增策略,升序一次创建副本降序删除副本,当出现pod不健康,新的pod不会被创建,StatefulSetController 会等待 Pod 恢复后继续执行下面的逻辑
通过stateful应该持有的副本数对当前副本进行分组,一部分是需要保证存活的replicas,另一部分需要被终止的副本condmened,分组后的replicas数量不足,通过newVersionedStatefulSetPod 函数创建新的 Pod,不过这里的 Pod 也只是待创建的模板。
拿到线上应该存在的 replicas 数组时,我们就可以进行通过 CreateStatefulPod 进行扩容了,每个 Pod 的更新和创建都会等待前面所有 Pod 正常运行,它会调用 isFailed、isCreated、isTerminating 等方法保证每一个 Pod 都正常运行时才会继续处理下一个 Pod,如果使用滚动更新策略,那么会在完成扩容之后才会对当前的 Pod 进行更新:
拿到线上应该存在的 replicas 数组时,我们就可以进行通过 CreateStatefulPod 进行扩容了,每个 Pod 的更新和创建都会等待前面所有 Pod 正常运行,它会调用 isFailed、isCreated、isTerminating 等方法保证每一个 Pod 都正常运行时才会继续处理下一个 Pod,如果使用滚动更新策略,那么会在完成扩容之后才会对当前的 Pod 进行更新:
当 StatefulSetController 处理完副本的创建和更新任务之后,就开始删除需要抛弃的节点了,节点的删除也需要确定按照降序依次进行:
我们首先会删除待抛弃列表中的副本,其次根据滚动更新 RollingUpdate 的配置从高到低依次删除所有 Pod 版本已经过时的节点,所有删除节点的方式都会通过 DeleteStatefulPod 方法进行,该方法会通过客户端的接口直接根据 Pod 名称删除对应的资源。
先会删除待抛弃列表中的副本,其次根据滚动更新 RollingUpdate 的配置从高到低依次删除所有 Pod 版本已经过时的节点,所有删除节点的方式都会通过 DeleteStatefulPod 方法进行,该方法会通过客户端的接口直接根据 Pod 名称删除对应的资源。
Pod 的序列号(Ordinal)是其唯一性和顺序性的保证,在创建和删除 StatefulSet 的副本时,我们都需要按照 Pod 的序列号对它们按照顺序 *** 作,副本的创建会按照序列号升序处理,副本的更新和删除会按照序列号降序处理。
创建 StatefulSet 中的副本时,就会在 newStatefulSetPod 函数中传入当前 Pod 的 ordinal 信息,该方法会调用 GetPodFromTemplate 获取 StatefulSet 中的 Pod 模板并且初始化 Pod 的 metadata 和引用等配置:
getPodName 函数的实现非常简单,它将 StatefulSet 的名字和传入的序列号通过破折号连接起来组成我们经常见到的 web-0、web-1 等形式的副本名;initIdentity 会更新 Pod 的主机名、资源名、命名空间标签,而 updateStorage 会为待创建的副本设置卷:
设置卷的配置主要来自于 StatefulSet 规格中的 volumeClaimTemplates 模板,所有卷相关的配置信息都会通过该方法传递过来。
Pod 通过当前名字存储自己对应的序列号,在 StatefulSetController 同步时就会从 Pod 的名字中取出序列号并进行排序,随后的各种循环就可以选择使用正序或者倒序的方式依次处理各个节点了。
当我们删除一个 Kubernetes 中的 StatefulSet 资源时,它对应的全部 Pod 副本都会被 垃圾收集器 自动删除,该收集器在检查到当前 Pod 的 metadataownerReferences 已经不再存在时就会删除 Pod 资源
我们会发现除了 StatefulSet 和 Pod 之外的任何其他资源都没有被删除,之前创建的 PersistentVolume 和 PersistentVolumeClaim 对象都没有发生任何的变化,这也是 StatefulSet 的行为,它会在服务被删除之后仍然保留其中的状态,也就是数据,这些数据就都存储在 PersistentVolume 中。
如果我们重新创建相同的 StatefulSet,它还会使用之前的 PV 和 PVC 对象,不过也可以选择手动删除所有的 PV 和 PVC 来生成新的存储,这两个对象都属于 Kubernetes 的存储系统,感兴趣的读者可以通过 存储系统 了解 Kubernetes 中 Volume 的设计和实现。
请求框架config配置
configjs
未登录前token取到是空,登录后把后台返回的token存储到缓存,到下一个界面请求其他接口的时候,头信息里面的token为空,并且本地缓存信息已有token,于是想到是请求头里面的token并没有更新,需要去更新一下就可以了。
interfacejs
indexjs
是这样配置的。第一步首先链接两台Flash Array,选择“sync replication”模式。第二步创建一个双活的Pod,双活的Pod里面除了包括双活的volume以外,还有双活卷的快照,克隆,保护组,和一些配置信息。第三步创建一个卷,指定卷对应的Pod名字。第四步映射双活卷给主机进行读写,ActiveCluster是一个对称式Active Active双活解决方案,所以IO可以同时在两个FlashArray上读写。这样就完成了配置
首先uni-app提供的数据缓存Storage分四种模式:
一种是set(用于存储数据)、一种是get(用于获取数据)、一种是remove
(用于移除指定数据)、最后一种是clear(清除缓存数据)
然后区分:带Sync字段是同步的,没有带的是异步。
查看缓存数据的界面面板:
谷歌浏览器--开发者工具--Application--Storage--Local Storage
上面这个面板就是进行查看数据缓存相关信息的。
下面进行异步数据缓存展示,就是没带Sync字段的,顺序:先有set模式-->get模式-->remove模式-->clear模式(一般很少用)
首先准备三个按钮,分别对应上面的三个功能: 存储数据、获取数据、移除数据
方法定义:
功能实现:
(1)存储数据
unisetStorage(OBJECT)
这个对象里面传入一个key和一个data,你可以理解为键值对的形式,然后一个回调函数success
当我们点击“存储数据”的这个按钮时,我们来到面板就会看到数据已经缓存成功呈现在面板上。而key为键,data为值。
(2)获取数据
unigetStorage() 用于获取缓存的数据
这里的key对应setStorage的key,然后再success回调函数里面接受res返回数据的结果,控制台输出。
(3)移除数据
一般用于移除整个数据。
回到数据缓存的面板查看,发现key为"student"的字段已经完整移除。
带Sync的,不需要指定特定的键(key)和值(data)。
以setStorageSync(key,value)为例子,同步可以直接接受参数,第一个参时就是key键,第二个参数为value值。
将上面的例子改成同步,效果是一样的。
数据缓存:
获取数据:
adb shell终端虽然看不到,但不影响使用的,所以还是推荐使用:private String path = EnvironmentgetExternalStorageDirectory()getAbsolutePath() + "/ucrobotics";类似这种定义方式。 到eoeAndroid网站查看回答详情>>
Android41之后Android增加了多存储卡的支持,一般手机会存在内置存储卡和外置存储卡,也可能有多个外置存储卡。如何获取存储卡路径呢?
特别是各种android设备的存储器路径,是不一样的,比如T卡路径,可能是/mnt/sdcard、/mnt/extsd、/mnt/external_sd 或者/mnt/sdcard2。有时内置存储器的路径也可能是/mnt/sdcard,而host usb存储器的路径也是各种各样的。
下面方法是通过反射,调用StorageManager的隐藏接口getVolumePaths(),实现获取存储器列表。
[java]
package cklstoragelist;
import javalangreflectInvocationTargetException;
import javalangreflectMethod;
import androidappActivity;
import androidosstorageStorageManager;
public class StorageList {
private Activity mActivity;
private StorageManager mStorageManager;
private Method mMethodGetPaths;
public StorageList(Activity activity) {
mActivity = activity;
if (mActivity != null) {
mStorageManager = (StorageManager)mActivity
getSystemService(ActivitySTORAGE_SERVICE);
try {
mMethodGetPaths = mStorageManagergetClass()
getMethod("getVolumePaths");
} catch (NoSuchMethodException e) {
eprintStackTrace();
}
}
}
public String[] getVolumePaths() {
String[] paths = null;
try {
paths = (String[]) mMethodGetPathsinvoke(mStorageManager);
} catch (IllegalArgumentException e) {
eprintStackTrace();
} catch (IllegalAccessException e) {
eprintStackTrace();
} catch (InvocationTargetException e) {
eprintStackTrace();
}
return paths;
}
}
以上就是关于local storage获取延迟怎么处理全部的内容,包括:local storage获取延迟怎么处理、如何读取HTML5 local storage 的值、K8S介绍系列---Statefulset介绍等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)