NoSQLRedis 学习

LSB-Version:core-4.0-ia32:core-4.0-noarch:graphics-4.0-ia32:gr    aphics-4.0-noarch:printing-4.0-ia32:printing-4.0-noarch

 

 

Distributor ID: CentOS

缓存:因为redis和memcache一样,也是一个内存缓存系统。

 

[root@asion ~]# lsb_release -a

开发者:

 

Redis是开源,BSD许可,高级的key-value缓存存储系统
可以用来囤积字符串,哈希结构,链表,集合,由此,常用来提供数据结构服务。
常常也叫做 结构化
非关系型数据库。

 

3. hash操作

注意:redis中的hash可以理解为php里面的关联数组

$arr = array('key'=>value,'key2'=>value2)

$arr = array('name'=>'zhangsan','age'=>12)

 

>
hset KEY field value


 

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174552788-1879629928.png)

 

>
hmset KEY field1 value1 \[field2 value2 field3 value3 ......fieldn
valuen\] 

作用: 设置field1->N 个域, 对应的值是value1->N

(对应PHP理解为 $key = array(file1=>value1, field2=>value2
....fieldN=>valueN))

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174553273-2008593834.png)

>
hget KEY field 

作用: 返回key中field域的值

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174553663-26811119.png)

 

>
hmget KEY field1 field2 fieldN 

作用: 返回key中field1 field2 fieldN域的值

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174554023-1702434721.png)

>
hgetall KEY 

作用:返回key中,所有域与其值

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174554460-3119466.png)

>
hdel key field 

作用: 删除key中 field域

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174554882-1426389277.png)

 

>
hlen key 

作用: 返回key中元素的数量

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174555398-156313629.png)

 

>
hexists key field 

作用: 判断key中有没有field域

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174555960-1766077758.png)

 

 

>
hkeys key 

作用: 返回key中所有的field

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174556476-1129176703.png)

 

>
hvals key 

作用: 返回key中所有的value

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174556851-1949701035.png)

 

redis里面的集合就是php里面的关联数组

Redis能保存 string set orderset link hash 所以Redis又叫结构化数据库

string 保存字符串

set 主要用作好友推荐场景

hash 关联数组

十、php操作redis
================
  1. 解压文件

    NoSQL 1

  2. 执行phpize命令(相对路径)

    NoSQL 23. 执行 configure
    (要求指定 php-config的绝对路径)

    NoSQL 3

  3. 执行make && make install

    NoSQL 4

  4. 浮动一个索引

    NoSQL 5

  5. 修改php.ini文件

    /usr/local/php/lib/php.ini

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174600038-37476557.png)
  1. 重启Apache

    NoSQL 6

  2. 在htdocs目录下添加测试文件 phpinfo() ,并启动Apache

    NoSQL 7

  3. php操作redis

    redis.php文件

    NoSQL 8

    浏览器

    NoSQL 9

    十一、redis的权位难点

  4. 修改配置文件

    NoSQL 10

  5. 重启redis

    a. 在签到的时候 使用 -a 参数 扩张密码

    NoSQL 11

    不输入密码,则没权力操作:

    NoSQL 12

    b. 在登录之后 使用 auth 命令输入密码:

    NoSQL 13

    c. 使用php来验证密码

    NoSQL 14

     

  6. 当验证成功未来,可以正常使用

    NoSQL 15

    只顾:Redis是足以安装密码来访问的,然则Memcache是没有平安密码,所以Memcache在应用的时候,提议在内网使用。或者独立为Memcache也一个防火墙验证规则即可。iptables 学习(防火墙验证规则)

    120.24.68.34 允许那几个公网ip访问 ip为 186.23.45.32这台Memcache

     

    留意:借使您协调的虚拟机可以ping通全班的总计机,不过ping不通你自己的电脑?

    可能:自己电脑的防火墙是开着。

    NoSQL 16

    注意:借使你ping不通你的虚拟机,那一个时候是虚拟机的防火墙开启

    只需求实践

    # iptables -F

    #iptbales -L 查看防火墙规则

    再有可能是您虚拟机的 selinux 开启了 selinux
    是Linux下的一个攀枝花关闭软件(类似防火墙)

    # setenforce 0 即可关闭selinux操作

    # getenforce 查看

    NoSQL 17

     

    留神:在Linux下自然借使 tab 补齐

     

     

     

    专注:互连网难点?

  7. 永不修改Linux网络ip获取,让它自动获取即可,千万不要改成static

    NoSQL 18

  8. 时常起步MySQL的时候,然后接纳MySQL去老是服务器

    报错/tmp/mysql.sock文件not
    found

    # 对于的/tmp 目录下 执行

    # touch mysql.sock 创设文件

    # 重启MySQL 重启成不成功

    # ps axu | grep mysqld

    # 重启连接即可

    十二、redis如何促成持久化

    何以是持久化?

    纵使将内存的多寡保存到磁盘上,形成永久保存的文书。

     

    怎么着在vim下搜索之后,落成单词的跳动

    # n (next)

    假若不期待在vim出现高亮的语法提醒,只必要实践

    # 末行情势

    # noh (no high)

     

  9. 修改配置文件

    NoSQL 19

  10. 测试一下

    在这些命令下 执行 bgsave (background
    save)也落实手工的将数据保存到磁盘上。

    NoSQL 20

    测试,先关闭服务器

    # pkill -9 redis-server

     

    在重写获取

    NoSQL 21

    在相应的装置目录下,多了一个磁盘文件

    NoSQL 22

    专注:文件的后缀是足以修改的。

    留意: 如何保存Redis能到位的持久化数据?

    答:依照实际的工作来规范一个适当的写入时间(写的快),须求测试一段时间来确定这一个小时。

    30s 只好进行 10000次操作这一个时候就足以将数据写入到磁盘上。

     

