Redis的安装与使用

文章目录

  • Redis的安装与使用
    • 1 Window安装redis
      • 1.1 下载redis源码压缩包
      • 1.2 配置环境变量
      • 1.3 开启命令行服务
      • 1.4 将redis服务添加到windows服务列表
    • 2 CentOS7安装redis
      • 2.1 下载redis,英文官网是最新的,中文官网不是最新的
      • 2.2 解压xx.tar.gz压缩文件
      • 2.3 安装gcc环境
      • 2.4 make命令会把安装软件的环境安装好
      • 2.5 redis默认安装路径
      • 2.6 将redis配置文件复制到当前目录下
      • 2.7 启动服务
      • 2.8 查看redis的进程是否开启
      • 2.9 关闭redis服务
    • 3 redis基础知识
    • 4 五大数据类型
      • 4.1 redis-key
      • 4.2 redis-string
      • 4.3 redis-hash
      • 4.4 redis-list
      • 4.5 redis-set
      • 4.6 redis-zset
    • 5 Redis事务
      • 5.1 正常执行事务
      • 5.2 放弃事务
      • 5.3 编译型异常(代码有问题,命令有错),事务中所有的命令都不会被执行
      • 5.4 运行时异常(1/0)如果队列中存在语法型,那么执行命令的时候其他命令是可以执行的,错误命令会抛出异常
    • 6 redis监控 Watch
      • 6.1 悲观锁
      • 6.2 乐观锁
    • 7 Redis.conf 详解
      • 7.1-介绍
      • 7.2-包含
      • 7.3-网络
      • 7.4-通用
      • 7.5- 快照
      • 7.6-主从复制(replication)
      • 7.7-安全(security)
      • 7.8-限制client
      • 7.9-AOF配置 append only file
    • 8 Redis持久化
      • 8.1 RDB
      • 8.2 AOF append only file
    • 9 Redis主从复制
    • 10 哨兵模式
    • 11 redis缓存穿透与雪崩
    • 12 Redis-benchmark性能测试
    • 附件-亲测可用的redis一步一步安装教程

1 Window安装redis

redis官方目前已经停止了对windows版本redis的支持,微软团队目前在做redis在windows的维护工作,目前redis是可以运行在windows上面的

1.1 下载redis源码压缩包

http://www.redis.cn/download.html

1.2 配置环境变量

配置环境变量,将redis解压缩后的bin文件夹所在的目录添加到环境变量。
redis是C语言编写的所以依赖C编译器,如果电脑中没有C语言编译器要先安装C语言编译器,GCC是常用的C语言编辑器
安装成功后,在命令行窗口输入 gcc -v 可以出现相关版本信息

1.3 开启命令行服务

  • 打开CMD命令行,如果添加环境变量,则命令行的路径不需要考虑,如果没有添加环境变量,需切换到redis文件夹的bin目录下,在命令行输入如下命令可以启动命令行服务

redis-server.exe redis.windows.conf

  • 再打开另外一个窗口,输入如下命令,可以链接本地服务器

redis-cli.exe -h 127.0.0.1 -p 6379

1.4 将redis服务添加到windows服务列表

Tip:需切换到redis的bin文件夹所在路径安装服务:redis-server.exe --service-install redis.windows.conf --service-name redisserver1 --loglevel verbose启动服务:redis-server.exe  --service-start --service-name redisserver1停止服务:redis-server.exe  --service-stop --service-name redisserver1卸载服务:redis-server.exe  --service-uninstall--service-name redisserver1win+r -> services.msc,可以看到服务安装成功

2 CentOS7安装redis

2.1 下载redis,英文官网是最新的,中文官网不是最新的

#程序一般放在opt目录下
mv redis-6.0.10.tar.gz opt
cd opt

2.2 解压xx.tar.gz压缩文件

tar -zxvf filename

2.3 安装gcc环境

#因为redis是C语言编写的,所以需要安装gcc环境
yum install gcc-c++
#安装完成之后输入gcc -v验证安装是否成功

2.4 make命令会把安装软件的环境安装好

