Redis是一个开源的使用ANSI C语言编写、遵照BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。php
它一般被称为数据结构服务器,由于值(value)能够是 字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。html
Redis 与其余 key - value 缓存产品有如下三个特色:redis
OS: ubuntu18.04数据库
Language: php7json
安装redis:ubuntu
sudo apt-get install redis-server
查看 redis进程:缓存
ps -aux|grep redis
redis 10461 0.1 0.0 58552 3728 ? Ssl 10:06 0:00 /usr/bin/redis-server 127.0.0.1:6379 nuuuu 10569 0.0 0.0 21536 1036 pts/3 S+ 10:06 0:00 grep --color=auto redis
设置redis的访问密码安全
安装后配置文件路径: /etc/redis/redis.conf服务器
修改 redis.conf, 去掉requirepass password 的#网络
requirepass 12345678
修改配置重启redis服务:
sudo service redis-server restart
访问时使用auth:
$redis = new Redis(); $redis->connect('127.0.0.1', 6379); $redis->auth('12345678');
安装php-redis扩展:
sudo pecl install redis
报错:
checking use system liblzf... no checking for igbinary includes... configure: error: Cannot find igbinary.h ERROR: `/tmp/pear/temp/redis/configure --with-php-config=/usr/local/php/bin/php-config --enable-redis-igbinary=y --enable-redis-lzf=y' failed
此处是由于没有安装 igbinary 一个序列号与反序列化的php扩展
安装 igbinary 扩展
sudo pecl install igbinary
再执行
sudo pecl install redis
重启php-fpm: 查看php-info
redis 设置key
$redis = new Redis(); $redis->connect('127.0.0.1', 6379); $redis->set('a','aaa');
redis 读取key->value
$a= $redis->get('a'); print_r($a);
redis 设置集合
$redis->sAdd('fd',1); $redis->sAdd('fd',2); $redis->sAdd('fd','333');
redis读取集合
foreach ($redis->sMembers('fd') as $value) { print_r($value); }
redis 设置list列表
$arr = array('h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd'); foreach ($arr as $v) { $redis->rpush("mylist", $v); }
redis 获取list列表
$value = $redis->lpop('mylist'); print_r($value);
redis 的实时消息订阅
# 发布消息文件 $message= json_encode(['run=12','did=10001']); $ret=$redis->publish('worker_channel',$message); $ret=$redis->publish('worker_channel',"send_msg.hahaha");
订阅消息 文件
$result = $redis->subscribe(["worker_channel"], 'callback'); function callback($redis, $channel, $message) { if ($channel == 'w1') { echo '频道1'; } else { echo $message; } }
但当订阅的文件执行60s后会报错:
PHP Fatal error: Uncaught RedisException: read error on connection in *** Stack trace: #0 ****: Redis->subscribe(Array, 'callback')
这是由于订阅默认60s超时就退出链接。解决办法:
设置-1 永不超时
$redis->setOption(Redis::OPT_READ_TIMEOUT, -1);
一、Redis和Memcache都是将数据存放在内存中,都是内存数据库。不过memcache还可用于缓存其余东西,例如图片、视频等等;
二、Redis不单单支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储;
三、虚拟内存--Redis当物理内存用完时,能够将一些好久没用到的value 交换到磁盘;
四、过时策略--memcache在set时就指定,例如set key1 0 0 8,即永不过时。Redis能够经过例如expire 设定,例如expire name 10;
五、分布式--设定memcache集群,利用magent作一主多从;redis能够作一主多从。均可以一主一从;
六、存储数据安全--memcache挂掉后,数据没了;redis能够按期保存到磁盘(持久化);
七、灾难恢复--memcache挂掉后,数据不可恢复; redis数据丢失后能够经过aof恢复;
八、Redis支持数据的备份,即master-slave模式的数据备份;