mwwdfl 发布的文章

基础的使用方式随便在网上都能搜到,所以就不谈论这一块了。

主要想分享一下高级特性,如果不对请指正。

一、数据失效方式:因为Redis是基于内存的,而由于内存的昂贵,注定它的大小是有限的,所以当数据量较大、内存被占满的时候,再插入新数据,就要涉及到如何进行调度了。

调度方式主要分为四类:不删除、LRU(最近最久未使用)、随机删除、删除剩余过期时间最短。再考虑到部分key存在过期的特性,所以分为一下具体6类:

•1、noeviction:达到内存限额后返回错误,不删除已有内容。
•2、allkeys-lru:使用LRU算法(针对所有数据)
•3、volatile-lru:使用LRU算法(针对设置有过期时间的数据)
•4、allkeys-random:随机删除(针对所有数据)
•5、volatile-random:随机删除(针对设置有过期时间的数据)
•6、volatile-ttl:对设置有过期时间的数据中,删除即将失效的。

二、事务:
1、redis是支持事务的,但是很重要的一点是:不支持回滚机制。什么意思呢?如果在事务中执行了10条命令,在第三条失败后,后面的4-10不会执行,但是前面的1-2却是能够生效的(在mysql等数据库中,如果事务中出现错误,会整个回滚到事务执行前的状态)
2、watch命令:为了照顾事务中数据一致性,redis也提供了watch乐观锁机制来保证数据一致。具体的方式就是在事务中,对某些key执行watch命令,之后再填写对应操作命令,如果在执行事务时发现被watch的key已经修改,那么在watch之后的所有命令就失败。通过这样的方式在不支持回滚的情况下,也保证了数据的一致性。

三、数据持久化:redis中,持久化是作为备份的手段使用的,一般来说常用的方式有两种:

(1)、snap shot(快照机制,也就是常说的rdb):

首先执行save或bgsave命令,它们俩的区别是save会直接在主进程中执行备份(此时主进程阻塞,就相当于此时redis不能提供服务了),bgsave会启动一个子进程执行备份操作,而父进程继续提供服务。

bgsave命令的执行过程:
•1.redis调用fork,现在有了子进程和父进程。
•2.父进程继续处理client请求,子进程负责将内存内容写入到临时文件。由于os的写时复制机制(copyon write)父子进程会共享相同的物理页面,当父进程处理写请求时os会为父进程要修改的页面创建副本,而不是写共享的页面。所以子进程的地址空间内的数据是fork时刻整个数据库的一个快照。
•3.当子进程将快照写入临时文件完毕后,用临时文件替换原来的快照文件,然后子进程退出。

(2)、aof(append-only file):
本质上就是一个记录日志文件的机制,
redis会将每一个收到的写命令都通过write函数追加到文件中(默认是 appendonly.aof)。当redis重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。
这样做的好处是实时保存的内存占用比快照小很多(使用快照保存一次会占用当前内存双倍的空间)
但aof文件的追加写方式会导致磁盘增量占用,解决方式是重写aof文件,什么意思呢?就是在特定的时间(可以自己规定和调用,一般是在aof文件过大的时候)启动子进程收集当前库中数据并转化为写命令,把这些命令写入临时文件中,完成之后再用临时文件替换老的aof文件,这样就达到了aof文件的“瘦身”。(其实就有点类似于rdb中的bgsave,只不过区别是aof存的是命令,而rdb存的是具体数据)
aof的执行方式有以下三种:
1、appendfsyncalways (每次收到一条命令就执行一次AOF,不推荐,太耗资源)
2、appendfsyncno (完全依赖OS调度,不推荐,不稳定)
3、appendfsync everysec (每秒钟强制写入磁盘一次,资源和稳定性平衡,推荐使用)

四、主从复制:
主从复制方式主要用于容灾、备份。(注意它不是分布式解决方案,它只是远程备份)。
配置方式如下:
•配置slave服务器只需要在slave的配置文件中加入如下配置即可,剩下的redis会自动帮你处理。
•slaveof 192.168.1.1 6379 •#指定master的ip和端口

具体过程如下:

五、消息订阅:

redis作为一个pub/sub server,在订阅者和发布者之间起到了消息路由的功能。订阅者可以通过subscribe和psubscribe命令向redis server订阅自己感兴趣的消息类型,redis将消息类型称为通道(channel)。当发布者通过publish命令向redis server发送特定类型的消息时。订阅该消息类型的全部client都会收到此消息。这里消息的传递是多对多的。一个client可以订阅多个 channel,也可以向多个channel发送消息。

转载自:http://blog.csdn.NET/lambert310/article/details/51513516

什么是跨域?

跨域,指的是浏览器不能执行其他网站的脚本,说白了就是不同域名之间的相互访问。它是由浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制。

所谓同源是指,域名,协议,端口均相同,比如:

http://www.123.com/index.html 调用 http://www.123.com/server.PHP (非跨域)

http://www.123.com/index.html 调用 http://www.456.com/server.php (主域名不同:123/456,跨域)

http://abc.123.com/index.html 调用 http://def.123.com/server.php (子域名不同:abc/def,跨域)

http://www.123.com:8080/index.html 调用 http://www.123.com:8081/server.php (端口不同:8080/8081,跨域)

http://www.123.com/index.html 调用 https://www.123.com/server.php (协议不同:http/https,跨域)

请注意:localhost和127.0.0.1虽然都指向本机,但也属于跨域。

浏览器执行javascript脚本时,会检查这个脚本属于哪个页面,如果不是同源页面,就不会被执行。

解决办法:

1、JSONP:

使用方式参考下面网址,但是要注意JSONP只支持GET请求,不支持POST请求。
http://www.cnblogs.com/2050/p/3191744.html(这篇文章总结的挺到位)
http://blog.csdn.net/joyhen/article/details/21631833(两篇足够了解)
2、代理:

例如www.123.com/index.html需要调用www.456.com/server.php,可以写一个接口www.123.com/server.php(例如在你的www.123.com/server.php中写一个curl),由这个接口在后端去调用www.456.com/server.php并拿到返回值,然后再返回给index.html,这就是一个代理的模式。相当于绕过了浏览器端,自然就不存在跨域问题。

3、PHP端修改header(XHR2方式)

在php接口脚本中加入以下两句即可:

header('Access-Control-Allow-Origin:*');//允许所有来源访问

header('Access-Control-Allow-Method:POST,GET');//允许访问的方式

//把字符串 "Hello world!" 中的字符 "world" 替换为 "Shanghai":
str_replace("world","Shanghai","Hello world!");

//判断某字符串中是否包含某字符串的方法
if(strpos('www.idc-gz.com','idc-gz') !== false){echo '包含';}

