Linux启动/停止重启Mysql数据库的方法+连接MySQL

一、Linux启动/停止/重启Mysql数据库的方法

1、查看mysql版本
方法一:status;
方法二:select version();

2、Mysql启动、停止、重启常用命令
a、启动方式
1、使用 service 启动:

[root@localhost /]

# service mysqld start (5.0版本是mysqld)

[root@szxdb etc]

# service mysql start (5.5.7版本是mysql)

2、使用 mysqld 脚本启动:
/etc/inint.d/mysqld start

3、使用 safe_mysqld 启动:
safe_mysqld&

b、停止
1、使用 service 启动:
service mysqld stop

2、使用 mysqld 脚本启动:
/etc/inint.d/mysqld stop

3、mysqladmin shutdown

c、重启
1、使用 service 启动:
service mysqld restart 
service mysql restart (5.5.7版本命令)

2、使用 mysqld 脚本启动:
/etc/init.d/mysqld restart

二、连接MySQL:

格式: mysql -h主机地址 -u用户名 -p用户密码

1、例1:连接到本机上的MYSQL

找到mysql的安装目录,一般可以直接键入命令mysql -uroot -p,回车后提示你输密码,如果刚安装好MYSQL,超级用户root是没有密码的,故直接回车即可进入到MYSQL中了,MYSQL的提示符是:mysql>

2、连接到远程主机上的MySQL

假设远程主机的IP为:10.0.0.1,用户名为root,密码为123。则键入以下命令:

mysql -h10.0.0.1 -uroot -p123

(注:u与root可以不用加空格,其它也一样)

3、退出MySQL命令

exit (回车)

Cocos Creator存储和读取用户数据–官方文档

存储数据

cc.sys.localStorage.setItem(key, value)

上面的方法需要两个参数,用来索引的字符串键值 key,和要保存的字符串数据 value

假如我们要保存玩家最高分,假设键值为 score:cc.sys.localStorage.setItem('score', 0);

复杂的对象数据,我们可以通过将对象序列化为 JSON 后保存:

Data = {    name: 'Tracer',    level: 1,    gold: 100}; cc.sys.localStorage.setItem('Data', JSON.stringify(Data));

读取数据

cc.sys.localStorage.getItem(key)

和 setItem 相对应,getItem 方法只要一个键值参数就可以取出我们之前保存的值了。对于上文中储存的用户数据:

var userData = JSON.parse(cc.sys.localStorage.getItem('userData'));

移除键值对

移除:cc.sys.localStorage.removeItem(key)

数据加密

对于单机游戏来说,对玩家存档进行加密可以延缓游戏被破解的时间。要加密存储数据,只要在将数据通过JSON.stringify 转化为字符串后调用你选中的加密算法进行处理,再将加密结果传入 setItem 接口即可。

您可以搜索并选择一个适用的加密算法和第三方库,比如 encryptjs,将下载好的库文件放入你的项目,存储时:

var encrypt=require('encryptjs');
var secretkey= 'open_sesame'; // 加密密钥
 
var dataString = JSON.stringify(userData);
var encrypted = encrypt.encrypt(dataString,secretkey,256);
 
cc.sys.localStorage.setItem('userData', encrypted);

读取:

var cipherText = cc.sys.localStorage.getItem('userData');
var userData=JSON.parse(encrypt.decrypt(cipherText,secretkey,256));

注意 数据加密不能保证对用户档案的完全掌控,如果您需要确保游戏存档不被破解,请使用服务器进行数据存取。

转载于:https://www.cnblogs.com/allyh/p/9839762.html

mysql之外键约束

1.什么是外键

  A表的主键,在B表中字段出现,就是外键。

2.什么是约束:约束是一种限制,它通过对表的行货列的数据做出限制,来确保表的数据的完整性、唯一性。比如人员表中有一列是部门id,当新增一个人员的时候,我们不需要手动的在部门id字段给这个人员设置一个部门,而是新增则个新人员记录的时候默认就会有一个部门id给了这个人员,这就是约束。

3.以上1和2结合一起就是外键约束。即:foreign key

