精华内容
下载资源
问答
  • @[TOC] 在数据结构中,字符串要单独用一种存储结构来存储,称为串存储结构。这里的串指的就是字符串。无论学习哪种编程语言,操作最多的总是字符串。...下面将依次介绍三种存储方式。 定长顺序存储 字符串的定长...

    @[TOC]

    在数据结构中,字符串要单独用一种存储结构来存储,称为串存储结构。这里的串指的就是字符串。无论学习哪种编程语言,操作最多的总是字符串。我们平常使用最多的存储结构无疑是利用定长数组存储。但是这种存储结构需要提前分配空间,当我们不知道字符串长度的时候,过大的分配内存无疑是一种浪费。因此,合理的选择字符串的存储方式显得格外重要。下面将依次介绍三种存储方式。

    定长顺序存储

    字符串的定长顺序存储结构,可以理解为采用 "固定长度的顺序存储结构" 来存储字符串,因此限定了其底层实现只能使用静态数组。 使用定长顺序存储结构存储字符串时,需结合目标字符串的长度,预先申请足够大的内存空间。 例如,采用定长顺序存储结构存储 "feizhufeifei",通过目测得知此字符串长度为12(不包含结束符 '0'),因此我们申请的数组空间长度至少为 12,用 C 语言表示为:

    char str[18] = "feizhufeifei";

    下面是具体的C语言实现

    #include<stdio.h>
    int main()
    {
        char str[15]="feizhufeifei";
        printf("%srn",str);
        return 0;
    }

    这种存储方式基本是初学者都应该掌握的。下面介绍第二种存储方式。

    动态数组存储

    首先我们应该明确两个概念:堆和栈。 堆是由我们程序员自己管理的,当进程调用malloc等函数分配内存时,新分配的内存就被动态分配到堆上,当利用free等函数释放内存时,被释放的内存从堆中被剔除。 栈又称堆栈,是用户存放程序临时创建的变量,也就是我们函数{}中定义的变量,但不包括static声明的变量,static意味着在数据段中存放变量。除此之外,在函数被调用时,其参数也会被压入发起调用的进程栈中,并且待到调用结束后,函数的返回值也会被存放回栈中,由于栈的先进后出特点,所以栈特别方便用来保存、恢复调用现场。从这个意义上讲,我们可以把堆栈看成一个寄存,交换临时数据的内存区。 当我们调用malloc时,就会在堆上划分一块空间给我们使用,具体代码如下:

    //创建了一个动态数组str,通过使用 malloc 申请了 10个 char 类型大小的堆存储空间。
    char * str = (char*)malloc(10*sizeof(char));

    动态数组的优势是长度可变,根据需要动态进行分配。当我不想申请新的变量,但是又想要扩大str的空间怎么办呢?这个时候realloc函数就起作用了。

    //通过使用这行代码,之前具有10 个 char 型存储空间的动态数组,其容量扩大为可存储 20 个 char 型数据。
    str = (char*)realloc(str, 20*sizeof(char));

    下面通过一个合并两个字符串的例子来更好地理解下动态分配过程。

    /*
     * @Description: 字符串的堆动态堆分配内存
     * @Version:   V1.0
     * @Autor: Carlos
     * @Date: 2020-05-25 
     * @LastEditors: Carlos
     * @LastEditTime: 2020-05-25 
     */ 
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    //打印测试语句
    #define DEBUG 0
    #if DEBUG
    #define DBG_PRINTF(fmt, args...)  
    do
    {
        printf("<<File:%s  Line:%d  Function:%s>> ", __FILE__, __LINE__, __FUNCTION__);
        printf(fmt, ##args);
    }while(0)
    # else
    
    # define DBG_PRINTF(fmt, args...)
    #endif
    int main()
    {
        char *s1 = NULL;
        char *s2 = NULL;
        s1 = (char *)malloc(5*sizeof(char *));
        strcpy(s1,"test"); 
        DBG_PRINTF("s1:%srn",s1);
        s2 = (char *)malloc(7*sizeof(char *));
        strcpy(s2,"string"); 
        DBG_PRINTF("s2:%srn",s2);
        int length1 = strlen(s1);
        int length2 = strlen(s2);
        //尝试将合并的串存储在 s1 中,如果 s1 空间不够,则用realloc动态申请
        if(length1<length1+length2)
            s1 =(char*) realloc(s1,(length1 + length2+1) * sizeof(char));
         //合并两个串到 s1 中
        for(int i = length1; i < length1 + length2;i++)
             s1[i] = s2[i - length1];
         //串的末尾要添加 0,避免出错
        s1[length1 + length2] = '0';
        printf("s1+s2:%s", s1);
        //用完动态数组要立即释放
        free(s1);
        free(s2);
        return 0;
    }

    块链存储

    块链存储就是利用链表来存储字符串。本文使用的是无头结点的链表结构(即链表的第一个头结点也存储数据)。 我们知道,单链表中的 "单" 强调的仅仅是链表各个节点只能有一个指针,并没有限制数据域中存储数据的具体个数。因此在设计链表节点的结构时,可以令各节点存储多个数据。 例如,我们要用链表存储feizhu字符串,链表结构如下所示:

    5aa375f58b2e07692e36e319fa946925.png 我们也可以每个链表存储四个字符,那么最后一个节点肯定不会占满。这时,我们可以使用#或者其他符号将其填满。

    46d16ccc73a36745210e89a232c80be4.png 怎样确定链表中每个节点存储数据的个数呢? 链表各节点存储数据个数的多少可参考以下几个因素: 串的长度和存储空间的大小:若串包含数据量很大,且链表申请的存储空间有限,此时应尽可能的让各节点存储更多的数据,提高空间的利用率(每多一个节点,就要多申请一个指针域的空间);反之,如果串不是特别长,或者存储空间足够,就需要再结合其他因素综合考虑; 程序实现的功能:如果实际场景中需要对存储的串做大量的插入或删除操作,则应尽可能减少各节点存储数据的数量;反之,就需要再结合其他因素。 下面是具体的代码实现。
    /*
     * @Description: 字符串的块链表存储(无头结点的链表)
     * @Version: V1.0
     * @Autor: Carlos
     * @Date: 2020-05-25 
     * @LastEditors: Carlos
     * @LastEditTime: 2020-05-25 
     */ 
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    //全局设置链表中节点存储数据的个数
    #define linkNum 3
    typedef struct link {
        //数据域可存放 linkNum 个数据
        char a[linkNum]; 
        //代表指针域,指向直接后继元素
        struct link * next; 
    }Link; 
    /**
     * @Description: 遍历链表,打印
     * @Param: Link * head 结构体头结点指针
     * @Return: 无
     * @Author: Carlos
     */
    void PrintLink(Link * head)
    {
         Link * p = head;
        while (p)
        {
        for (int i = 0; (i < linkNum) &&(p->a[i]!='#'); i++) 
        {
            printf("%c", p->a[i]);
        }
         p = p->next;
        }
    }
    /**
     * @Description: 初始化链表
     * @Param: Link * head 结构体头结点指针。char * str 要操作的字符串
     * @Return: Link *结构体指针
     * @Author: Carlos
     */
    Link * InitLink(Link * head, char * str)
    {
        int length = strlen(str);
        //需要的节点个数 向上取整
        int nodenum = length/linkNum;
        Link *p = head;
        int j;
         //将数据存放到每个节点的数组中
        for(int i = 0;i<=nodenum;i++)
        {
    
            for( j = 0;j < linkNum;j++)  
            {
                if (i*linkNum + j < length)
                {
                     p->a[j] = str[i*linkNum+j];
                } 
                //使用#填充未满的节点数组空间
                else
                {
                    p->a[j] = '#';
                }
    
            }
            //链接新旧两个节点
            if (i*linkNum + j < length)
            {
                Link* q = (Link*)malloc(sizeof(Link));
                q->next = NULL;
                p->next = q;
                p = q;
            }
        }
    
        return head;
    }
    
    int main()
    {
        Link* head = (Link*)malloc(sizeof(Link));
        head->next=NULL;
        InitLink(head,"blockchain");
        PrintLink(head);
        return 0;
    }

    关于链表不明白的可以参考这篇博客史上最全单链表的增删改查反转等操作汇总以及5种排序算法(C语言) 文中代码均已测试,有任何意见或者建议均可联系我。欢迎学习交流! 如果觉得写的不错,请点个赞再走,谢谢!

    如遇到排版错乱的问题或者有任何疑问、建议,可以在“我的主页”找到我的联系方式和我的博客链接。

    展开全文
  • 一、二进制存储 二、XML存储 、Josn存储 拓展: PlayerPrefs(数据持久化)用于本地持久化保存与读取类,...Playerprefs类支持3数据类型保存和读取,分别是浮点型、整型和字符型: PlayerPrefs.SetInt();...

    使用序列化存储游戏数据,方便将对象从一个地方移动到另一个地方(转移文件再反序列化读取)使游戏数据不容易被直接篡改。

    二进制方法:简单,但可读性差。
    XML:可读性强,但是文件庞大,冗余信息多。
    JSON:数据格式比较简单,易于读写,但是不直观,可读性比XML差。

    首先我们创建一个名为Save的脚本:

    using UnityEngine;
    using System.Collections;
    
    [System.Serializable]//序列化
    public class Save{
    	public int score = 0;
    }
    

    其次我们创建一个名为GameManager的脚本来读取和修改数据:

    using UnityEngine;
    using System.Collections;
    using System.IO;
    using System.Runtime.Serialization.Formatters.Binary;
    using System.Collections.Generic;
    
    public class GameManager : MonoBehaviour {
    	private int localScore;
    	private Save CreateSaveGO(){
    		//创建Save对象并存储当前游戏状态信息
    		Save save = new Save();
    		//把score保存在Save对象中
    		save.score = localScore;
    		//返回该Save对象
    		return Save;
    	}
    	//通过读档信息加载游戏状态
    	private void SetGame(Save save){
    		//读取游戏状态信息
    		localScore = save.score;
    	}		
    }
    

    最后我们使用三种存储方法对游戏进行保存与加载。

    一、二进制方法:存档与读档

    命名空间:
    using System.IO;
    using System.Runtime.Serialization.Formatters.Binary;

    private void SaveByBin(){
    	//序列化过程(将Save对象转换为字节流)
    	//创建Save对象并保存当前游戏状态
    	Save save = CreateSaveGO();
    	//创建一个二进制格式化程序
    	BinaryFormatter bf = new BinaryFormatter();
    	//创建一个文件流(其中"/StreamingFile"指的是在Unity Project下的Assets资源文件夹中创建的StreamingFile文件夹)
    	FileStream fileStream = File.Create(Application.dataPath + "/StreamingFile" + "/byBin.txt");
    	//用二进制格式化程序的序列化方法来序列化Save对象,参数:创建的文件流和需要序列化的对象
    	bf.Serialize(fileStream,save);
    	//关闭流
    	fileStream.Close();
    	
    	//如果文件存在,则显示保存成功
    	if(File.Exists(Application.dataPath + "/StreamingFile" + "/byBin.txt"))
    	{
    		Debug.Log("保存成功");
    	}
    }
    
    private void LoadByBin(){
    	if(File.Exists(Application.dataPath + "/StreamingFile" + "/byBin.txt")){
    		//反序列化过程
    		//创建一个二进制格式化程序
    		BinaryFormatter bf = new BinaryFormatter();
    		//打开一个文件流
    		FileStream fileStream = File.Open(Application.dataPath + "/StreamingFile" + "/byBin.txt",FileMode.Open);
    		//调用格式化程序的反序列化方法,将文件流转换为一个Save对象
    		Save save = (Save)bf.Deserialize(fileStream);
    		//关闭文件流
    		fileStream.Close();
    
    		SetGame(save);
    		Debug.Log("加载成功");
    	}else{
    		Debug.Log("存档文件不存在");
    	}
    }
    

    二、XML:存档与读档

    命名空间:
    using System.Xml;

    private void SaveByXml(){
    	Save save = CreatSaveGO();
    	//创建XML文件的存储路径(其中"/StreamingFile"指的是在Unity Project下的Assets资源文件夹中创建的StreamingFile文件夹)
    	string filePath = Application.dataPath + "/StreamingFile" + "/byXML.txt";
    	//创建XML文档
    	XmlDocument xmlDoc = new XmlDocument();
    	//创建根节点,即最上层节点
    	XmlElement root = xmlDoc.CreateElement("save");
    	//设置根节点中的值
    	root.SetAttribute("name","saveFile1");
    	
    	//创建XmlElement
    	XmlElement score = xmlDoc.CreateElement("score");
    	//设置InnerText值并设置层级关系(xmlDoc -- root -- score)
    	score.InnerText = save.score.ToString();
    	root.AppendChild(score);
    	xmlDoc.AppendChild(root);
    	xmlDoc.Save(filePath);
    	
    	if(File.Exists(Application.dataPath + "/StreamingFile" + "/byXML.txt"))
    		{
    			Debug.Log("保存成功");
    		}
    }
    
    private void LoadByXml(){
    	string filePath = Application.dataPath + "/StreamingFile" + "/byXML.txt";
    	if(File.Exists(filePath))){
    		Save save =new Save();
    		//加载XML文档
    		XmlDocument xmlDoc = new XmlDocument();
    		xmlDoc.Load(filePath);
    		
    		//通过节点名称来获取元素,结果为XmlNodeList类型
    		XmlNodeList score = xmlDoc.GetElementsByTagName("score");
    		int scoreCount = int.Parse(score[0].InnerText);
    		save.score = scoreCount;
    		
    		SetGame(save);
    		Debug.Log("加载成功");
    	}else{
    		Debug.Log("存档文件不存在");
    	}
    }
    

    三、Json:存档与读档

    命名空间:
    using LitJson;

    private void SaveByJson(){
    	Save save = CreateSave();
    	//"/StreamingFile"指的是在Unity Project下的Assets资源文件夹中创建的StreamingFile文件夹,存储的文件可以是json格式也可是txt格式
    	string filePath = Application.dataPath + "/StreamingFile" + "/byJson.json";
    	//利用JsonMapper将save对象转换为Json格式的字符串
    	string saveJsonStr = JsonMapper.ToJson(save);
    	//将字符串写入到文件中
    	//创建一个StreamWriter,并将字符串写入文件中
    	StreamWriter sw = new StreamWriter(filePath);
    	sw.Write(saveJsonStr);
    	//关闭StreamWrite
    	sw.Close();
    	Debug.Log("保存成功");
    }
    
    private void LoadByJson(){
    	string filePath = Application.dataPath + "/StreamingFile" + "/byJson.json";
    	if(File.Exists(filePath))
    	{
    		//创建一个StreamReader,用来读取流
    		StreamReader sr = new StreamReader(filePath);
    		//将读取到的流赋值给jsonStr
    		string jsonStr = sr.ReadToEnd();
    		sr.Close();
    		
    		//将字符串jsonStr转换为Save对象
    		Save save = JsonMapper.ToObject<Save>(jsonStr);
    		SetGame(save);
    		Debug.Log("加载成功");
    	}else{
    		Debug.Log("存档文件不存在");
    	}
    }
    

    备注:利用Json对数据进行存档读档前需要将Json的库放进Unity Project下的Assets资源文件夹中。

    拓展:

    一、Using 自动释放流
    除了用Close关闭流文件外可以用using自动释放流:

    try {
    	BinaryFormatter bf=new BinaryFormatter();
    	using(FileStream fs=File.Create(Application.persistentDataPath+"/GameData.data")){
    			//使用using可以自动释放流
    			//将类的数据序列化写进本地
    		}
    	} catch (System.Exception ex) {
    			Debug.Log (ex.Message);
    	}
    

    二、PlayerPrefs 数据持久化
    PlayerPrefs用于本地持久化保存与读取的类,工作原理很简单,以键值对的形式将数据保存在文件中,然后程序可以根据这个名称取出上次保存的数值(注:数据通过键名来读取,当值不存在时,返回默认值)。

    Playerprefs类支持3种数据类型的保存和读取,分别是浮点型、整型和字符串型:
    PlayerPrefs.SetInt();保存整型数据
    PlayerPrefs.SetFloat();保存浮点型数据
    PlayerPrefs.SetString();保存字符串型数据
    PlayerPrefs.GetInt();读取整型数据
    PlayerPrefs.GetFloat();读取浮点型数据
    PlayerPrefs.GetString();读取字符串型数据

    例子(对游戏内背景音乐是否开启进行存储):

    public Toggle musicToggle;
    public AudioSource musicAudio;
    
    private void Awake(){
    	if(PlayerPrefs.HasKey("MusicOn")){
    		if(PlayerPrefs.GetInt("MusicOn") == 1){
    			musicToggle.isOn = true;
    			musicAudio.enable = true;
    		}else{
    			musicToggle.isOn = false;
    			musicAudio.enable = false;
    		}
    	}else{
    		musicToggle.isOn = true;
    		musicAudio.enable = true;
    	}
    }
    public void MusicSwitch(){
    //通过判断单选框是否被勾选上,从而决定是否播放背景音乐
    	if(musicToggle.isOn == false){
    		musicAudio.enable == false;
    		//保存音乐开关的状态,0代表关闭状态
    		PlayerPrefs.SetInt("MusicOn",0);
    	}else{
    		musicAudio.enable = true;
    		PlayerPrefs.SetInt("MusicOn",1);
    	}
    	PlayerPrefs.Save();//对数据进行存储
    }
    
    展开全文
  • 三种Session存储方式

    千次阅读 2017-04-13 15:17:32
    简单来说,Session就是服务器给客户端一个编号,当一台web服务器运行时,可能 是...配一个SessionId,用以标识这个用户唯一身分,这个Session就是有服务器随机产生一个由24个字符组成字符。  这个唯一
    简单来说,Session就是服务器给客户端的一个编号,当一台web服务器运行时,可能  是有多个用户都在浏览这台服务器上的网站,当每个用户首次与这台服务器建立连接时,它就与这个服务器建立了一个Session,同时服务器就会自动为其分  配一个SessionId,用以标识这个用户的唯一身分,这个Session就是有服务器随机产生的一个由24个字符组成的字符串。

               这个唯一的SessionId还是有很大的实际意义,当一个用户提交表单时,浏览器就会将用户的SessionId自动附加在HTTP头信息中,当服务器 处理完这个表单后,就会将结果返回给SessionId所对应的用户。

               如下是Web.config如何配置Session的:

                <configuration>
    <system.web>
    <sessionState mode=" Off | InProc | StateServer | SQLServer "
    cookieless=" true | false "
    timeout=" number of minutes "
    stateConnectionString=" tcpip=server:port "
    sqlConnectionString=" sql connection string "
    stateNetworkTimeout=" number of seconds " />
    </system.web>
    </configuration>

    其中各个节点属性:
    mode: Session的存储方式(必有的属性)。
    InProc:将Session存到进程内(这是Default值。)
    off:禁用Session.
    StateServer:将Session存到独立的状态服务中(Asp.net State Service).
    SqlServer:将Session存到SqlServer中。
    Cookieless:设置客户端Session存储的方式。
    false:使用Cookie模式(default).
    true:使用Cookieless模式。
    timeout:设置Session过期时间(default is 20 minutes)
    stateConnectionString:  设置Session独立存放的状态服务所在服务器的名称(地址)和端口号,当mode=&ldquo;stateserver时,这个属性就是必 须的。
    sqlConnectionString:设置与Sqlserver的连接字符串,当mode="sqlserver"时,这个属性时必须的。
    stateNetWorkTimeout:设置当mode=&ldquo;StateServer&rdquo;时,经过多少秒空闲后, 断开web服务器与存储状态信息服务器的TCP/IP连接(default is 10 seconds).

    asp.net中客户端Session的存储。
    asp.net中,默认是使用Cookie存储Session的,如果是将cookieless="false",改成 cookieless="true",则session就不用cookie来存储了,而是使用url来存储。

    asp.net服务器端session存储在进程内(inproc)
    当mode="Inproc"时,服务器的Session存储在IIS进程中,当IIS关闭,重启时,这些Session信息就会丢失,但这种模式最大的 好处就是性能提高。

           asp.net服务器端Session存储在进程外(StateServer)
    当mode="StateServer"时,服务器的Session就存储在"ASP.NET State   Server"这个服务的进程中,在服务中找到名为:&ldquo;ASP.NET State   Service&rdquo;的服务,启动这个服务,在资源管理器的进程中就能找到一个名  为:&ldquo;aspnet_state.exe"的进程,这个就是我们保存 Session的进程。
    &rdquo;ASP.NET State   Server"服务可以与Web服务器分开.eg:web服务器在192.168.0.100上,&ldquo;asp.net state   service"服务在192.168.0.101上,则可以进行设置:
    mode="StateServer" stateConnection="tcpip=192.168.1.101:42424".

          asp.net服务器端Session存储到SQLServer中(SQLServer),
    当mode="sqlserver"时,服务器的Session就是存储到Sql server中建立一个存储Session的数据库。在
    %windir%\Microsoft.NET\Framework\v2.0.50727 下有个名为: InstallSqlState.sql   的sql脚本文件. 这个脚本是专门用来建存储Session的数据库以及一个维护Session信息数据库的SQL Server代理作业的.

             执行此sql脚本后,会看到一个新增的aspstate数据库,但这个数据库中,只有存储过程,没有用户表,用户表放到了tempdb这个数据库中去  了,ASpstateTempSessions和ASPStateTempApplications,Session信息存储到了  ASPStateTempApplication存储了asp中Application对象信息。

         另外查看管理->SQL Server代理->作业,会发现多了一个名为:

    ASPState_job_DeleteExpiredSession的作业,这个作业实际上是每分钟去ASPStateTempSession中 删除过期的Session信息。

            上面的方法是建立Session数据库的一个”官方“方法,但在实际的应用中一般没这么去建,而是采用另一种方法,使用下面这段命令来自动创建 Session数据库:

     

    aspnet_regsql.exe -S ServerName\InstanceName -U User -P Password -d  DBName -ssadd -sstype c

           此命令将在ServerName\InstanceName建立DBName的数据库, 用户存储Session的数据库.  此数据库中包含了存储过程和用户表.  同时在SQL Server代理 -> 作业 中也加入了相应的作业.

           然后在Web.config中设置好配置信息:

    mode="SQLServer" sqlConnectionString="data  source=ServerName\InstanceName; Integrated Security=SSPI;"

           "Integrated Security=SSPI;" 是指使用Windows集成身份验证.

            如果使用SQL用户登陆方式. 则在sqlConnectionString中设置好"userid=sa;  password=***".

           这样一来就可以将Session存放到SQLServer中了

    微软BI技术交流群:316744959 PHP技术交流群:337619433 NET技术QQ群号:21386099有问题的可以在群里面提问
    展开全文
  • 三种 session存储方式

    2016-05-02 14:46:18
     简单来说,Session就是服务器给客户端一个编号,当一台web服务器运行时,可能 ...配一个SessionId,用以标识这个用户唯一身分,这个Session就是有服务器随机产生一个由24个字符组成字符。  这个唯
    
    简单来说,Session就是服务器给客户端的一个编号,当一台web服务器运行时,可能 是有多个用户都在浏览这台服务器上的网站,当每个用户首次与这台服务器建立连接时,它就与这个服务器建立了一个Session,同时服务器就会自动为其分 配一个SessionId,用以标识这个用户的唯一身分,这个Session就是有服务器随机产生的一个由24个字符组成的字符串。

             这个唯一的SessionId还是有很大的实际意义,当一个用户提交表单时,浏览器就会将用户的SessionId自动附加在HTTP头信息中,当服务器 处理完这个表单后,就会将结果返回给SessionId所对应的用户。

              如下是Web.config如何配置Session的:

               <configuration>
    <system.web>
    <sessionState mode=" Off | InProc | StateServer | SQLServer "
    cookieless=" true | false "
    timeout=" number of minutes "
    stateConnectionString=" tcpip=server:port "
    sqlConnectionString=" sql connection string "
    stateNetworkTimeout=" number of seconds " />
    </system.web>
    </configuration>

    其中各个节点属性:
    mode: Session的存储方式(必有的属性)。
    InProc:将Session存到进程内(这是Default值。)
    off:禁用Session.
    StateServer:将Session存到独立的状态服务中(Asp.net State Service).
    SqlServer:将Session存到SqlServer中。
    Cookieless:设置客户端Session存储的方式。
    false:使用Cookie模式(default).
    true:使用Cookieless模式。
    timeout:设置Session过期时间(default is 20 minutes)
    stateConnectionString: 设置Session独立存放的状态服务所在服务器的名称(地址)和端口号,当mode=&ldquo;stateserver时,这个属性就是必 须的。
    sqlConnectionString:设置与Sqlserver的连接字符串,当mode="sqlserver"时,这个属性时必须的。
    stateNetWorkTimeout:设置当mode=&ldquo;StateServer&rdquo;时,经过多少秒空闲后, 断开web服务器与存储状态信息服务器的TCP/IP连接(default is 10 seconds).

    asp.net中客户端Session的存储。
    asp.net中,默认是使用Cookie存储Session的,如果是将cookieless="false",改成 cookieless="true",则session就不用cookie来存储了,而是使用url来存储。

    asp.net服务器端session存储在进程内(inproc)
    当mode="Inproc"时,服务器的Session存储在IIS进程中,当IIS关闭,重启时,这些Session信息就会丢失,但这种模式最大的 好处就是性能提高。

          asp.net服务器端Session存储在进程外(StateServer)
    当mode="StateServer"时,服务器的Session就存储在"ASP.NET State Server"这个服务的进程中,在服务中找到名为:&ldquo;ASP.NET State Service&rdquo;的服务,启动这个服务,在资源管理器的进程中就能找到一个名 为:&ldquo;aspnet_state.exe"的进程,这个就是我们保存 Session的进程。
    &rdquo;ASP.NET State Server"服务可以与Web服务器分开.eg:web服务器在192.168.0.100上,&ldquo;asp.net state service"服务在192.168.0.101上,则可以进行设置:
    mode="StateServer" stateConnection="tcpip=192.168.1.101:42424".

         asp.net服务器端Session存储到SQLServer中(SQLServer),
    当mode="sqlserver"时,服务器的Session就是存储到Sql server中建立一个存储Session的数据库。在
    %windir%\Microsoft.NET\Framework\v2.0.50727 下有个名为: InstallSqlState.sql 的sql脚本文件. 这个脚本是专门用来建存储Session的数据库以及一个维护Session信息数据库的SQL Server代理作业的.

          执行此sql脚本后,会看到一个新增的aspstate数据库,但这个数据库中,只有存储过程,没有用户表,用户表放到了tempdb这个数据库中去 了,ASpstateTempSessions和ASPStateTempApplications,Session信息存储到了 ASPStateTempApplication存储了asp中Application对象信息。

        另外查看管理->SQL Server代理->作业,会发现多了一个名为:

    ASPState_job_DeleteExpiredSession的作业,这个作业实际上是每分钟去ASPStateTempSession中 删除过期的Session信息。

          上面的方法是建立Session数据库的一个”官方“方法,但在实际的应用中一般没这么去建,而是采用另一种方法,使用下面这段命令来自动创建 Session数据库:

      

    aspnet_regsql.exe -S ServerName\InstanceName -U User -P Password -d DBName -ssadd -sstype c

          此命令将在ServerName\InstanceName建立DBName的数据库, 用户存储Session的数据库. 此数据库中包含了存储过程和用户表. 同时在SQL Server代理 -> 作业 中也加入了相应的作业.

          然后在Web.config中设置好配置信息:

    mode="SQLServer" sqlConnectionString="data source=ServerName\InstanceName; Integrated Security=SSPI;"

          "Integrated Security=SSPI;" 是指使用Windows集成身份验证.

           如果使用SQL用户登陆方式. 则在sqlConnectionString中设置好"userid=sa; password=***".

          这样一来就可以将Session存放到SQLServer中了

    展开全文
  • 配一个SessionId,用以标识这个用户唯一身分,这个Session就是有服务器随机产生一个由24个字符组成字符。 这个唯一SessionId还是有很大实际意义,当一个用户提交表单时,浏览器就会将用户SessionId...
  • 这种方式是字符取出来也是字符 private void save(){ FileOutputStream out = null; BufferedWriter writer = null; try { out = openFileOutput("my.txt", Context.MODE_APPEND)
  • 简单来说,Session就是服务器给客户端一个编号,当一台web服务器运行时,可能 是有多个用户...配一个SessionId,用以标识这个用户唯一身分,这个Session就是有服务器随机产生一个由24个字符组成字符。 这个...
  • 第一:通过字符拼接 BEGIN DECLARE $sqltext VARCHAR(1000); SET $sqltext = 'SELECT * FROM user where 1=1'; IF ps_name IS NOT NULL THEN SET $sqltext = CONCAT($sqltext,' and name = \'',ps_name...
  • 开发过程中常用到的拼接字符串的方法有三种:1 简单 “+=” 拼接法string str="a";str+="c"+"d";string str_1="a"+"b";首先需要明白的是string类型,string是引用类型,保留在堆上,而不是栈上,用的时候传的是内存...
  • 串的类型定义以及三种表示形式

    千次阅读 2018-08-11 23:45:05
    引言  计算机处理的信息中,很大一部分包括字符变量的处理。字符变量有时候也...所以,在学习时,有必要掌握它的三种表示方式:定长顺序存储表示、堆分配存储表示以及块链顺序存储表示。在表示方式后,需...
  • 用于简单少量数据,数据格式简单:都是普通字符,标量类型值等,比如各种配置信息等等 SharedPrefrences与Editor简介: 创建SharedPreferences实例,通过Context.getSharedPreferences(String name,int ...
  • 开发过程中常用到的拼接字符串的方法有三种:  1 简单 “+=” 拼接法   string str="a"; str+="c"+"d"; string str_1="a"+"b";   首先需要明白的是string类型,string是引用类型,保留在堆...
  • 串的存储方式三种:定长顺序存储表示、堆分配存储表示、块链存储表示。 本文主要讲解串的定长顺序存储表示及其操作的实现 相关定义及准备 #include<iostream> using namespace std; #define TRUE 1 #...
  • 关于字符串的存储和输出问题 作者:张老师,华清远见嵌入式学院讲师。...字符串有三种存储方式: • 通过字符数组存储。此时的存储空间是可读写的,这样字符串就有被修改的可能性。在定义字符数组时可用通过字符
  • 对于asp.net程序来说,...它就与这个服务器建立了一个Session,同时服务器就会自动为其分配一个SessionId,用以标识这个用户唯一身分,这个Session就是有服务器随机产生一个由24个字符组成字符。<br
  • 要使用JTAG方式程序,不管是使用J-LINK、ULINK、ST-LINK,只需要把单片机上相应的程序留出来,然后和编程器连接上就可以程序了。... 单片机程序的三种方式介绍  引用下面:  STM32根据FLASH主存储块容量、页面
  • 众所周知,kafka中存储的数据是经过BASE64加密后jsonObject,因此从kafka中读取数据经过base64解码,得到是json,利用JSONObect方法可以对json进行解析,拿到对应数据。那么要如何将scala对象或者java...
  • 单片机下载程序的三种方式介绍引用下面:STM32根据FLASH主存储块容量、页面的不同,系统存储器的不同,分为小容量、中容量、大容量、互联型,共四类产品。小容量产品主存储块1-32KB,每页1KB。系统存储器2KB。中容量...
  • 第一,通过jedis 储存对象有大概三种one:本课程序列化成byte字节 ,最终存byte字节,two:对象转hashmap,也就是你想表达hash形式,最终存map,three:对象转json,最终存json,其实也就是字符第...
  • 为什么要有用到这种形式 因为我这个存储过程里面要处理 至少个系统情况 所以使用拼接的方式是最容易想到 存储过程大概意思 先将查询到数据存放到临时表中 然后再对临时表数据做遍历,这里不说这个...
  • 一般来讲,将我们准备好机器代码HEX或BIN文件等写进片上FLASH可以有三种常用烧写方式。【温馨提示:下面提到烧写方式的术语或称谓不是绝对,对于不同器件可能有不同表述甚至内涵,这里仅针对STM32,知道...
  • JS 深拷贝的三种实现方式1、将对象转换为JSON字符形式,再将其转换为原生JS对象;//_tmp和result是相互独立的,没有任何联系,有各自的存储空间。let deepClone = function (obj) {let _tmp = JSON.stringify(obj)...
  • 数据库是一个长期存储在计算机内,有组织,有共享,统一团里数据集合,是按数据结构来存储和管理数据计算机软件系统 存放数据,访问数据,操作数据的存储仓库,可以查询,统计,添加,删除和修改 ...
  • 堆分配存储串

    2014-04-19 13:20:33
    《数据结构》中介绍了三种方式: 1,定长顺序存储  长度有限,貌似没大用处 3,块链存储  数组和链表一种混用形式,原本直觉上认为这种方式较合理,但仔细思考发现,其便利性也仅体现在连接了。综合来说不如...
  • 项目中确实存储了一些第方的key和id之类的参数,都是已静态字符串的方式存储在java中,感觉不太安全,dex反编译就会被他人知道,于是这几天一直在找有关这方面的资料,以下是在网上看到的几安全存储方案1、拆分...
  • 首先要明确,虽然有三种前缀(无前缀,前缀u,前缀b),但是字符串的类型只有两种(str,bytes),实验如下: 根据程序以及以上运行结果,发现无前缀,和前缀u,构造出来的字符串常量,是一样的。类型一样是str,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 569
精华内容 227
关键字:

串的三种存储方式是