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模式的數據備份;