4.具体操作

4.1创建表时,同时创建外键约束

4.2已创建表后,追加外键约束

(1)添加外键方法

-- CONSTRAINT 就是创建外键约束 fk_id是外键约束的名字
-- foreign key (dept_id) references dept(did)意思是设置person表中的dept_id字段和dept表中的did字段关联,dept表中的did字段就是person表中的dept_id的外键约束,这个外键约束的名字叫做fk_id,一般潜规则外键约束的名字开头是fk_
alter table person add CONSTRAINT fk_id foreign key (dept_id) REFERENCES dept(did);

此时可以发现在person表中的,点击外键按钮,可以看到创建出来的外键

栏位表示的是person表中的dept_id字段,参考栏位的did就是person表中的dept_id字段的约束,dept_id字段的值被约束为dept字段did字段的值

  主表就是外键约束有约束值的那个表

从表就是被约束的那个表

(2)外键约束的4种类型,RESTRICT、NO ACTION、CASCADE、SET NULL主要针对于外键里的删除时和更新时

RESTRICT(约束):如果出现在删除时,意思是约束外键主键did记录(主表中的记录)不能直接删除,必须先删除被约束的表(从表)字段中dept_id所有这个外键主键值对应的记录,才能删除外键约束(主表中的记录)

NO ACTION:

CASCADE:删除选择这个时,删除主表中的记录时,主表中的这个主键id关联的从表的这个id值所在的记录也会被删除。建议不选。

SET NULL :删除选择这个时,如果从表(被约束的字段所在的表中)被约束的字段的值设置为可以为空时,那么当删除主表的记录时,主表中被删除的这个记录对应的主键值(约束从表字段的那个值)在从表中对应的字段中出现的那个记录的被约束字段的值就会变为NULL。

最常用的是选择RESTRICT不让删的这个约束、或者选择SET NULL删除后值表为空。

目前公司都不太喜欢使用这种真实的外键约束,而是使用虚拟的外键约束。虚拟外键约束:就是人员表中的部门id字段中的id值是部门表中的主键id的值,这就是虚拟外键约束,也是目前来说比较流行使用的。

(3)删除外键

-- 删除外键约束
alter table person DROP foreign key fk_id;

5.其他约束类型

-- 向t5表中插入两条记录,第二值用的都是默认值,如果是默认值则可以不填或填default
insert into t5 values(3, DEFAULT), (4, DEFAULT);

如何使用myisamchk和mysqlcheck工具快速修复损坏的MySQL数据库文件

有时候数据库突然就坏了很郁闷,用mysqlcheck.exe可以修复受损数据库

java

由于服务器的数据库硬盘空间满了,由于大量写入数据失败导致了出现“Duplicate entry ” for key ‘username’”的错误。

如果,出现这样的mysql数据库错误很可能是mysql数据库索引出了问题。那么,什么是mysql数据库索引?

分析:索引如果是primary unique这两两种,那么数据表的数据对应的这个字段就必须保证其每条记录的唯一性。否则就会产生这个错误。

一般发生在对数据库写操作的时候,例如Discuz!4.1论坛程序要求所有会员的用户名username必须唯一,即username 的索引是unique,这时如果强行往cdb_members表里插入一个已有的username的记录就会发上这个错误,或者将一条记录的username更新为已有的一个username。

比如某网友的dedecms网站出问题了,访问一看,果然全屏报错,检查mysql日志,错误信息为:

Table .dedecmsv4dede_archives is marked as crashed and should be repaired

提示说cms的文章表dede_archives被标记有问题,需要修复。

于是赶快恢复历史数据,上网查找原因。最终将问题解决。

解决方法如下:

找到mysql的安装目录的bin/myisamchk工具,在命令行中输入:

myisamchk -c -r ../data/dedecmsv4/dede_archives.MYI

然后myisamchk 工具会帮助你恢复数据表的索引。重新启动mysql,问题解决。

那么,修复mysql数据库一般可以myisamchk工具或者mysqlcheck工具用这二种方法:

1、myisamchk工具

