1 Redis 概述
REmote DIctionary Server(Redis)是一個基于key-value鍵值對的持久化數據庫存儲系統。redis和大名鼎鼎的Memcached緩存服務軟件很像,但是Redis支持的數據存儲類型比Memcached更豐富,包括strings(字符串)、lists(列表)、sets(集合)和sorted sets(有序集合)等
這些數據類型支持push/pop、add/remove及取交集、并集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支持各種不同方式的排序。與memcached緩存服務一樣,為了保證效率,數據都是緩存在內存中提供服務。和memcached不同的是,redis持久化緩存服務還會周期性的把更新的數據寫入到磁盤以及把修改的操作記錄追加到文件里記錄下來,比Memcached更有優勢的是,redis還支持master-slave(主從)同步,這點很類似關系型數據庫MySQL主從復制功能
Redis是一個開源的使用C語言編寫、支持網絡、可基于內存亦可持久化的日志型、key-value數據庫,并提供多種語言的API。從2010年3月15日起,Redis的開發工作由VMware主持
Redis軟件的出現,在一定程度上彌補了memcached這類key-value內存緩存服務的不足,在部分場合可以對關系數據庫起到很好的補充作用。redis提供了Python,Ruby,Erlang,PHP客戶端,使用起來很方便。Redis官方文檔如下:
https://redis.io/documentation
http://redis.cn/
1.1 Redis優點
- 與memcached不同,Redis可以持久化存儲數據
- 性能很高:Redis能支持超過10W美妙的讀寫頻率
- 豐富的數據類型:Redis支持二進制的Strings,Lists,Hashes,Sets及sorted Sets等數據類型
- 原子:Redis的所有操作都是原子性,同時Redis還支持對幾個操作全并后的原子性執行
- 豐富的特性:Redis還支持publish/subscribe(發布/訂閱),通知,key過期等等特性
- Redis支持異機主從復制
1.2 缺點
- 系統運行有毛刺
- 不同命令延遲差別極大
- 內存管理開銷大
- buffer io造成OOM
1.3 Redis的數據類型
- String 字符串
- List 列表
- Set 集合
- Sorted set 有序集合
?
2 Redis的安裝及使用
Redis的生產經驗教訓
- 要進行Master-slave主從同步配置,在出現服務故障時可以切換
- 在master禁用數據持久化,只需在slave上配置數據持久化
- 物理內存+虛擬內存不足,這個時候dump一直死這,時間久了機器掛掉。這個情況就是災難!64-128G內存,SSD硬盤
- 當Redis物理內存使用超過內存總容量的3/時就會開始比較危險了,就開始做SWAP,內存碎片打!
- 當達到最大內存時,會清空帶有過期時間的key,及時key未到過期時間
- redis與DB同步寫的問題,先寫DB,厚些redis,因為寫內存基本上沒有問題
2.1 redis環境部署
Master:10.0.0.1 Centos6.5 Redis-Master
2.2 安裝
#Master
[root@Redis-Master downloads]# wget http://download.redis.io/releases/redis-3.2.4.tar.gz
[root@Redis-Master downloads]# tar zxf redis-3.2.4.tar.gz
[root@Redis-Master downloads]# cd redis-3.2.4
[root@Redis-Master redis-3.2.4]# make PREFIX=/usr/local/redis install
#查看目錄
[root@Redis-Master redis-3.2.4]# ls /usr/local/redis/bin/
redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-sentinel redis-server
#只有這一個bin目錄
#redis-server:Redis服務器的daemon啟動程序
redis-cli:Redis命令行操作工具。當然,你也可以用telnet根據其純文本協議來操作
redis-benckmark:Redis性能測試工具,測試Redis在你的系統及你的配置下的讀寫性能
redis-check-aof:對更新日志appendonly.aof檢查,是否可用,類似檢查mysql binlog的工具
redis-check-dump:用于本地數據庫rdb文件的檢查
2.3 配置并啟動redis服務
1、配置環境變量
[root@Redis-Master /]# echo 'PATH=/usr/local/redis/bin/:$PATH' >>/etc/profile
[root@Redis-Master /]# source /etc/profile
2、拷貝配置文件
[root@Redis-Master /]# cd /tmp/downloads/redis-3.2.4
[root@Redis-Master redis-3.2.4]# mkdir /usr/local/redis/conf
[root@Redis-Master redis-3.2.4]# cp redis.conf /usr/local/redis/conf/
3、啟動
[root@Redis-Master /]# echo "vm.overcommit_memory = 1" >>/etc/sysctl.conf
[root@Redis-Master /]# sysctl -p #以防后臺保存失敗
[root@Redis-Master /]# redis-server /usr/local/redis/conf/redis.conf &
#vm.overcommit_memory該參數有三個值,分別是:
0:當用戶空間請求更多的內存時,內核嘗試估算出剩余可用的內存
1:當設這個參數值為1時,內核允許超量使用內存知道用完為止,主要用于科學計算
2:當設這個參數值為2時,內核會使用一個絕不過量使用內存的算法,即系統整個內存地址空間不能超過swap+50%的RAM值,50%參數的設定是在overcommit_ratio中設定
4、關閉
[root@Redis-Master /]# redis-cli shutdown save
2.4 通過客戶端來操作redis數據庫
1、存值
[root@Redis-Master /]# redis-cli
127.0.0.1:6379> set id 001
OK
2、取值
127.0.0.1:6379> get id #可以get ket,無法get value
"001"
3、刪除
127.0.0.1:6379> del id #刪除key
(integer) 1
4、查看是否存在
127.0.0.1:6379> EXISTS id
(integer) 0 #0為不存在
5、取所有
127.0.0.1:6379> keys *#redis默認有16個庫,0為開頭#遠程連接
[root@Redis-Master /]# redis-cli -h 10.0.0.1 -p 6379 #可以設置密碼,跟mysql很像
10.0.0.1:6379>#telnet和nc都可以操作
2.5 redis的安全賬戶密碼及授權權限
[root@Redis-Master /]# cat /usr/local/redis/conf/redis.conf |grep requirepass
# If the master is password protected (using the "requirepass" configuration
# requirepass foobared
requirepass 123.com
格式:[ requirepass ] [ password ]
#123.com就是密碼
#重啟redis#測試
127.0.0.1:6379> set 1 daniel
(error) NOAUTH Authentication required.
#提示沒認證
127.0.0.1:6379> auth 123.com
OK
#登錄
127.0.0.1:6379> set 1 daniel
OK
#再次測試,成功#或者
[root@Redis-Master /]# redis-cli -a 123.com
127.0.0.1:6379>
#可以直接輸入密碼后進入#命令重命名
[root@Redis-Master /]# grep rename-command /usr/local/redis/conf/redis.conf
# security of read only slaves using 'rename-command' to shadow all the
# rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52
# rename-command CONFIG ""
rename-command set "se"
#格式 [ rename-command ] [ CONFIG ] [ "" ]
#測試
[root@Redis-Master /]# redis-cli -a 123.com
127.0.0.1:6379> set 2 cat
(error) ERR unknown command 'set'
127.0.0.1:6379> se 2 cat
OK
#set無法使用,se可以
2.7 在php環境中安裝redis的客戶端擴展
[root@RS02 downloads]# wget https://codeload.github.com/phpredis/phpredis/zip/develop
[root@RS02 downloads]# unzip develop
[root@RS02 downloads]# cd phpredis-develop/
[root@RS02 phpredis-develop]# /usr/local/php5.6.33/bin/phpize
[root@RS02 phpredis-develop]# ./configure --with-php-config=/usr/local/php5.6.33/bin/php-config
[root@RS02 phpredis-develop]# make && make install#修改php.ini,重啟php
[root@RS02 php5.6.33]# sed -i 's#; extension_dir = "./"#extension_dir = "/usr/local/php5.6.33/lib/php/extensions/no-debug-non-zts-20131226/"#g' /usr/local/php5.6.33/lib/php.ini
[root@RS02 php5.6.33]# echo "extension = redis.so" >>/usr/local/php5.6.33/lib/php.ini
[root@RS02 php5.6.33]# /usr/local/php5.6.33/sbin/php-fpm
#出現這個信息就算正確
2.8 開發php程序實戰redis服務
#開啟redis的遠程連接
[root@Redis-Master /]# sed -i 's/bind 127.0.0.1/#bind 127.0.0.1/g' /usr/local/redis/conf/redis.conf
#重啟
[root@RS02 php5.6.33]# cat /usr/local/nginx/html/index.php
<?php$redis = new Redis();$redis->connect('10.0.0.1',6379) or die ("heh");$redis->auth('123.com');$redis->set('100','DANIEL');$var = $redis->get('100');echo "$var\n";
?>
[root@Redis-Master /]# curl 10.0.0.81
DANIEL
成功
2.9 開發python程序實戰操作redis服務
?