memcache与redis的一些简单使用

时间:2023-02-10 17:14:13

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画产品原型图