使用 myisamchk 必须暂时停止 MySQL 服务器。例如,我们要检修 discuz 数据库。执行以下操作:

# service mysql stop (停止 MySQL );

# myisamchk -r /数据库文件的绝对路径/*MYI

# service mysql start

myisamchk 会自动检查并修复数据表中的索引错误。

2、mysqlcheck工具

使用 mysqlcheck 无需停止 MySQL ,可以进行热修复。操作步骤如下:

# mysqlcheck -r discuz.*

# service mysql stop (停止 MySQL );

# myisamchk -r /数据库文件的绝对路径/*MYI

# service mysql start

myisamchk 会自动检查并修复数据表中的索引错误。

注意:无论是 myisamchk 还是 mysqlcheck ,一般情况下不要使用 -f 强制修复,-f 参数会在遇到一般修复无法成功的时候删除部分出错数据以尝试修复。所以,不到万不得已不要使用 -f。

下面是其它网友的补充

检查修复所有数据库:

# mysqlcheck -A -o -r -p 
Enter password: 
db1  OK 
db2  OK  
db3  OK 
db4  OK 
…… 
…… 
…… 

修复指定的数据库用 

# mysqlcheck  -o -r Database_NAME -p 

即可

命令详解:

mysqlcheck客户端可以检查和修复MyISAM表。它还可以优化和分析表。
mysqlcheck的功能类似myisamchk,但其工作不同。主要差别是当mysqld服务器在运行时必须使用mysqlcheck,而myisamchk应用于服务器没有运行时。使用mysqlcheck的好处是不需要停止服务器来检查或修复表。
Mysqlcheck为用户提供了一种方便的使用SQL语句CHECK TABLE、REPAIR TABLE、ANALYZE TABLE和OPTIMIZE TABLE的方式。它确定在要执行的操作中使用使用哪个语句,然后将语句发送到要执行的服务器上。
有3种方式来调用mysqlcheck:

shell> mysqlcheck[options] db_name [tables]
shell> mysqlcheck[options] —database DB1 [DB2 DB3…]
shell> mysqlcheck[options] –all–database

如果没有指定任何表或使用—database或–all–database选项,则检查整个数据库。
同其它客户端比较,mysqlcheck有一个特殊特性。重新命名二进制可以更改检查表的默认行为(–check)。如果你想要一个工具默认可以修复表的工具,只需要将mysqlcheck重新复制为mysqlrepair,或者使用一个符号链接mysqlrepair链接mysqlcheck。如果调用mysqlrepair,可按照命令修复表。

下面的名可用来更改mysqlcheck的默认行为:

mysqlrepair

 默认选项为–repair
 
mysqlanalyze
 默认选项为–analyze
 
mysqloptimize
 默认选项为–optimize
 