make命令make install #确定是否安装成功,也可以不去执行
# 安装并指定安装目录
# [root@localhost redis-6.0.9]# make install PREFIX=/usr/local/redis# 插曲
# centos7 yum install gcc-c++ 默认安装的是4.8.5
# 编译redis-6.0.10 需要升级gcc
yum -y install centos-release-scl
yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
scl enable devtoolset-9 bash
echo "source /opt/rh/devtoolset-9/enable" >> /etc/profile
gcc -v

2.5 redis默认安装路径

cd /usr/local//bin/

2.6 将redis配置文件复制到当前目录下

# 在默认程序目录内新建一个目录,专门用于存放redis配置文件
mkdir redis-confs
# 在redis解压完的目录下复制一份redis.conf到上一步新建的目录下
cp /opt/redis-6.0.10/redis.conf redis-confs

2.7 启动服务

redis默认不是后台启动
# 修改 daemonize yesredis-server redis-confs/redis.conf # 使用指定的配置文件启动服务redis-cli -p 6379 # 链接测试

2.8 查看redis的进程是否开启

ps -ef | grep redis

2.9 关闭redis服务

# 在一个链接的client中输入下命令:
shutdown

3 redis基础知识

redis共有16个数据库;默认使用0号数据库select n #可以切换数据库DBSIZE # 查看数据库大小key * # 查看所有的keyget key # 得到数据库中的值flushdb # 清空当前数据库flushall # 清空所有数据库# 为什么6379端口号redis是单线程的,基于内存操作,CPU不是其性能瓶颈,redis的瓶颈是根据机器的内存和网络带宽
为什么单线程这么快? C语言编写
redis将所有数据放到内存中的,使用单线程去操作效率就是最高的,多线程(CPU上下文切换:耗时操作)

4 五大数据类型

4.1 redis-key

keys * #查看所有keyset key exists key # 判断key是否存在expire key time # 设置key过期时间,单位是sttl key #查看当前key的剩余时间type key # 判断key的类型

4.2 redis-string

set key1 v1 # 设置值get key # 获得值exists key #获取append key1 fdsaf #key1追加字符串,如果没有key1则新建字符串strlen key1 # 获取字符串长度##########################################incr key1 #加1操作decr key1 # 减1操作incrby key1 10 # 指定步长增加decrby key1 5 # 指定步长减少#############################################getrange key1 0 3 # 获取指定长度的字符串 含首含尾setrange key1 1 xx # 替换指定位置开始的字符串############################################setex(set with expire)  #setex key1 value 10 # 10s后key1过期setnx(set if not exist)setnx key1 value1 # 如果key1不存在创建key1,否则失败############################################mset:批量设置 mget:批量获取msetnx:当多个值不存在创建多个值#################################################设置对象
set user:1 {name:zhang三,age2:2}#设置一个user:1对象值为一个json字符串# 这里的key是一个巧妙的设计
mset user1:1:name zhangsan user:1:age 2mget user1:1:name user1:1:age###############################################先get再setgetset key #先获取再设置,如果不存在值返回nul,如果存在值则获取原值并设置新的值############################################## 数据结构是相同的
# 使用场景:value除了字符串也可以是数字,还可以是对象
- 计数器
- 统计多单位数量 incr uid:98324:follow 0
- 粉丝数,对象缓存存储

4.3 redis-hash


4.4 redis-list


4.5 redis-set


4.6 redis-zset


5 Redis事务

# ACID 原则 原子性:要么同时成功,要么同时失败
# redis单条命令保证原子性,redis事务不保证原子性
# redis事务本质:一组命令的集合! 一个事务中的所有命令都会被序列化,在事务执行过程中按顺序执行!一次性、顺序性、排他性!执行一系列命令
# redis事务没有隔离级别的概念
# 所有的命令在事务中,并没有被执行,只有发起执行命令后才会执行

5.1 正常执行事务

# 开启事务
multi # 命令入队(队列,先进先出)
...# 执行事务
exec

5.2 放弃事务

# 开启事务
multi# 命令入队
...# 放弃事务后不会执行# 放弃事务
discard

5.3 编译型异常(代码有问题,命令有错),事务中所有的命令都不会被执行