去空格或或其他字符:
▶trim() 删除字符串两端的空格或其他预定义字符
"$str = ""\r\nHello World!\r\n"";
echo trim($str);"
目标字串 清除后的字符串
▶rtrim() 删除字符串右边的空格或其他预定义字符
"$str = ""Hello World!\n\n"";
echo rtrim($str);"
▶chop() rtrim()的别名
▶ltrim() 删除字符串左边的空格或其他预定义字符
"$str = ""\r\nHello World!"";
echo ltrim($str);"
▶dirname() 返回路径中的目录部分
echo dirname("c:/testweb/home.php");
一个包含路径的字符串 返回文件路径的目录部分//c:/testweb
字符串生成与转化:
▶str_pad() 把字符串填充为指定的长度
"$str = ""Hello World"";
echo str_pad($str,20,""."");"
要填充的字符串|新字符串的长度|供填充使用的字符串,默认是空白 完成后的字符串
▶str_repeat() 重复使用指定字符串
echo str_repeat(".",13);
要重复的字符串|字符串将被重复的次数 13个点
▶str_split() 把字符串分割到数组中
print_r(str_split("Hello"));
要分割的字符串|每个数组元素的长度,默认1 拆分后的字符串数组
▶strrev() 反转字符串
echo strrev("Hello World!");
目标字符串 颠倒顺序后的字符串!dlroW olleH
▶wordwrap() 按照指定长度对字符串进行折行处理
"$str = ""An example on a long word is: Supercalifragulistic"";
echo wordwrap($str,15);"
目标字符串|最大宽数 折行后的新字符串
▶str_shuffle() 随机地打乱字符串中所有字符
echo str_shuffle("Hello World");
目标字符串 顺序打乱后的字符串
▶parse_str() 将字符串解析成变量
"parse_str(""id=23&name=John%20Adams"",$myArray);
print_r($myArray);"
要解析的字符串|存储变量的数组名称
"返回Array(
[id] => 23
[name] => John Adams)"
▶number_format() 通过千位分组来格式化数字
"echo number_format(""1000000"");
echo number_format(""1000000"",2);
echo number_format(""1000000"",2,"","",""."");"
要格式化的数字|规定多少个小数|规定用作小数点的字符串|规定用作千位分隔符的字符串"
1,000,000
1,000,000.00
1.000.000,00"
大小写转换:
▶strtolower() 字符串转为小写
echo strtolower("Hello WORLD!");
目标字符串 小写字符串
▶strtoupper() 字符串转为大写
echo strtoupper("Hello WORLD!");
大写字符串
▶ucfirst() 字符串首字母大写
echo ucfirst("hello world");
Hello world
▶ucwords() 字符串每个单词首字符转为大写
echo ucwords("hello world");
Hello World
html标签关联:
▶htmlentities() 把字符转为HTML实体
"$str = ""John & 'Adams'"";
echo htmlentities($str, ENT_COMPAT);"
John & 'Adams'
▶htmlspecialchars() 预定义字符转html编码
▶nl2br() \n转义为
标签
echo nl2br("One line.\nAnother line.");
处理后的字符串
▶strip_tags() 剥去 HTML、XML 以及 PHP 的标签
echo strip_tags("Hello world!");
▶addcslashes() 在指定的字符前添加反斜线转义字符串中字符
"$str = ""Hello, my name is John Adams."";
echo $str;
echo addcslashes($str,'m');"
目标字符串|指定的特定字符或字符范围
▶stripcslashes() 删除由addcslashes()添加的反斜线
echo stripcslashes("Hello, \my na\me is Kai Ji\m."); 目标字符串
Hello, my name is Kai Jim.
▶addslashes() 指定预定义字符前添加反斜线
$str = "Who's John Adams?";echo addslashes($str);
把目标串中的' " \和null进行转义处理
▶stripslashes() 删除由addslashes()添加的转义字符
echo stripslashes("Who\'s John Adams?");
清除转义符号Who's John Adams?
▶quotemeta() 在字符串中某些预定义的字符前添加反斜线
"$str = ""Hello world. (can you hear me?)"";
echo quotemeta($str);"
Hello world. (can you hear me?) ". \ + * ? [] ^ $ () "
▶chr() 从指定的 ASCII 值返回字符
echo chr(052);
ASCII 值 返回对应的字符//*
▶ord() 返回字符串第一个字符的 ASCII 值
echo ord("hello");
字符串 第一个字符的 ASCII 值
字符串比较:
▶strcasecmp() 不区分大小写比较两字符串
echo strcasecmp("Hello world!","HELLO WORLD!");
两个目标字符串 大1|等0|小-1
▶strcmp() 区分大小写比较两字符串
▶strncmp() 比较字符串前n个字符,区分大小写
int strncmp ( string $str1 , string $str2 , int $len )
▶strncasecmp() 比较字符串前n个字符,不区分大小写
int strncasecmp ( string $str1 , string $str2 , int $len )
▶strnatcmp() 自然顺序法比较字符串长度,区分大小写
int strnatcmp ( string $str1 , string $str2 ) 目标字符串
▶strnatcasecmp() 自然顺序法比较字符串长度,不区分大小写
int strnatcasecmp ( string $str1 , string $str2 )
字符串切割与拼接:
▶chunk_split() 将字符串分成小块
str chunk_split(str $body[,int $len[,str $end]])
$body目标字串,$len长度,$str插入结束符 分割后的字符串
▶strtok() 切开字符串
str strtok(str $str,str $token)
目标字符串$str,以$token为标志切割 返回切割后的字符串
▶explode() 使用一个字符串为标志分割另一个字符串
array explode(str $sep,str $str[,int $limit])
$sep为分割符,$str目标字符串,$limit返回数组最多包含元素数 字符串被分割后形成的数组
▶implode() 同join,将数组值用预订字符连接成字符串
string implode ( string $glue提供一个连接字符或者字符串 , array $pieces被连接的数组 )
$glue默认,用''则直接相连
▶substr() 截取字符串
string substr ( string $string , int $start [, int $length ] )
字符串查找替换:
▶str_replace() 字符串替换操作,区分大小写
mix str_replace(mix $search,,mix $replace,mix $subject[,int &$num])
$search查找的字符串,$replace替换的字符串,$subject被查找字串,&$num 返回替换后的结果
▶str_ireplace() 字符串替换操作,不区分大小写
mix str_ireplace ( mix $search , mix $replace , mix $subject [, int &$count ] )
$search查找的字符串,$replace替换的字符串,$subject被查找字串,&$num 返回替换后的结果
▶substr_count() 统计一个字符串,在另一个字符串中出现次数
"int substr_count ( string $haystack , string $needle [, int $offset = 0 [, int $length ]] )
"
▶substr_replace() 替换字符串中某串为另一个字符串
mixed substr_replace ( mixed $string , string $replacement , int $start [, int $length ] )
▶similar_text() 返回两字符串相同字符的数量
int similar_text(str $str1,str $str2)
两个比较的字符串 整形,相同字符数量
▶strrchr() 返回一个字符串在另一个字符串中最后一次出现位置开始到末尾的字符串
string strrchr ( string $haystack , mixed $needle 搜索字符串)
▶strstr() 返回一个字符串在另一个字符串中开始位置到结束的字符串
string strstr ( string $str被搜索的字符串, string $needle搜索字符串 , bool $before_needle )
▶strchr() strstr()的别名,返回一个字符串在另一个字符串中首次出现的位置开始到末尾的字符串
string strstr ( string $haystack , mixed $needle [, bool $before_needle = false ] )
▶stristr() 返回一个字符串在另一个字符串中开始位置到结束的字符串,不区分大小写
string stristr ( string $haystack , mixed $needle [, bool $before_needle = false ] )
▶strtr() 转换字符串中的某些字符
string strtr ( string $str , string $from , string $to )
▶strpos() 寻找字符串中某字符最先出现的位置
int strpos ( string $haystack , mixed $needle [, int $offset = 0 ] )
▶stripos() 寻找字符串中某字符最先出现的位置,不区分大小写
int stripos ( string $haystack , string $needle [, int $offset ] )
▶strrpos() 寻找某字符串中某字符最后出现的位置
int strrpos ( string $haystack , string $needle [, int $offset = 0 ] )
▶strripos() 寻找某字符串中某字符最后出现的位置,不区分大小写
int strripos ( string $haystack , string $needle [, int $offset ] )
▶strspn() 返回字符串中首次符合mask的子字符串长度
int strspn ( string $str1 , string $str2 [, int $start [, int $length ]] )
▶strcspn() 返回字符串中不符合mask的字符串的长度
int strcspn ( string $str1 , string $str2 [, int $start [, int $length ]] )
$str1被查询,$str2查询字符串,$start开始查询的字符,$length查询长度 返回从开始到第几个字符
字符串统计:
▶str_word_count() 统计字符串含有的单词数
mix str_word_count(str $str,[])
目标字符串 统计处的数量
▶strlen() 统计字符串长度
int strlen(str $str)
目标字符串 整型长度
▶count_chars() 统计字符串中所有字母出现次数(0..255)
mixed count_chars ( string $string [, int $mode ] )
字符串编码:
▶md5() 字符串md5编码 "$str = ""Hello"";
echo md5($str);
"

问题描述:用的好好的,突然断了,重启一下MySQL(service mysql restart),问题得到暂时解决,不到半天又崩了。。。
解决方法:(问题不一定一样)我的查看MySQL错误日志(我的在var/log/mysql/error.log)发现有十多张表is marked as crashed and should be repaired(表损坏,需要修复)
首先找到你的数据库文件(在数据库中执行 show variables like '%datadir%';就会显示数据库文件的路径),看看出问题的表在哪个数据库中,然后进入到这个数据库,比如我的:myisamchk -f /var/lib/mysql/we7/*.MYI,即可;
第二种(我的是微擎报的这个错):
进入到命令行界面输入sql:repair table your_table_name USE_FRM;即可修复
修复哪张表就换成哪个表名