mysqlcheck支持下面的选项:
·         —help,-?
显示帮助消息并退出。
·         –all–database,-A
检查所有数据库中的所有表。与使用—database选项相同,在命令行中命名所有数据库。
·         –all-in-1,-1
不是为每个表发出一个语句,而是为命名数据库中待处理的所有表的每个数据库执行一个语句。
·         –analyze,-a
分析表。
·         –auto-repair
如果某个被检查的表破坏了,自动修复它。检查完所有表后自动进行所有需要的修复。
·         –character-sets-dir=path
字符集的安装目录。参见5.10.1节,“数据和排序用字符集”。
·         –check,-c
检查表的错误。
·         –check-only-changed,-C
只检查上次检查以来已经更改的或没有正确关闭的表。
·         –compress
压缩在客户端和服务器之间发送的所有信息(如果二者均支持压缩)。
·         —database,-B
处理数据库中命名的所有表。使用该选项,所有字名参量被看作数据库名,而不是表名。
·         —debug[=debug_options],-# [debug_options]
写调试日志。debug_options字符串通常为’d:t:o,file_name’。
·         –default-character-set=charset
使用charsetas默认字符集。参见5.10.1节,“数据和排序用字符集”。
·         –extended,-e
如果你正使用该选项来检查表,可以确保它们100%地一致,但需要很长的时间。
如果你正使用该选项来修复表,则运行扩展修复,不但执行的时间很长,而且还会产生大量的垃圾行! 
·         –fast,-F
只检查没有正确关闭的表。
·         –force,-f
即使出现SQL错误也继续。
·         –host=host_name,-h host_name
连接给定主机上的MySQL服务器。
·         –medium-check,-m
执行比–extended操作更快的检查。只能发现99.99%的错误,在大多数情况下这已经足够了。
·         –optimize,-o
优化表。
·         –password[=password],-p[password]
当连接服务器时使用的密码。如果使用短选项形式(-p),选项和 密码之间不能有空格。如果在命令行中–password或-p选项后面没有 密码值,则提示输入一个密码。
·         –port=port_num,-P port_num
用于连接的TCP/IP端口号。
·         –protocol={TCP | SOCKET | PIPE | MEMORY} 
使用的连接协议。
·         –quick,-q
如果你正使用该选项在检查表,它防止扫描行以检查错误链接的检查。这是最快的检查方法。
如果你正使用该选项在修复表,它尝试只修复索引树。这是最快的修复方法。
·         –repair,-r
执行可以修复大部分问题的修复,只是唯一值不唯一时不能修复。
·         –silent,-s
沉默模式。只打印错误消息。
·         –socket=path,-S path
用于连接的套接字文件。
·         –tables
覆盖—database或-B选项。选项后面的所有参量被视为表名。
·         –user=user_name,-u user_name
当连接服务器时使用的MySQL用户名。
·         –verbose,-v
冗长模式。打印关于各阶段程序操作的信息。
·         –version,-V
显示版本信息并退出。

修复Mysql表时提示:myisamchk: error: 140 when opening MyISAM-table

这是Mysql5.6以后出现的一个bug,解决方法时修复表时不要带上MYI的后缀。
如原来使用

myisamchk -rf /data/mysql/table/table1.MYI

改为

myisamchk -rf /data/mysql/table/table1

即可解决。

解决:Reading table information for completion of table and column names

mysql -A不预读数据库信息(use dbname 更快)—Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A

这里写图片描述

mysql> use dbname
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
让后就卡在这里。

上面卡住的原因::
是由于数据库太大,即数据库中表非常多,所以如果预读数据库信息,将非常慢,所以就卡住了,如果数据库中表非常少,将不会出现问题。

出现问题的原因是::
我们进入mysql 时,没有使用-A参数;
即我们使用
mysql -hhostname -uusername -ppassword -Pport 的方式进入数据,
而没有使用
mysql -hhostname -uusername -ppassword -Pport -A的方式进入数据库。

       当我们打开数据库,即use   dbname时,要预读数据库信息,当使用-A参数时,就不预读数据库信息。

ERROR 1194 (HY000): Table ‘t1’ is marked as crashed and should be repaired

遇到这个问题几个敲命令轻松搞定

1、首先进入mysql命令台:

mysql -u root -p 回车  输入密码

2、查询所有的库

mysql> show databases; 

3、进入数据库“eduyun_2015_sp1”是库名

mysql> use eduyun_2015_sp1;

4、check table newabout(newabout–出现错误的表)用来检查出现问题的表的状态,出现错误就正常

5、然后用repair table newabout

6、再用check table newabout 检查一下就ok了

7、ok 搞定
———————

今天测试mysql,发现一个表出现了以下报错

ERROR 1194 (HY000): Table ‘t1’ is marked as crashed and should be repaired

在网上搜有些说需要通下面方法进行修复

[root@localhost data]# myisamchk -f ./test2/*.MYI
Checking MyISAM file: ./test2/t1.MYI
Data records:   24926   Deleted blocks:       0
– check file-size
myisamchk: error: Size of datafile is: 73                Should be: 174482
– recovering (with keycache) MyISAM-table ‘./test2/t1.MYI’
Data records: 24926
Data records: 5


———


Checking MyISAM file: ./test2/t2.MYI
Data records:  482688   Deleted blocks:       0
– check file-size
– check record delete-chain
– check key delete-chain
– check index reference
– check data record references index: 1
– check record links
          
