memcache
memcache是什么?
高性能分布式的key->value内存对象缓存系统 动态web应用 缓解数据库压力 在内存中缓存数据和对象读数据库的次数
在内存中 他维护一个巨大的hash表 可以存各种格式的数据 图像视频 文件数据库检索结果 从内存中读取速度很快
Memcache与Memcached区别
memcache是项目的名称 Memcached是服务端主程序的文件名
memcache使用场景
- 频繁访问的数据 比如头条新闻
- 大量的hot 数据
- 页面缓存
- 频繁的查询条件 和结果
- 临时的数据
:screen:安装memcache
yum -y install libvent libvent-devel
1 准备安装包
libmemcached-1.0.18.tar.gz memcached-1.4.33.tar.gz php-memcached-php7.zip
2 安装memcached
tar -zxvf memcached-1.4.33.tar.gz
cd memcached-1.4.33
./configure --prefix=/usr/local/memcached/ --enable-64bit #支持64位
make #时钟错误 date -s 20190705 +11:50
make install
3 安装libmencache
tar -zxvf libmemcached-1.0.18.tar.gz
cd libmemcached-1.0.18
./configure --prefix=/usr/local/libmemcached/ --with-memcached-dir=/usr/local/memcached
make
make install
4 安装php-memcache
cd php-memcached-php7
phpize #安装PHP扩展靠这个来解压
./configure --with-php-config=/usr/local/php7/bin/php-config --with-libmemcached-dir=/usr/local/libmemcached/ --disable-memcached-sasl
make
make install
vim /etc/php.ini
extension_dir =/usr/local/php7/lib/php/extensions/no-debug-non-zts-20151012/
extension memecache.so;
5 重启 php-fpm
/etc/init.d/php-fpm restart
6 调试
cd /usr/local/memcached/bin/
./memcached -u www -d
set name 0 10 8
set key flags exptime bytes 如果存在 更新原有的
key name 键的名字
falgs 0 键值额外的东西
exptime 10 过期时间 秒为单位
bytes 8 长度
STORED 保存成功后输出
NOT_STORED 保存失败 退出
ERROR 出错 比如语法错误
----------------------------------------------
get key 获取在key 中的value值 如果key不存在 返回 null
可以 get key1 key2 key3
----------------------------------------------
add key flags exptime bytes 将value的值添加到制定的 key 中 如果存在 则不更新
key name 键的名字
falgs 0 键值额外的东西
exptime 过期时间 秒为单位
bytes 长度
----------------------------------------------
delete name 删除已经存在的key
-----------------------------
replace key flags exptime bytes # 替换的是 key中的value值 而不是 key
set name 0 100 5
hello
replace name 0 100 6
hellos
get name
获取的是 hellos
----------------------------------------
set name 0 100 6
asdfgh
STORED
get name
VALUE name 0 6
asdfgh
END
append name 0 200 5 在key中 追加 value的值 追加到尾部
hello
STORED
get name
VALUE name 0 11
asdfghhello
END
--------------------------------
incr keyname 数字 自增多少 decr keyname 自减多少
set numer 0 100 2
10
get number
10
incr number 5
get number 15
decr number 5
get number
10
memcached特点
单个key最大的长度 是memcahed.h设置KEY_MAX_LENGTH
早前版本单个key是1M新版本2M数据保存在内存中,断电数据消失
radis
❓神魔是Redis?
- REmote DIctionary Server 缩写 个基于内存的网络存储系统
- 丰富的数据结构(sets, sorted sets,hashes, list ...)
- 本质是key-value,但是与memcached不同的是,value的类型得到了扩展
Radis简介
Radis是完全开源免费的,遵守BSD协议,是一个高性能的key_value数据库。
Redis与其他key_value缓存产品有以下三个特点:
1、Redis支持数据的永久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用;
2、Radis不仅仅支持简单Key_value string类型的数据,同时还提供list,set,zset,hash等数据结构的存储;
3、Radis支持数据的备份,即master-slave模式的数据备份
NoSql(非关系型数据库)
mongDB
CouchDB
Memcached
其他消息队列
RabbitMQ
???? :优势
- 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
- 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
- 原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
- 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性
与其他的key_value存储有什么不同
- Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。
- Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问
:film:面试中经常问的
1 memcached的单个key老版本1M,新版本2M可以通过修改memcached.h修改KEY_MAX_LENGTH调正单个KEY的大小
redis单个key512M
2 Memcached是多线程 radis是单线程
3 Memcached数据不能持久化,断电数据消失
redis可以持久化,因为使用了RDB和ADF机制
4 memcached不支持集群,但是支持Memcached::addServers() 十台组合成一台使用
radis 支持集群 而且redistribution支持库 0-15 16个库
5 memcached支持key=>value radis有多种数据类型
radis还可以做消息队列 比如聊天室
????安装redis
wget -c http://download.redis.io/releases/redis-3.2.9.tar.gz
tar -zxvf redis
mkdir -p /usr/local/redis/
mv redis-3.2.9 /usr/local/redis
cd /usr/local/redis/redis-3.2.9
make && make install
cd/usr/local/redis/redis-3.2.9/src
文件名称 用途
redis-cli redis客户端
redis-server redis服务端
redis-benchmark redis性能测试工具
redis-check-aof AOF修复工具 因为AOF Radis 才能持久化存储
redis-check-rdb RDB检查工具
redis-sentinel 哨兵服务器 2.8以后才有
:happy:启动redis
cd /user/local/redis/src
./redis-server
./redis-server -v 产看版本号
./redis-server /usr/local/redis/redis.conf 制定配置文件启动,以端口号区分redis服务器
what is PDB和AOF
RDB是一个文件 隔一段时间 会在redis配置文件进行设置 把内容从内存刷入文件中
AOF 将命令追加到文件中 将所有的redis命令保存为一个文件 重启之后 就要进行新的操作之前的就没用了
???? :常用端口号
服务名 端口号
http 80
https 443
ftp 21
ssh 22
mysql 3306
远程桌面 3389
scp 22
smtp 25
pop3 110
memcached 11211
redis 6379
vim /etc/sysconfig/iptables
????配置开机启动
1 找到redis提供的开机启动脚本
/usr/local/redis/redis-3.2.9/utils/redis_init_script
2 复制一份出来
cd utils
cp redis_init_script redis_init_script_6379
#以端口号 区分redis服务器
mv /usr/local/redis/redis
3 修改redis启动脚本
vim redis_init_script_6379
REDISPORT=6379
EXEC=/usr/local/redis/redis/src/redis-server
CLIEXEC=/usr/local/redis/redis/src/redis-cli
PIDFILE=/var/run/redis_${REDISPORT}.pid
CONF="/usr/local/redis/redis/redis_${REDISPORT}.conf"
4 修改redis.conf
cd /usr/local/redis
cp redis.conf redis_6379.conf
修改daemonize yes
5 启动脚本
/usr/local/redis/redis/utils/redis_init_script_6379 start
6 vim /etc/rc.local
写进来 /usr/local/redis/redis/utils/redis_init_script_6379 start
7 redis-cli 直接就可以连接
redis-cli 连接本地
redis-cli -h 127.0.0.1 -p 6379
:happy:redis数据类型
string hash list set zset
string(字符串)redis基本数据类型
一个key 对应 一个 value
set name kuanlijun 设置
get name 获取
del name 删除
set num 10
incr num 自增1
desc num 自减1
incrbyfloat num 0.5 制定累加小数
descbyfloat num
append num xiaokeai 累加值 累加到后面
num 是 key 名
一个键最大存储 512M
hash键值对的集合
HMSET user:1 username gebilaowang password 123456 size 50
HGETALL user:1
user:1 是键值
1 是id 通过id 区分 通常 使用 incr 键名 获取 id
每个 hash 能存放 2的32次方 减一 40多亿个 键值对
list 列表
添加一个元素 从列表的头部(左) 或者 尾部(右 )
lpush test redis
lpush test redis1
lpush test redis2
想象成一个杯子
lrange test 0 2
#0 表示开始位置 2 结束位置
lpop test 从开头弹出来
lrange test 0 -1 表示查出所有
rpush names jinlong
rpush names jinlong1
rpush names jinlong2
lrange names 0 -1
先进先出 就像一个吸管
rpop names 从尾部弹出来
list 列表 可以存放多少元素 2的32次方 减一 个元素
set string类型集合(无序)
是通过hash表实现的 增删查 复杂度 都是0(1)
sadd 添加一个string 元素 到key 对应的set 集合中 成功返回 1 失败返回 0 对应set 不存在返回 错误
sadd name redis
返回 1
sadd name redis1
返回1
sadd name redis
返回 0
smembers name
zset 有序集合
zadd names 0 minghui
zadd names 0 minghui1
zadd names 1 minghui2
zadd names 2 minghui3
zrangebyscore names 0 2
输出 minghui minghui1 minghui2
???? 其他命令
expire key名称 时间#设置过期时间
ttl key #查看剩余时间
del key #删除key
flushdb #清空某个库中的key
flushall #清空所有的库中的key
select 0 #选择第0个数据库
dbsize #查看库的大小
keys #查看所有的库
keys name* #查看所有包含name的库
使用Linux中xargs批量删除
redis-cil key * | xargs redis-cil del
redis-cil -a password key * | xargs redis-cil -a password del
#带密码删除
redis-cli -n 0 keys * |xargs redis-cil -n 0 del#制定的库
redis-cli -h host keys * |xargs redis-cil -h host del#制定host删除
????安装PHPredis
1 首先 下载https://github.com/phpredis/phpredis/tree/php7
git clone -b php7 https://github.com/phpredis/phpredis/tree/php7
2 unzip #解压
3 /usr/local/php7/bin/phpize
4 ./configure --with-php-config=/usr/local/php7/bin/php-config
5 make && make install
6 vim /etc/php.ini
extension_dir =" /usr/local/php7/lib/php/extension/no-debug-non-zts-20151012/"
extension redis.so
7 重启 php-fpm
:party: session共享(负载均衡)
session共享 主要解决负责均衡 session 不一样 存放到 memcached 中
vim /etc/php.ini
session.save_handler = memcached
session.save_path = "127.0.0.1:11211"
session.save_handler = redis
session.save_path = "tcp://127.0.0.1:6379?weight=1&timeout=3"#权重与超时
重启 php-fpm
tp3.2 和tp5.0的区别
URL访问的不同
1 增加了 路由分组
2 增加了 命名空间
3 支持composer
4 url 路由规则反解析
5 增加 资源路由
请求与相应的不同
1 增加了request(统一处理和获取请求消息)和response(负责输出客户端和浏览器的响应)
操作数据库
控制层
3.2 M('User')->where(['name'=>'kangbazi'])->find()
5.0 db('User')->where('name','kangbazi')->find()
model 层
3.2
D('User')->where(['name'=>'kangbazi'])->find()
5.0
model('User')->where('name','kangbazi')->find()
tp5 有自动验证
thinkphp/validate
错误调试
trace
socketLog 支持远程调试
:design:TCP/IP三次握手
1.建立连接 打招呼
2.给我回应
3.建立连接传递数据,进行真正的通信
:design:四次挥手
1.我跟你玩够了 不喜欢你了 finish 服务器-》客户端
2.为什么呢 怎莫忍心抛弃我呢 ack 客户端-》服务器
3.我实在是坚持不下去了 finish 服务器-》客户端
4.好吧 分手 ack 客户端-》服务器
????mysql启动不起来?
日志文件过大,无法进行写入内容
du -shx *
-s 当前目录的大小
-h 以 k m g 显示友好
-x 以开始的文件系统为准,遇到不同的文件目录,就要跳过
axure画产品原型图