127.0.0.1:6379> getset k3
(error) ERR wrong number of arguments for 'getset' command
127.0.0.1:6379> set k4 v4
QUEUED
127.0.0.1:6379> set k5 v5
QUEUED
127.0.0.1:6379> exec
(error) EXECABORT Transaction discarded because of previous errors.

5.4 运行时异常(1/0)如果队列中存在语法型,那么执行命令的时候其他命令是可以执行的,错误命令会抛出异常

127.0.0.1:6379> multi
OK
127.0.0.1:6379> incr k1 # 虽然第一条命令执行成功了
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> set k3 v3
QUEUED
127.0.0.1:6379> get k3
QUEUED
127.0.0.1:6379> exec
1) (error) ERR value is not an integer or out of range
2) OK
3) OK
4) "v3"

6 redis监控 Watch

6.1 悲观锁

认为什么时候都可能会出问题,无论做什么都会加锁

6.2 乐观锁

认为什么时候都不会出现问题,不一定会加锁
# mysql中获取version,更新比较version# redis侧监控测试
# 正常执行成功
127.0.0.1:6379> set money 100
OK
127.0.0.1:6379> set out 0
OK
127.0.0.1:6379> watch money
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> decrby money 20
QUEUED
127.0.0.1:6379> incrby out 20
QUEUED
127.0.0.1:6379> exec
1) (integer) 80
2) (integer) 20
127.0.0.1:6379> # 线程1
127.0.0.1:6379> watch money
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> decrby money 10
QUEUED
127.0.0.1:6379> incrby out 10
QUEUED
127.0.0.1:6379> exec#执行之前另外一个线程修改了监视值,这个时候会导致事务执行失败
(nil)# 线程2
127.0.0.1:6379> get money # 在事务未执行前操作监视值
"80"
127.0.0.1:6379> set money 1000
OK
127.0.0.1:6379> watch可以当作乐观锁# 出错后要从新解锁再加锁
127.0.0.1:6379> unwatch  # 比对监视的值
OK
127.0.0.1:6379> watch money
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> decrby money 1
QUEUED
127.0.0.1:6379> incrby out 1
QUEUED
127.0.0.1:6379> exec
1) (integer) 999
2) (integer) 21# 如果修改失败重新获取乐观锁

7 Redis.conf 详解

7.1-介绍

# 通过配置文件来启动服务器
# 配置文件大小写是不敏感的。unit单位对大小写不敏感

7.2-包含

# include 可以把其他文件包含过来

7.3-网络

# 绑定的ip
bind 127.0.0.1
# 保护模式
protected-mode yes
# 端口设置
port 6379

7.4-通用

# 守护线程开启,后台运行,默认是no,需要改为yes
daemonize yes# 如果以后台方式运行就需要指定一个pid文件
pidfile /var/run/redis_6379.pid# 日志文件
loglevel noticelogfile "" # 日志文件名database 16 # 数据库的数量always-show-logo yes # 是否显示logo

7.5- 快照

#持久化,在规定的时间内,执行了多少次操作,则会持久化到文件.rdb .aof
# 如果900s内至少有一个key进行了修改,就进行持久化操作
save 900 1
# 如果300s内至少有10个key进行修改,就进行持久化操作
save 300 10
# 如果60s至少10000个key就行修改,就进行持久化操作
save 60 10000# 如果持久化失败,redis还会不会继续工作
stop-writes-on-bgsave-error yes# 是否压缩rdb文件,需要消耗一些CPU资源
rdbcompression yes# 保存rdb文件的时候,进行错误检验
rdbchecksum yes # rdb文件保存的目录
dir ./ 

7.6-主从复制(replication)


7.7-安全(security)

# 默认密码是空的 password设置成自己的密码
requirepass password# 查看密码# 设置密码# 输入密码
auth password

7.8-限制client

# 设置连接redis最大客户端的数量
maxclients 10000# redis设置最大内存容量,默认是字节
maxmemory <bytes># 内存达到上限之后的处理策略
maxmemory-policy noeviction# 常见策略有如下几种:
volatile-lru:只对设置了过期时间的key进行LRU
allkeys-lru:删除lru算法的key
volitile-random 随机删除
volitile-ttl 删除即将过期的
noevivtion  永不过期;返回错误
allkeys-random 随机删除

7.9-AOF配置 append only file