———


Checking MyISAM file: ./test2/t4.MYI
Data records:  482688   Deleted blocks:       0
– check file-size
– check record delete-chain
– check key delete-chain
– check index reference


———


Checking MyISAM file: ./test2/t5.MYI
Data records:  482688   Deleted blocks:       0
– check file-size
– check record delete-chain
– check key delete-chain
– check index reference
– check record links

然后在mysql 里使用repair中进行修复,成功。

mysql> repair table cmxt.cm_user_pref;

+——————-+——–+———-+———-+

| Table             | Op     | Msg_type | Msg_text |

+——————-+——–+———-+———-+

| cmxt.cm_user_pref | repair | status   | OK       |

+——————-+——–+———-+———-+

后来经过实验发现

首先检查check table t1

mysql> check table t1;
+———-+——-+———-+—————————————————+
| Table    | Op    | Msg_type | Msg_text                                          |
+———-+——-+———-+—————————————————+
| test2.t1 | check | error    | Size of datafile is: 73         Should be: 174482 |
| test2.t1 | check | error    | Corrupt                                           |
+———-+——-+———-+—————————————————+
2 rows in set (0.00 sec)

然后再使用myisamchk来修复

[root@localhost mysql]# myisamchk -f ./data/test2/t1.MYI
Checking MyISAM file: ./data/test2/t1.MYI
Data records:   24926   Deleted blocks:       0
myisamchk: warning: Table is marked as crashed
– check file-size
myisamchk: error: Size of datafile is: 73                Should be: 174482
– recovering (with keycache) MyISAM-table ‘./data/test2/t1.MYI’
Data records: 24926
Data records: 5

然后再查看t1表

mysql> select * from t1;
+————-+
| str_number  |
+————-+
|        NULL |
|        NULL |
| -1774844896 |
|        NULL |
|        NULL |
+————-+
5 rows in set (0.00 sec)

PHP面试题及答案

面试筛选问题

  1. 给你四个坐标点,如何判断它们能不能组成一个矩形?如判断([0,0],[0,1],[1,1],[1,0])能组成一个矩形

答:

//获取两个点之间的长度的平方

    //不计算边长是为了后面方便进行比较

    function getLength($point1, $point2){

        $res = pow($point1[0]-$point2[0], 2) + pow($point1[1]-$point2[1], 2);

        return $res;

    }

    function isRectangle($point1, $point2, $point3, $point4){

        //任意两点相同 不可能组成矩形

        if($point1 == $point2 || $point1 == $point3 || $point1 == $point4 || $point2 == $point3 || $point2 == $point4 || $point3 == $point4){

            return false;

        }

        //将所有边长平方放在一个数组内

        $arr = [];

        $arr[] = getLength($point1, $point2);

        $arr[] = getLength($point1, $point3);

        $arr[] = getLength($point1, $point4);

        $arr[] = getLength($point2, $point3);

        $arr[] = getLength($point2, $point4);

        $arr[] = getLength($point3, $point4);

        //去重

        $arr = array_unique($arr);

        $arr_count = count($arr);

        //正方形也是矩形

        if($arr_count == 3 || $arr_count == 2){

            $max_length = max($arr);

            $min_length = min($arr);

            $other_length = array_diff($arr, [$max_length, $min_length]);

            //勾股定理

            if($min_length + $other_length = $max_length){

                return true;

            } else {

                return false;

            }

        } else {

            return false;

        }

}

调用

var_dump(isRectangle([0,0],[0,1],[1,1],[1,0]));

2、 下面代码结果是?

$a=array(‘1′,’2′,’3’);

$b=&$a;

$a=array(‘a’,’b’,’c’);

print_r($a);

print_r($b);

答:

Array

(

    [0] => a

    [1] => b

    [2] => c

)

Array

(

    [0] => a

    [1] => b

    [2] => c

)

3、mySQL 里有 2000w 数据,redis 中只存 20w 的数据,如何保证 redis 中的数据都是热点数据?