出品官网:http://redis.io/

 

Codename: Final

 

端口含义:

1.环境检查

Description: CentOS release 5.5 (Final)

华语文档:http://redisdoc.com/

 

error libiconv_open undefined

  1. 编译前环境准备(源码编译前需实践如下命令)

一、系统概述

 

iconv(‘gb2312′,’utf8’,$data);

 

 

curl-devel gcc gcc-c++ zlib-devel openssl openssl-devel pcre-devel gd
kernel keyutils patch     perl kernel-headers compat* mpfr cpp glibc
libgomp libstdc++-devel ppl cloog-ppl     keyutils-libs-devel
libcom_err-devel libsepol-devel libselinux-devel krb5-devel zlib-devel
    libXpm* freetype libjpeg* libpng* php-common php-gd ncurses*
libtool* libxml2     libxml2-devel patch cmake

# cat /etc/issue

非关系型数据库Redis V3.0(
6379 端口)

NoSQL, 

NoSQL 23

Release: 5.5

redis的github地址:https://github.com/antirez/redis

 

Redis is an open source, BSD licensed,
advanced key-value cache and
store(存储). It is often referred to as a data structure server
since keys can contain strings, hashes, lists, sets, sorted sets,
bitmaps and hyperloglogs.

# uname -a ###unix name -a all

http://blog.csdn.net/felixit0120/article/details/7454862

留意:安装lamp环境报错?

NoSQL 24

NoSQL 25

参考手册:http://redisdoc.com/

二、编译安装

  1. 下载源码到 /usr/local/src/ 目录下

    [root@asion
    src]#
    wget
    http://download.redis.io/releases/redis-3.0.3.tar.gz

    NoSQL 26

     

    1. 解压源码文件

    [root@asion
    src]#
    tar -zxvf redis-3.0.3.tar.gz

    NoSQL 27

     

  2. 跻身解压目录直接执行 make 命令, (无须执行 ./configure
    命令),然后实施 make install
    (注意设置路径) centos
    5.5 (企业版5) (公司版4)

    注意:在32位操作系统上报错音讯

    NoSQL 28

     

    解决方案:

    在make的时候 指定操作系统位数
    CFLAGS=’-march=i686′ 即可

    假如在源码包内执行过编译,要求先去掉一下条件,执行 make
    clean命令即可

    NoSQL 29

    32位系统装置

    [root@asion
    src]#
    cd redis-3.0.3

    [root@asion
    redis-3.0.3]#
    make CFLAGS=”-march=i686″
    (在32位系统下需加上该编译参数。64位不需求)

     

    32操作系统:

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174519195-752878352.png) 

 

