当大小限制开始时,cookie的最佳替代品
本文关键字:cookie 最佳 替代品 开始时 | 更新日期: 2023-09-27 18:15:33
我一直在处理一个相当大的数据库。我想填充网页的网页控件(下拉列表)在页面加载事件,给网页尽可能多的灵活性。例如,我有一个下拉列表,用户可以选择,它将从数据表的特定列的唯一行填充。
现在,我不想在每次页面加载发生时触发oracle查询,因为这会显着减慢网页速度(每次大约1分钟)。所以我开始考虑用饼干来解决问题。我很快发现cookie的大小限制(4kb)对于我的目的来说太小了。如果我真的想在本地存储数据,我将需要大约10-15kb的大小!因此,我试图搜索是否有任何方法可以增加cookie大小限制以满足我的需求,我发现可能的解决方案是localstorage。
- 真的有办法增加cookie大小限制吗?
- 最简单的替代方案是什么?它真的是本地存储吗?或者还有什么要调查的?
详细信息:我使用c#/ASP。. NET + ORACLE
以下是所有在ASP中存储状态信息的选项。Net -
- Cache—存储在服务器上并在用户之间共享的内存池
- 会话 -存储在服务器上,对于每个用户都是唯一的
- Cookies -存储在客户端,并与每个HTTP请求一起传递给服务器
- QueryString -作为完整URL字符串的一部分传递
- 上下文。Items - HttpContext并且只持续该请求的生命周期
- 配置文件—存储在数据库中并跨多个会话维护信息
现在,我不想在每次页面加载发生时触发oracle查询因为这会大大减慢网页的速度(大约1分钟)每次)。
您的场景有两个选项-
- 如果数据是跨用户共享的,使用Cache
- 如果每个用户的数据都是唯一的,则使用Session
理想情况下,你不想存储在ViewState它会使你的页面非常沉重,除非你配置存储在Sql Server的ViewState(这是超出这个问题的范围)。
更新:
localStorage -不是所有的浏览器都可以处理localStorage,所以一定要先检查一下。
<script type="text/javascript">
if(window.localStorage) {
window.localStorage.SetItem('keyName','valueToUse');
// OR
window.localStorage.keyName = 'valueToUse';
}
</script>
供参考: ASP。NET没有提供处理本地存储的特定方法;你只能通过javascript在客户端操作。
不要使用cookie
我一直在开发的一个应用程序中也有类似的需求。我需要让用户使用自动完成输入框从大约15,000个选项中选择一个值。我不想在组件每次需要查找值时都访问数据库。我决定使用会话存储来存储所有可能的值,然后将这些值提供给自动完成组件。效果很好。你也可以使用本地存储
对于我的需求,会话存储是一个更好的选择,因为我不需要在用户关闭浏览器选项卡后保存值。此外,在将15,000项存储到会话存储中之前,我使用JavaScript压缩对它们进行了压缩,以节省空间。我使用lz-string进行压缩
您不希望将cookie用于此目的。不仅有大小限制,而且cookie会随着每个向服务器发出的请求来回发送,这可能会降低应用程序的响应速度,具体取决于服务器和用户的带宽。
另一种选择是使用Viewstate
,它将数据存储在页面本身。这没有空间限制,但它确实有与增加请求大小的cookie相同的问题。
您还可以使用Session
,它将为每个会话将数据存储在服务器的内存中。这减少了带宽需求,但确实占用了服务器本身的额外内存空间,这可能是不可取的。内存中的大量数据+大量会话可能=内存不足。
所以要弄清楚你的权衡是什么。Viewstate
与您当前的解决方案最相似。
要访问页面中的视图状态或会话,只需执行Viewstate['KEY']
或Session['KEY']
另一件需要注意的事情是,Session
数据在整个会话和页面加载/重定向等过程中都是持久化的。Viewstate
仅对该页可用。如果转到其他页面,Viewstate
将被丢弃。
如果所有用户的数据都是相同的,那么您还可以使用Cache
,它将数据存储在应用程序级别而不是会话级别。这仍然占用服务器上的内存空间,但不会随着会话的增加而增加(在您的示例中仅为15k !)您还可以为缓存指定过期时间(滑动过期或绝对过期),这允许您在一定时间内不访问该资源时自动释放正在使用的内存。只要确保在使用它之前总是检查数据是否在缓存中,因为。net将在信息过期时丢弃该信息,或者如果它只是需要为某些其他目的清理内存