答:(1).保留热点数据

(2).保证redis只存入20w的数据。

首先热点数据就是频繁访问的数据,我们可以通过redis的淘汰策略来完成,这里推荐Allkeys-lru淘汰策略,该淘汰策略从数据集中挑选最近最少使用的数据删除。

再者需要解决的问题是只存入20w的数据,目前来看只能通过redis的内存限制来实现,计算20w数据使用内存大小进行预设置内存大小实现。或许内存大小不好计算,但是我们可以只记录热点数据的主键id,redis只保存热点数据主键id,而主键id一般都是定长的,大小利于计算。

4、禁用cookie后怎么使用session。请结合你做过的项目对上面的每一点进行举例剖析

答:Session URL重写,保证在客户端禁用或不支持COOKIE时,仍然可以使用Session。

如:

<?php session_start();

$_SESSION[‘url’] = ‘http://www.ailiaw.top’;

echo ‘个页面取到的session值:’.$_SESSION[‘url’];

?>

<a href=”session_a.php?<?php print session_name() ?>=<?php print session_id() ?>”>另一个页面</a>

关于PHP中浏览器禁止Cookie后,Session能使用吗?

sessionid是存储在cookie中的,解决方案如下:

Session URL重写,保证在客户端禁用或不支持COOKIE时,仍然可以使用Session

session机制。session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。

当 程序需要为某个客户端的请求创建一个session时,服务器首先检查这个客户端的请求里是否已包含了一个session标识(称为session id),如果已包含则说明以前已经为此客户端创建过session,服务器就按照session id把这个session检索出来使用(检索不到,会新建一个),如果客户端请求不包含session id,则为此客户端创建一个session并且生成一个与此session相关联的session id,session id的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个session id将被在本次响应中返回给客户端保存。 保存这个session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发挥给服务器。一般这个cookie的名字都是类似于 SEEESIONID。

关于PHP中浏览器禁止Cookie后,Session能使用吗?我们来做些测试,然后说明原理。我建立两个文件session_test.php和session_a.php内容分别是:





  1. <?php
  2. session_start();
  3. $_SESSION['url'] = 'http://www.phpddt.com';
  4. echo '这个页面取到的session值:'.$_SESSION['url'];
  5. echo "<a href='session_a.php'>另一个页面</a>";




  1. <?php
  2. session_start();
  3. echo “看这里是否获取到session的值:”.$_SESSION[‘url’];

运行session_test.php结果:

点击另一个页面,默认当然是可以获取的,但是当我禁止cookie后呢?
看看session_a.php结果:

可以看到禁用之后是不能使用cookie的。

解决方法一:URL重写PHP中的session在默认情况下是使用客户端的 Cookie 来保存session id的,所以当客户端的cookie出现问题的时候就会影响session了。但是Session并不完全依赖Cookie,它还可以通过URL Get自动传递session id的。这需要你 设置php.ini中的 session.use_trans_sid = 1 或者 编译时打开了–enable-trans-sid选项 ,让PHP 自动跨页传递session id 。当 session.use_trans_sid 为有效时, session.use_only_cookies一定要设置为无效0

好,这样,把上面session_test.php和session_a.php改造下就可以使用sesson了:

//session_test.php

<?phpsession_start();$_SESSION['url'] = 'http://www.phpddt.com';echo '这个页面取到的session值:'.$_SESSION['url'];?><a href="session_a.php">另一个页面</a>

//session_a.php

<?php//session_a.phpsession_start();echo "看这里是否获取到session的值:".$_SESSION['url']; ?><a href="session_b.php">另一个页面b</a>

//解决方法二:手动传递url





  1. <?php
  2. session_start();
  3. $_SESSION['url'] = 'http://www.phpddt.com';
  4. echo '这个页面取到的session值:'.$_SESSION['url'];
  5. ?>
  6. <a href="session_a.php?<?php print session_name() ?>=<?php print session_id() ?>">另一个页面</a>




  1. <?php
  2. session_id($_GET[‘PHPSESSID’]);
  3. session_start();
  4. echo “看这里是否获取到session的值:”.$_SESSION[‘url’];