# 默认是不开启aof模式的,默认使用rdb持久化方式
appendonly no# 持久化文件的名字
appendfilename “appendonly.aof”# 每次修改都会写入
appendsync always
# 每秒执行一次同步
appendsync everysec
# 不同步执行
appendsync no

8 Redis持久化

8.1 RDB

# 触发机制
save 规则满足,会自动触发rdbflushall命令,也会触发rdb退出redis 也会产生rdb文件# 如何恢复
# 将rdb放到server启动文件内
config get dir
dir
“/usr/lcoal/bin” #如果在这个目录下存在dump.rdb文件,启动就会恢复其中的数据#优缺点分析:
1、适合大规模的数据恢复
2、如果对数据完整性要求不高
# 缺点
1、需要一定的时间间隔进行操作,如果宕机后会占用一定的空间有时候会将dump.rdb进行备份

8.2 AOF append only file

# 将所有命令记录下来history
# 把这个文件里面的命令全部执行一遍
# appendfilename
默认是不开启的,手动进行配置。我们只需要将appendonly# 优点:
每一次修改都同步
每秒同步一次
从不同步效率最高
# 缺点
速度慢
效率低相比rdb

9 Redis主从复制

SLAVEOF no one #手动从变主SLAVEOF 127.0.0.1 6379  #配置成6379的从机

10 哨兵模式

自动选取”老大“
sentinal
哨兵是一个独立的进程;redis-sentinel
哨兵模式最少要三个进程,哨兵之间相互通讯哨兵配置文件
sentinel.conf
# sentinal monitor 主机名称 host port 1(代表主机挂了,slave投票,票数最多的,就会成为主机)
sentinal monitor myredis 127.0.0.1 6379 1# 启动哨兵
redis-sentinal /配置文件# 哨兵日志
如果主机回来后只能归并到新的主机下,当做从机,这就是哨兵规则# 优点
基于主从复制模式
主从切换,故障转移,系统可用性就会更好
哨兵模式就是主从模式的升级,手动到自动# 缺点
配置模式很麻烦
# 哨兵模式的全部配置:

11 redis缓存穿透与雪崩

满足高可用

12 Redis-benchmark性能测试

是一个压力测试工具,官方自带的性能测试工具
redis-benchmark -命令
例:100个并发链接,100000请求
redis-benchmark -h localhost -p 6379 -c 100 -n 100000

附件-亲测可用的redis一步一步安装教程

安装C环境

yum -y install gcc

下载所需要版本的redis

wget http://download.redis.io/releases/redis-5.0.9.tar.gz

解压

tar -zxvf redis-5.0.9.tar.gz

移动到指定目录

mv redis-5.0.9 /usr/local/redis

编译:

cd redis-5.0.9/
make

安装(可有可无):

cd src

先测试一下再安装:

make test

如果运行make test出现错误:

You need tcl 8.5 or newer in order to run the Redis test

解决办法如下:

方式一:(亲测可用)
安装tcl-8.5.13-8.el7.x86_64.rpm
wget http://mirror.centos.org/centos/7/os/x86_64/Packages/tcl-8.5.13-8.el7.x86_64.rpmrpm -ivh tcl-8.5.13-8.el7.x86_64.rpm方式二:
wget http://downloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gz
sudo tar xzvf tcl8.6.1-src.tar.gz  -C /usr/local/
cd  /usr/local/tcl8.6.1/unix/
sudo ./configure
sudo make
sudo make install

make test通过后执行install

make install

指定位置安装redis

make PREFIX=/usr/local/redis install
这里多了一个关键字 PREFIX= 这个关键字的作用是编译的时候用于指定程序存放的路径。比如我们现在就是指定了redis必须存放在/usr/local/redis目录。假设不添加该关键字Linux会将可执行文件存放在/usr/local/bin目录,库文件会存放在/usr/local/lib目录。配置文件会存放在/usr/local/etc目录。其他的资源文件会存放在usr/local/share目录。这里指定号目录也方便后续的卸载,后续直接rm -rf /usr/local/redis 即可删除redis。

启动:

./redis-server

修改配置为后台运行:

vim ../redis.conf
把daemonize no 修改为 daemonize yes

指定配置文件重新启动:

redis-server ../redis.conf

修改密码:

在conf中取消注释,设置密码:
requirepass 123456
开启外网访问,注释掉:
#bind 127.0.01
修改保护模式为no:
protected-mode no

配置日志文件:

logfile "/usr/local/redis/logs/redis.log"

实时查看日志:

tail -f /usr/local/redis/logs/redis.log

将服务加入开机自启:

vim /etc/systemd/system/redis-server.service加入内容:[Unit]
Description=redis-server
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/bin/redis-server  /usr/local/redis/redis.conf
PrivateTmp=true
[Install]
WantedBy=multi-user.target

开启自启:

systemctl enable redis-server.service

停止开机自启动:

systemctl disable redis-server.service

启动:

systemctl start redis-server.service

停止:

systemctl stop redis-server.service

重启:

systemctl restart redis-server.service

查看服务状态:

systemctl status redis-server.service

客户端连接远端redis服务:

redis-cli -h hostname -p 6379

windows下连接:

redis-cli.exe -h 212.129.234.133 -p 6379
连接后输入命令:ping后回车,如果返回PONG则连接成功。

查看Redis是否正在运行

1、采取查看进程方式ps -aux | grep redis2、采取端口监听查看方式netstat -lanp | grep 6379

杀redis进程

netstat -lanp | grep 6379ps -ef | grep redis
kill -9 pid

配置文件含义

daemonize    yes、no  yes表示启用守护进程,默认是no即不以守护进程方式运行。其中Windows系统下不支持启用守护进程方式运行
port        指定 Redis 监听端口,默认端口为 6379
bind        绑定的主机地址,如果需要设置远程访问则直接将这个属性备注下或者改为bind * 即可,这个属性和下面的protected-mode控制了是否可以远程访问 。
protected-mode  yes 、no 保护模式,该模式控制外部网是否可以连接redis服务,默认是yes,所以默认我们外网是无法访问的,如需外网连接rendis服务则需要将此属性改为no。
timeout 300 当客户端闲置多长时间后关闭连接,如果指定为 0,表示关闭该功能
loglevel    debug、verbose、notice、warning    日志级别,默认为 notice
databases   16  设置数据库的数量,默认的数据库是0。整个通过客户端工具可以看得到
rdbcompression  yes、no  指定存储至本地数据库时是否压缩数据,默认为 yes,Redis 采用 LZF 压缩,如果为了节省 CPU 时间,可以关闭该选项,但会导致数据库文件变的巨大。
dbfilename  dump.rdb    指定本地数据库文件名,默认值为 dump.rdb
dir     指定本地数据库存放目录
requirepass     设置 Redis 连接密码,如果配置了连接密码,客户端在连接 Redis 时需要通过 AUTH <password> 命令提供密码,默认关闭
maxclients  0   设置同一时间最大客户端连接数,默认无限制,Redis 可以同时打开的客户端连接数为 Redis 进程可以打开的最大文件描述符数,如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis 会关闭新的连接并向客户端返回 max number of clients reached 错误信息。
maxmemory   XXX <bytes>   指定 Redis 最大内存限制,Redis 在启动时会把数据加载到内存中,达到最大内存后,Redis 会先尝试清除已到期或即将到期的 Key,当此方法处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis 新的 vm 机制,会把 Key 存放内存,Value 会存放在 swap 区。配置项值范围列里XXX为数值。

小白踩坑记-Redis的安装与使用相关推荐

  1. 小白踩坑记:springboot运行一直报错:There was an unexpected error (type=Not Found, status=404).

    唉,最近在学习springboot集成thymeleaf模板引擎时,明明都配置的好好的,却一直给爷报错,给小爷整懵了:更奇特的是,就挺秃然的就发现似乎哪里有问题了,一经改正,终于拨云见日了... 首先 ...

  2. iOS旧版微信SDK升级1.8.6版本小白踩坑记

    虽然写了多年前端,但是一直都是写的lua,这次突然接到通知要升级微信SDK,以前也不是我捣鼓的,这下可愁坏了.本着万事不明,先备份改错的心态去下了微信SDK然后对比了下,发现跟以前没太大区别.主要区别 ...

  3. linux python3.8源码安装_linux 下从源码安装 Python——小白踩坑记

    实验室服务器使用的系统为 Ubuntu 16.04,自带的 python 版本为 Python 2.7.12 和 Python 3.5.2,命令行下使用$ python命令来启动 python 时默认 ...

  4. 小白踩坑记:spring初始化时出现:factory-bean reference points back to the same bean definition

    意思说的是你的factory-bean指向同一个bean定义,经过查看发现,我的类名和方法名一样(忽略大小写,因为当不指定名字时,默认是首字母小写作为bean的名字) // @Service publ ...

  5. Typora+PicGo-core+SMMS图床踩坑记

    Typora+PicGo-core+SMMS图床踩坑记 一.安装PicGo-Core 二.安装smms v2 API插件 三.配置PicGo-Core 四.最终效果 五.总结 最近把Typora更新后 ...

  6. windos下 elasticksearch7.13安装踩坑记

    windos下 elasticksearch7.13安装踩坑记 一,环境配置 环境要求 java jdk16下载安装 elasticksearch7.13下载安装 遇到的问题 (待更新) 一,环境配置 ...

  7. 7代cpu能装虚拟xp系统吗_Intel 10代PC/笔记本安装Win7踩坑记 amp; 驱动分享

    免责声明:本文只是从技术角度进行讨论,主要因我自己的兴趣而引发测试.只代表个人观点,与任何组织机构无关. 目录 -  从赛扬G5900"亮机"CPU说起 -  10代Core Wi ...

  8. 安装sql server踩坑记【sql2000程序安装配置服务器失败】

    安装sql server踩坑记 安装程序配置服务器失败.参考服务器错误日志和 C:\WINDOWS\sqlstp.log 了解更多信息. 在C:\Program Files\Microsoft SQL ...

  9. Vue + TypeScript + Element 搭建简洁时尚的博客网站及踩坑记

    前言 本文讲解如何在 Vue 项目中使用 TypeScript 来搭建并开发项目,并在此过程中踩过的坑 . TypeScript 具有类型系统,且是 JavaScript 的超集,TypeScript ...

最新文章

  1. 【Javascript】之eval()
  2. 【读书笔记】iOS-属性列表
  3. python selenium 处理弹窗_python中能否使用selenium获取弹窗的文本内容?
  4. shell讲解-小案例
  5. 小鹏汽车提交赴美IPO:上半年营收1.42亿美元 何小鹏持股31.6%为最大股东
  6. flex 表格勾选后 鼠标滚动会自动勾选_外设Show 篇四十五:办公鼠里的BBA做工如何,罗技MX Anywhere 3鼠标体验_鼠标...
  7. OpenCV4每日一练day9:单目相机标定
  8. c语言定义星期一到日,C语言万年历程序设计
  9. 高淇java300适合_高淇java300集JAVA面向对象的进阶作业
  10. 交换机、路由器、服务器、存储选型
  11. Oralce数据库断电之ORA-00600: 内部错误代码, 参数: [kcratr_nab_less_than_odr], [1], [37]
  12. 一个五年架构师凭什么基本年薪酬就可以达到50万
  13. linux动态链接库全局变量共享问题DLL共享数据段
  14. 骑行318、 2016.7.30
  15. 关于MBP(苹果MAC)终端输入su命令出现Sorry提示的解决办法
  16. 明清时期宗族、乡绅与基层社会
  17. IDEA--输入法无法输入中文
  18. 怎样重装系统(win7/)
  19. keepass2android插件,Keepass2Android
  20. 【深度学习框架】pytorch之分布式数据并行化DDP

热门文章

  1. python函数库分类及实例_Python中Scikit-Learn库的分类方法总览
  2. 支付宝小程序使用MQTT over WebSocket连接阿里云IoT物联网平台
  3. Canvas制作简易涂鸦板
  4. REW声学测试(六):信号与测量
  5. Unity 在编辑模式下退出游戏
  6. 已知每个部门有一个经理,统计输出部门名称、部门总人数、 总工资和部门经理。
  7. mysql 时间格式转换年月日时分秒
  8. 20210726 java基础复习
  9. Spring——Security安全框架之记住我
  10. php的样式怎么设置字体大小,css中如何改变字体大小