64位操作系统:


![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174519726-253589394.png)

1. 如果在Linux下不需要执行该命令 可以使 ctrl+c 来换到下一行

2. 如果在Linux下需要跳转到该命令的开头 可使用 ctrl+a 来跳转到开头

3. 如果在Linux下需要跳转到该命令的末尾 可以使用 ctrl+e 来跳转到末尾

 

**在make install
的时候指定安装路径:**PREFIX
需要大写 

**\[root@asion src\]\#** make PREFIX=/usr/local/redis/ install

 

复制redis的配置文件到redis的安装目录下

**\[root@asion
redis-3.0.3\]\#** cp redis.conf /usr/local/redis/ 

 

4. 编译安装完成后,进入安装目录 /usr/local/redis/ 启动服务 

\[root@asion redis\]\# ls 

bin redis.conf 

a. 进入 bin 目录 

\[root@asion
bin\]\# ls 

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174520085-189878557.png)

无配置文件运行:

启动服务:

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174520523-618666865.png)

显示界面:

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174521085-1091596886.png)

读取配置文件信息启动:

b. \[root@asion
bin\]\#  ./redis-server ../redis.conf 

成功运行: 

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174521648-1941003127.png)

注意:此时redis的启动占据了终端,只需要


修改配置redis.conf配置文件,即可让服务在后端运行


![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174522210-131407657.png)

 

需要注意redis.conf文件的位置


![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174522679-1063504310.png)

执行启动命令:

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174523054-1581630836.png)

 

查看服务器是否启动:

\# ps aux | grep redis-server

 

关闭服务

\# pkill -9 redis-server

 

三、客户端操作
==============

1. 通过客户端连接到服务器端,并测试


**\[root@asion
bin\]\#** ./redis-cli 

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174523695-305656610.png) 

四、Redis相关命令
=================

>
set KEY VALUE //设置KEY 的值为 VALUE 

作用: 设置键的值

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174524101-1666413961.png)

 

 

>
get KEY //获取KEY 的值 

作用: 获取键的值

返回值: 成功返回value ,失败返回 nil

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174524460-2112103596.png)

获取不存在的值

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174525132-1667176019.png)

 

>
del KEY1 KEY2 ... KEYn //删除一个和多个键 

作用: 删除1个或多个键

返回值: 不存在的key忽略掉,返回0;返回真正删除的key的数量 

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174525601-1268942664.png)

删除多个:成功则返回删除的个数

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174526116-996923018.png)

 

>
rename KEY NEWKEY //给KEY赋一个新的键名 

作用: 给key赋一个新的key名

注意:如果newkey已经存在,则newkey的原值被覆盖

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174526570-1984717184.png)

注意:如果原先newname存在,则newname原先的值会被覆盖:

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174527101-227760730.png)

>
renamenx KEY NEWKEY //当键名存在后的改名操作 

作用: 把key改名为newkey

返回: 发生修改返回1,未发生修改返回0

注: nx--> not exists,
即newkey不存在时, 作改名动作。存在则不更改

 

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174528538-979538125.png)

 

 

>
select N //选择数据库,N为整数 数据库的名称 默认 redis会有 0
--15个数据库(16个)默认是在第0个数据库 

作用: 更改数据库

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174529257-1550080837.png)

 

>
exists KEY //判断key是否存在 

作用: 判断key是否存在,返回1 / 0

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174529773-1479296301.png)

 

>
type KEY //查看存储值的类型 

作用: 返回key存储的值的类型

可能值有string、link、set、order set、 hash

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174530273-1008549600.png)

五、字符串操作


>
set KEY VALUE \[ex 秒数\] | \[px 毫秒数\] \[nx\] | \[xx\] 

 

例如:

set name asion ex 10 //
设置key为name,value值为asion,且有效期为10秒

set age 25 px 9000 // 设置key为age,value值为25,且有效期为 9秒

 

 

注:

① | 代表其中只能使用一个

 

② 如果ex、px同时出现的话,以后面的有效期为准

例如: set age 25 ex 1000 px 9000 // 实际有效期是9000毫秒 

 

③ nx: 表示key不存在时,执行操作

xx: 表示key存在时,执行操作

 

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174530788-400438818.png)

 

 

>
mset KEY1 VALUE2 KEY2 VALUE2 // multi set一次性设置多个键值 

 

例如: mset key1 value1 key2 value2 ....

multiple set 多个设置

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174531351-256929888.png)

 

 

>
get KEY // 获取键为 KEY 的值 

 

例如: get name

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174531757-1843023016.png)

 

>
mget key1 key2 ... //获取多个键的值 

 

例如: mget key1 key2 key3

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174532273-818080288.png)

 

>
setrange key offset value //把字符串的offset偏移字节,改成value


 

作用: 把字符串的offset偏移字节,改成value

**127.0.0.1:6379\[1\]>** set name
asion

OK

**127.0.0.1:6379\[1\]>** setrange
name 0 B

(integer) 5

**127.0.0.1:6379\[1\]>** get name

"Bsion"

注意: 如果偏移量 **大于** 字符长度,
该字符自动补0x00 

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174532663-988548376.png)

 

>
append KEY VALUE // 把VALUE追加到KEY的原值上 

 

例如: 把value追加到key的原值上

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174533116-1662020949.png)

 

>
getrange KEY start stop //是获取字符串中 \[start, stop\]范围的值


 

注意: 对于字符串的下标,左数从0开始,右数从-1开始

**127.0.0.1:6379>** set name asion

OK

**127.0.0.1:6379>** getrange name
0 1

"as"

注意: 

1: start>=length, 则返回空字符串

2: stop>=length,则截取至字符结尾

3: 如果start 所处位置在stop右边, 返回空字符串

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174533616-300394112.png)

 

 

>
getset KEY NEWVALUE //获取并返回旧值,设置新值 

 

**127.0.0.1:6379>** get name

"asion"

**127.0.0.1:6379>** getset name
bill

"asion"

**127.0.0.1:6379>** get name

"bill"

 

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174534101-550868674.png)

 

>
incr KEY //指定的KEY的值加1,并返回加1后的值 

作用: 指定的key的值加1,并返回加1后的值

**注意:** 

1:不存在的key当成0,再incr操作

2: 范围为64有符号

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174534679-334695532.png)

 

 

>
incrby KEY number 

作用: 将指定key的值增加到设定的 number 整数

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174535382-520723161.png)

 

>
incrbyfloat KEY floatnumber 

作用: 将指定key的值增加到设定的 floatnumber 浮点数

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174535820-228214452.png)

 

>
decr KEY 

作用: 将指定key 的值减少 1

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174536866-250987278.png)

 

>
decrby KEY number 

作用: 将指定key 的值减少指定 number 整数

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174537476-1733053218.png)

 

>
getbit KEY offset 

作用:获取值的二进制表示,对应位上的值(从左开始,从**0**编号)

**127.0.0.1:6379>** set char A

OK

**127.0.0.1:6379>** getbit char 1

(integer) 1

**127.0.0.1:6379>** getbit char 0

(integer) 0

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174537960-704047999.png)

 

案例使用:位的处理可以用在什么地方?

解决场景:1010001 签到业务场景

 

>
setbit KEY offset value 

作用: 设置offset对应二进制位上的值

返回: 该位上的旧值

**注意:** 

1:如果offset过大,则会在中间填充0,

2: offset最大大到多少

3:offset最大2^32-1,可推出最大的的字符串为512M

 

>
bitop operation destkey key1 \[key2 ...\] 

 

对key1、key2......keyN 作operation
操作,并将结果保存到 destkey 上

operation 可以是 AND 、 OR 、 NOT 、 XOR(相同为0 不同为1)

**注意:** 对于NOT操作, key不能多个

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174538913-1704237487.png)

 

六、链表操作
============

>
lpush KEY VALUE // 把值插入到链接头部 left push 

作用: 把值插入到链接头部 left push

**127.0.0.1:6379>** lpush link a b
c d

(integer) 4

**127.0.0.1:6379>** lrange link 0
-1 left range 0 -1

1) "d"

2) "c"

3) "b"

4) "a"

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174539601-532956257.png)

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174540023-1747054163.png)

 

 

 

>
rpop KEY //返回并删除链表尾元素 right pop 

作用: 返回并删除链表尾元素

 

rpush、lpop: 等同 

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174540554-1079739669.png)

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174540960-1343081653.png)

商品抢购系统:

商城活动促销进行抢购操作,Redis的链表存了10000人。rpop弹出100个即为商品发放完成。

 

>
lrange KEY start stop //返回链表中\[start,stop\]内的元素 

作用: 返回链表中\[start ,stop\]中的元素

规律: 左数从**0**开始,右数从**-1**开始

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174542007-1262902207.png)

 

>
lrem KEY count value 

作用: 从key链表中删除 value值

注: 删除count的绝对值个value后结束

count>0 从表头删除 

count<0 从表尾删除 

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174542913-1883282973.png)

 

 

>
ltrim KEY start stop 

作用: 剪切key对应的链接,切\[start,stop\]一段,并把该段重新赋给key 

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174543804-610182860.png)

 

>
lindex KEY index 

作用: 返回index索引上的值,

**127.0.0.1:6379>** lrange link 0
-1

1) "d"

2) "b"

3) "a"

**127.0.0.1:6379>**  lindex link 1

"b"

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174544554-1829873880.png)

 

>
llen key 

作用:计算链接表的元素个数

**127.0.0.1:6379>**  lrange link 0
-1

1) "d"

2) "b"

3) "a"

**127.0.0.1:6379>** llen link

(integer) 3

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174545288-305748007.png)

 

>
linsert key after|before search value 

作用: 在key链表中寻找'search',并在search值之前|之后,插入value

注: 一旦找到一个search后,命令就结束了,因此不会插入多个value

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174545945-873170658.png)

七、集合操作 
===================================================

集合的性质: 唯一性,无序性,确定性

唯一性:相同的元素只能在集合里面出现一次

无序性:集合里面的元素没有位置上的概念

确定性:集合里面的元素个数和值是确定的

 

因此想看元素,要么随机先一个,要么全选

> smembers set1

 

>
sadd KEY value1 value2 

作用: 往集合key中增加元素

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174546523-281930162.png)

 

>
srem sets value1 value2 

作用: 删除集合中集为 value1 value2的元素

返回值: 忽略不存在的元素后,真正删除掉的元素的个数

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174547257-1334000047.png)

 

 

>
spop KEY 

作用: 返回并删除集合中key中1个随机元素

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174548023-1850395432.png)

随机--体现了无序性

 

>
srandmember KEY 

作用: 返回集合key中,随机的1个元素.

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174548710-76347715.png)

 

>
sismember KEY value 

作用: 判断value是否在key集合中

是返回1,否返回0

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174549538-1267902182.png)

 

>
smembers KEY 

作用: 返回集中中所有的元素

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174549976-841455036.png)

 

>
scard KEY 

作用: 返回集合中元素的个数

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174550304-742778364.png)

八、order set 有序集合 
===================================================================================================

>
zadd KEY score1 value1
score2 value2 ..


添加元素

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174550679-375212523.png)

 

>
zrem KEY value1 value2 .. 

作用: 删除集合中的元素

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174551116-265357950.png)

 

>
zrange KEY start stop \[WITHSCORES\] 

把集合排序后,返回名次\[start,stop\]的元素

默认是升续排列

withscores 是把score也打印出来

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174551570-1278839339.png)

 

>
zrevrange KEY start stop 

作用:把集合降序排列,取名字\[start,stop\]之间的元素

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174552023-2001204539.png)

 

>
zcard KEY 

返回元素个数

![](https://images2015.cnblogs.com/blog/920432/201604/920432-20160420174552398-305621748.png)

 

专注:当得到操作系统新闻之后,下载对应操作系统的源码包

国内对NoSQL的使用:

 

[root@asion ~]# yum -y install make apr* autoconf automake

 

然则它多了一个持久化的效用,可以将内存之中的多寡,同步到磁盘上,避免数据的散失。

 

网站地图xml地图