//解决方法三:隐藏表单的方法基本原理同上。

途径3举例说明:login.html按 Ctrl+C 复制代码<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”>
<html>
<head>
<title>Login</title>
<meta http-equiv=”Content-Type” content=”text/html; charset=gb2312″>
</head>
<body>
请登录:
<form name=”login” method=”post” action=”mylogin1.php”>
用户名:<input type=”text” name=”name”><br>
口 令:<input type=”password” name=”pass”><br>
<input type=”submit” value=”登录”>
</form>
</body>
</html>按 Ctrl+C 复制代码

mylogin1.php按 Ctrl+C 复制代码<?php
$name=$_POST[’name’];
$pass=$_POST[’pass’];
if(!$name || !$pass) {
echo “用户名或密码为空,请<a href=”login.html”>重新登录</a>”;
die();
}
if (!($name==”youngong” && $pass==”123″) {
echo “用户名或密码不正确,请<a href=”login.html”>重新登录</a>”;
die();
}
//注册用户
ob_start();
session_start();
$_SESSION[’user’]= $name;
$psid=session_id();
$fp=fopen(“e:\tmp\phpsid.txt”,”w+”;
fwrite($fp,$psid);
fclose($fp);
//身份验证成功,进行相关操作
echo “已登录<br>”;
echo “<a href=”mylogin2.php”>下一页</a>”;
?>按 Ctrl+C 复制代码

mylogin2.php按 Ctrl+C 复制代码<?php
$fp=fopen(“e:\tmp\phpsid.txt”,”r”;
$sid=fread($fp,1024);
fclose($fp);
session_id($sid);
session_start();
if(isset($_SESSION[’user’]) && $_SESSION[’user’]=”laogong” {
echo “已登录!”;
}
else {
//成功登录进行相关操作
echo “未登录,无权访问”;
echo “请<a href=”login.html”>登录</a>后浏览”;
die();
}
?>按 Ctrl+C 复制代码

请关闭cookie再测试,用户名:youngong 密码:123 这是通过文件保存session id的,文件是:e:\tmp\phpsid.txt。至于用数据库的方法,就不举例子了,与文件的操作方法类似。以上方法有一个共同点,就是在前一页取得session id,想办法传递到下一页,在下一页的session_start();之前加代码session_id(传过来的session id);用关系数据库或内存数据库redis以及文本存储session时需要建立用户id和其sessionid的一个映射关闭,应对多用户时调用不同的session文件。希望能为您提供一些参考。

mySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据

(1).保留热点数据

(2).保证redis只存入20w的数据。

首先热点数据就是频繁访问的数据,我们可以通过redis的淘汰策略来完成,这里推荐Allkeys-lru淘汰策略,该淘汰策略从数据集中挑选最近最少使用的数据删除。

再者需要解决的问题是只存入20w的数据,目前来看只能通过redis的内存限制来实现,计算20w数据使用内存大小进行预设置内存大小实现。或许内存大小不好计算,但是我们可以只记录热点数据的主键id,redis只保存热点数据主键id,而主键id一般都是定长的,大小利于计算。

这个面试题其实考察的是redis的淘汰机制:

noeviction: 不删除策略。当达到最大内存限制时, 如果需要使用更多内存,则直接返回错误信息。(redis默认淘汰策略)
allkeys-lru: 在所有key中优先删除最近最少使用(less recently used ,LRU) 的 key。
allkeys-random: 在所有key中随机删除一部分 key。 volatile-lru: 在设置了超时时间(expire)的key中优先删除最近最少使用(less recently used ,LRU) 的 key。 volatile-random:
在设置了超时时间(expire)的key中随机删除一部分 key。 volatile-ttl: 在设置了超时时间(expire)的key中优先删除剩余时间(time to live,TTL) 短的key。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

首先大概计算数据所占用的内存,然后可以在配置文件里面设置maxmemory(单位是byte字节)参数和参数maxmemory-policy(过期策略)

上面描述大概就是说要注意,设置的值

设置淘汰机制: