Redis介紹
Redis 是徹底開源免費的,遵照BSD協議,是一個高性能的key-value數據庫。javascript
Redis 與其餘 key - value 緩存產品有如下三個特色:php
Redis支持數據的持久化,能夠將內存中的數據保持在磁盤中,重啓的時候能夠再次加載進行使用。html
Redis不只僅支持簡單的key-value類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。java
Redis支持數據的備份,即master-slave模式的數據備份。node
Redis 優點
性能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s 。python
豐富的數據類型 – Redis支持二進制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數據類型操做。mysql
原子 – Redis的全部操做都是原子性的,同時Redis還支持對幾個操做全並後的原子性執行。git
豐富的特性 – Redis還支持 publish/subscribe, 通知, key 過時等等特性。程序員
Redis與其餘key-value存儲有什麼不一樣?
Redis有着更爲複雜的數據結構而且提供對他們的原子性操做,這是一個不一樣於其餘數據庫的進化路徑。Redis的數據類型都是基於基本數據結構的同時對程序員透明,無需進行額外的抽象。github
Redis運行在內存中可是能夠持久化到磁盤,因此在對不一樣數據集進行高速讀寫時須要權衡內存,應爲數據量不能大於硬件內存。在內存數據庫方面的 另外一個優勢是, 相比在磁盤上相同的複雜的數據結構,在內存中操做起來很是簡單,這樣Redis能夠作不少內部複雜性很強的事情。 同時,在磁盤格式方面他們是緊湊的以追加的方式產生的,由於他們並不須要進行隨機訪問。
Remote Dictionary Server(Redis)是一個基於 key-value 鍵值對的持久化數據庫存儲系統。redis 和 Memcached 緩存服務很像,但它支持存儲的 value 類型相對更多,包括 string (字符串)、list (鏈表)、set (集合)、zset (sorted set --有序集合)和 hash(哈希類型)。這些數據類型都 支持 push/pop、add/remove 及取交集並集和差集及更豐富的操做,並且這些操做都是原子性的。在此基礎上,redis 支持各類不一樣方式的排序。與 memcached 同樣,爲了保證效率,數據都是緩存在內存中。區別的是 redis 會週期性的把更新的數據寫入磁盤或者把修改操做寫入追加的記錄文件,而且在此基礎上實現了 master-slave (主從)同步。
redis 的出現,再必定程度上彌補了 Memcached 這類 key-value 內存換乘服務的不足,在部分場合能夠對關係數據庫起到很好的補充做用。redis 提供了 Python,Ruby,Erlang,PHP 客戶端,使用方便。官方文檔: https://redis.io/documentation
Redis 在新浪微博中的應用
http://www.cnblogs.com/me115/p/3482783.html
Redis 安裝和使用實例
環境: [root@redis /]# uname -r 2.6.32-504.el6.x86_64 [root@redis /]# ifconfig eth0|awk -F '[ :]+' 'NR==2{print $4}' 192.168.179.161 [root@redis /]# cat /etc/redhat-release CentOS release 6.6 (Final) [root@redis /]# /etc/init.d/iptables status iptables:未運行防火牆。 [root@redis /]# getenforce Permissive #3.0版本源碼安裝也同樣 wget -q http://download.redis.io/releases/redis-2.8.9.tar.gz tar xf redis-2.8.9.tar.gz cd redis-2.8.9 #less README make MALLOC=jemalloc make PREFIX=/application/redis-2.8.9 install ln -s /application/redis-2.8.9/ /application/redis tree /application/redis /application/redis `-- bin |-- redis-benchmark # Redis性能測試工具,測試Redis在系統及你的配置下的讀寫性能。 |-- redis-check-aof # 更新日誌檢查。 |-- redis-check-dump # 用於本地數據庫檢查。 |-- redis-cli # Redis命令行操做工具。也能夠telnet根據其純文本協議操做 `-- redis-server # Redis服務器的daemon啓動程序。 1 directory, 5 files 配置環境變量 [root@redis01 redis-2.8.9]# echo 'export PATH=/application/redis/bin/:$PATH' >>/etc/profile [root@redis01 redis-2.8.9]# [root@redis01 redis-2.8.9]# tail -1 /etc/profile export PATH=/application/redis/bin/:$PATH [root@redis01 redis-2.8.9]# . /etc/profile [root@redis01 redis-2.8.9]# which redis-server /application/redis/bin/redis-server 拷貝生成配置文件 [root@redis01 redis-2.8.9]# mkdir /application/redis/conf [root@redis01 redis-2.8.9]# pwd [root@redis01 redis-2.8.9]# cp redis.conf /application/redis/conf/ 啓動redis redis-server /application/redis/conf/redis.conf & [20222] 29 Nov 20:43:48.571 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect. [20222] 29 Nov 20:43:48.571 * The server is now ready to accept connections on port 6379 檢查端口 lsof -i :6379 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME redis-ser 20222 root 4u IPv6 1523437 0t0 TCP *:6379 (LISTEN) redis-ser 20222 root 5u IPv4 1523439 0t0 TCP *:6379 (LISTEN) 去掉上面的警告信息 sysctl vm.overcommit_memory=1 echo 'vm.overcommit_memory=1' >>/etc/sysctl.conf sysctl -p 關閉redis操做的命令 redis-cli shutdown save
常見操做
[root@redis01 redis-2.8.9]# redis-cli 127.0.0.1:6379> set id 001 #插入數據:設置一個key-value對 OK 127.0.0.1:6379> get id #查詢數據:取出key所對應的value "001" 127.0.0.1:6379> del id #刪除鍵值 (integer) 1 127.0.0.1:6379> get id #查詢數據 (nil) 127.0.0.1:6379> exists id #驗證是否存在,1表明存在,0表明不存在 (integer) 0 127.0.0.1:6379> set user001 oldboy OK 127.0.0.1:6379> set user002 zsq OK 127.0.0.1:6379> set user003 test OK 127.0.0.1:6379> get user001 "oldboy" 127.0.0.1:6379> keys * #取出全部 1) "user003" 2) "user002" 3) "user001" select能夠切換庫從0到15 ,在第一個庫建立的內容其它庫是不可見的 127.0.0.1:6379> select 1 OK 127.0.0.1:6379[1]> keys * (empty list or set) 127.0.0.1:6379[1]> set name oldboy OK 127.0.0.1:6379[1]> get name "oldboy" 127.0.0.1:6379[1]> select 0 OK 127.0.0.1:6379> keys * 1) "user003" 2) "user002" 3) "user001" 127.0.0.1:6379> select 16 (error) ERR invalid DB index 127.0.0.1:6379[16]> select 15 OK
其它鏈接方式
redis-cli -h 192.168.179.162 -p 6379 非交互式 [root@redis01 redis-2.8.9]# redis-cli -h 192.168.179.162 -p 6379 set k v OK [root@redis01 redis-2.8.9]# redis-cli -h 192.168.179.162 -p 6379 get k "v" telnet 加IP 加端口也能夠 [root@redis01 redis-2.8.9]# telnet 192.168.179.162 6379 Trying 192.168.179.162... Connected to 192.168.179.162. Escape character is '^]'. set a b +OK get a $1 B nc的方式 [root@redis01 redis-2.8.9]# echo "set no004 zsq"|nc 127.0.0.1 6379 +OK [root@redis01 redis-2.8.9]# echo "get no004 "|nc 127.0.0.1 6379 $3 zsq
redis的幫助
redis-cli --help 192.168.179.162:6379> help redis-cli 2.8.9 Type: "help @<group>" to get a list of commands in <group> "help <command>" for help on <command> "help <tab>" to get a list of possible help topics "quit" to exit
redis的安全帳戶密碼及受權權限
vim /application/redis/conf/redis.conf 335 # Warning: since Redis is pretty fast an outside user can try up to 336 # 150k passwords per second against a good box. This means that you should 337 # use a very strong password otherwise it will be very easy to break.、 339行設置密碼 339 requirepass zsq 重啓生效 redis-cli shutdown redis-server /application/redis/conf/redis.conf & [root@redis01 redis-2.8.9]# redis-cli 127.0.0.1:6379> set k v (error) NOAUTH Authentication required. #提示權限不夠 127.0.0.1:6379> auth zsq #用auth加密碼 OK 127.0.0.1:6379> set k v OK 非交互式 –a指定密碼 [root@redis01 redis-2.8.9]# redis-cli -a zsq 127.0.0.1:6379> set k2 v2 OK 127.0.0.1:6379> get k2 "v2" 中止redis redis-cli -a zsq shutdown 能夠屏蔽跟更名 # It is possible to change the name of dangerous commands in a shared # environment. For instance the CONFIG command may be renamed into something # hard to guess so that it will still be available for internal-use tools # but not available for general clients. # # Example: # # rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52 # # It is also possible to completely kill a command by renaming it into # an empty string: # rename-command set "" #好比屏蔽這個set [root@redis01 redis-2.8.9]# redis-cli shutdown (error) NOAUTH Authentication required.#關閉都沒權限 [root@redis01 redis-2.8.9]# redis-cli -a zsq shutdown #指定密碼關閉 [root@redis01 redis-2.8.9]# redis-server /application/redis/conf/redis.conf & #啓動 [root@redis01 redis-2.8.9]# redis-cli 127.0.0.1:6379> set k v #執行set (error) ERR unknown command 'set' #提示找不到這個命令 127.0.0.1:6379>
在php環境中安裝redis的客戶端擴展
# 一、下載安裝 wget https://github.com/phpredis/phpredis/archive/master.zip unzip phpredis-master.zip cd phpredis-master /application/php/bin/phpize ./configure --with-php-config=/application/php/bin/php-config make make install cd/application/php-5.6.8/lib/php/extensions/no-debug-non-zts-20131226/ ls memcache.so opcache.a opcache.so redis.so # 二、修改php.ini設置,重啓php 在php.ini追加一條記錄 echo "extension = redis.so" >> /application/php/lib/php.ini #重啓 php-fpm killall php-fpm /application/php/sbin/php-fpm #網頁測試
php程序實戰操做redis服務
必需要有php環境 cat /application/php/bin/php 1.php <?php $redis = new Redis(); $redis ->connect('192.168.179.162',6379); $redis ->auth('zsq'); $redis ->set('name','zsq'); $var = $redis ->get('name'); echo "$var\n"; ?>
Python操做Redis
pip install redis or sudo easy_install redis or sudo python setup.py install 詳見: https://github.com/WoLpH/redis-py https://pypi.python.org/pypi/redis https://redislabs.com/python-redis
逐條解讀redis服務的配置文件
[root@redis01 redis-2.8.9]# grep -vE "#|^$" /application/redis/conf/redis.conf daemonize no #在後臺運行 pidfile /var/run/redis.pid #pid file port 6379 #默認端口 tcp-backlog 511 #tcp的隊列 # bind 192.168.1.100 10.0.0.1 #默認監聽全部,若是有外網的環境須要監聽內網的 # bind 127.0.0.1 timeout 0 #客戶端的超時,0表示不超時 tcp-keepalive 0 #tcp的會話保持 loglevel notice #日誌級別 logfile "" #能夠把日誌記到log文件,不輸出到屏幕 # syslog-facility local0 #日誌設備,日誌集中收集能夠把註釋去掉 databases 16 #設置數據庫的數量,相似mysql的數據庫 save 900 1 save 300 10 save 60 10000 #以上三項是快照 stop-writes-on-bgsave-error yes #若是bgsave出錯是否中止寫 rdbcompression yes #在dump的時候要不要壓縮,壓縮會消耗cpu rdbchecksum yes #rdb的檢查 dbfilename dump.rdb #dump的磁盤文件 dir ./ #控制上邊選項的路徑的,當前路徑 slave-serve-stale-data yes #主從同步 slave-read-only yes repl-disable-tcp-nodelay no slave-priority 100 requirepass zsq #安全選項,受權密碼 appendonly no appendfilename "appendonly.aof" appendfsync everysec no-appendfsync-on-rewrite no auto-aof-rewrite-percentage 100 #自動保持rewrite auto-aof-rewrite-min-size 64mb lua-time-limit 5000 #lua腳本實現更多生產場景 slowlog-log-slower-than 10000 slowlog-max-len 128 notify-keyspace-events "" hash-max-ziplist-entries 512 #hash優化參數 hash-max-ziplist-value 64 list-max-ziplist-entries 512 list-max-ziplist-value 64 set-max-intset-entries 512 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 hll-sparse-max-bytes 3000 activerehashing yes client-output-buffer-limit normal 0 0 0 client-output-buffer-limit slave 256mb 64mb 60 client-output-buffer-limit pubsub 32mb 8mb 60 hz 10 aof-rewrite-incremental-fsync yes
參數說明
redis.conf 配置項說明以下: 1. Redis默認不是以守護進程的方式運行,能夠經過該配置項修改,使用yes啓用守護進程 daemonize no 2. 當Redis以守護進程方式運行時,Redis默認會把pid寫入/var/run/redis.pid文件,能夠經過pidfile指定 pidfile /var/run/redis.pid 3. 指定Redis監聽端口,默認端口爲6379,做者在本身的一篇博文中解釋了爲何選用6379做爲默認端口,由於6379在手機按鍵上MERZ對應的號碼,而MERZ取自意大利歌女Alessia Merz的名字 port 6379 4. 綁定的主機地址 bind 127.0.0.1 5.當 客戶端閒置多長時間後關閉鏈接,若是指定爲0,表示關閉該功能 timeout 300 6. 指定日誌記錄級別,Redis總共支持四個級別:debug、verbose、notice、warning,默認爲verbose loglevel verbose 7. 日誌記錄方式,默認爲標準輸出,若是配置Redis爲守護進程方式運行,而這裏又配置爲日誌記錄方式爲標準輸出,則日誌將會發送給/dev/null logfile stdout 8. 設置數據庫的數量,默認數據庫爲0,可使用SELECT <dbid>命令在鏈接上指定數據庫id databases 16 9. 指定在多長時間內,有多少次更新操做,就將數據同步到數據文件,能夠多個條件配合 save <seconds> <changes> Redis默認配置文件中提供了三個條件: save 900 1 save 300 10 save 60 10000 分別表示900秒(15分鐘)內有1個更改,300秒(5分鐘)內有10個更改以及60秒內有10000個更改。 10. 指定存儲至本地數據庫時是否壓縮數據,默認爲yes,Redis採用LZF壓縮,若是爲了節省CPU時間,能夠關閉該選項,但會致使數據庫文件變的巨大 rdbcompression yes 11. 指定本地數據庫文件名,默認值爲dump.rdb dbfilename dump.rdb 12. 指定本地數據庫存放目錄 dir ./ 13. 設置當本機爲slav服務時,設置master服務的IP地址及端口,在Redis啓動時,它會自動從master進行數據同步 slaveof <masterip> <masterport> 14. 當master服務設置了密碼保護時,slav服務鏈接master的密碼 masterauth <master-password> 15. 設置Redis鏈接密碼,若是配置了鏈接密碼,客戶端在鏈接Redis時須要經過AUTH <password>命令提供密碼,默認關閉 requirepass foobared 16. 設置同一時間最大客戶端鏈接數,默認無限制,Redis能夠同時打開的客戶端鏈接數爲Redis進程能夠打開的最大文件描述符數,若是設置 maxclients 0,表示不做限制。當客戶端鏈接數到達限制時,Redis會關閉新的鏈接並向客戶端返回max number of clients reached錯誤信息 maxclients 128 17. 指定Redis最大內存限制,Redis在啓動時會把數據加載到內存中,達到最大內存後,Redis會先嚐試清除已到期或即將到期的Key,當此方法處理 後,仍然到達最大內存設置,將沒法再進行寫入操做,但仍然能夠進行讀取操做。Redis新的vm機制,會把Key存放內存,Value會存放在swap區 maxmemory <bytes> 18. 指定是否在每次更新操做後進行日誌記錄,Redis在默認狀況下是異步的把數據寫入磁盤,若是不開啓,可能會在斷電時致使一段時間內的數據丟失。由於 redis自己同步數據文件是按上面save條件來同步的,因此有的數據會在一段時間內只存在於內存中。默認爲no appendonly no 19. 指定更新日誌文件名,默認爲appendonly.aof appendfilename appendonly.aof 20. 指定更新日誌條件,共有3個可選值: no:表示等操做系統進行數據緩存同步到磁盤(快) always:表示每次更新操做後手動調用fsync()將數據寫到磁盤(慢,安全) everysec:表示每秒同步一次(折衷,默認值) appendfsync everysec 21. 指定是否啓用虛擬內存機制,默認值爲no,簡單的介紹一下,VM機制將數據分頁存放,由Redis將訪問量較少的頁即冷數據swap到磁盤上,訪問多的頁面由磁盤自動換出到內存中(在後面的文章我會仔細分析Redis的VM機制) vm-enabled no 22. 虛擬內存文件路徑,默認值爲/tmp/redis.swap,不可多個Redis實例共享 vm-swap-file /tmp/redis.swap 23. 將全部大於vm-max-memory的數據存入虛擬內存,不管vm-max-memory設置多小,全部索引數據都是內存存儲的(Redis的索引數據 就是keys),也就是說,當vm-max-memory設置爲0的時候,實際上是全部value都存在於磁盤。默認值爲0 vm-max-memory 0 24. Redis swap文件分紅了不少的page,一個對象能夠保存在多個page上面,但一個page上不能被多個對象共享,vm-page-size是要根據存儲的 數據大小來設定的,做者建議若是存儲不少小對象,page大小最好設置爲32或者64bytes;若是存儲很大大對象,則可使用更大的page,若是不 肯定,就使用默認值 vm-page-size 32 25. 設置swap文件中的page數量,因爲頁表(一種表示頁面空閒或使用的bitmap)是在放在內存中的,,在磁盤上每8個pages將消耗1byte的內存。 vm-pages 134217728 26. 設置訪問swap文件的線程數,最好不要超過機器的核數,若是設置爲0,那麼全部對swap文件的操做都是串行的,可能會形成比較長時間的延遲。默認值爲4 vm-max-threads 4 27. 設置在向客戶端應答時,是否把較小的包合併爲一個包發送,默認爲開啓 glueoutputbuf yes 28. 指定在超過必定的數量或者最大的元素超過某一臨界值時,採用一種特殊的哈希算法 hash-max-zipmap-entries 64 hash-max-zipmap-value 512 29. 指定是否激活重置哈希,默認爲開啓(後面在介紹Redis的哈希算法時具體介紹) activerehashing yes 30. 指定包含其它的配置文件,能夠在同一主機上多個Redis實例之間使用同一份配置文件,而同時各個實例又擁有本身的特定配置文件 include /path/to/local.conf
Redis 數據類型
Redis支持五種數據類型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
String(字符串)
string是redis最基本的類型,你能夠理解成與Memcached如出一轍的類型,一個key對應一個value。
string類型是二進制安全的。意思是redis的string能夠包含任何數據。好比jpg圖片或者序列化的對象 。
string類型是Redis最基本的數據類型,一個鍵最大能存儲512MB。
[root@redis01 redis-2.8.9]# redis-cli 127.0.0.1:6379> set name "redis.net.cn" OK 127.0.0.1:6379> get name "redis.net.cn"
在以上實例中咱們使用了 Redis 的 SET 和 GET 命令。鍵爲 name,對應的值爲redis.net.cn。
注意:一個鍵最大能存儲512MB。
Hash(哈希)
Redis hash 是一個鍵值對集合。
Redis hash是一個string類型的field和value的映射表,hash特別適合用於存儲對象。
實例
redis 127.0.0.1:6379> HMSET user:1 username redis.net.cn password redis.net.cn points 200 OK redis 127.0.0.1:6379> HGETALL user:1 1) "username" 2) "redis.net.cn" 3) "password" 4) "redis.net.cn" 5) "points" 6) "200" redis 127.0.0.1:6379>
List(列表)
Redis 列表是簡單的字符串列表,按照插入順序排序。你能夠添加一個元素導列表的頭部(左邊)或者尾部(右邊)。
127.0.0.1:6379> lpush students liubing (integer) 1 127.0.0.1:6379> lpush students zhangjie zsq (integer) 3 127.0.0.1:6379> lpush students siqing (integer) 4 127.0.0.1:6379> llen students (integer) 4 127.0.0.1:6379> lrange students 0 3 1) "siqing" 2) "zsq" 3) "zhangjie" 4) "liubing"
列表最多可存儲 232 - 1 元素 (4294967295, 每一個列表可存儲40多億)。
Set(集合)
Redis的Set是string類型的無序集合。
集合是經過哈希表實現的,因此添加,刪除,查找的複雜度都是O(1)。
sadd 命令
添加一個string元素到,key對應的set集合中,成功返回1,若是元素以及在集合中返回0,key對應的set不存在返回錯誤。
sadd key member 實例 redis 127.0.0.1:6379> sadd redis.net.cn redis (integer) 1 redis 127.0.0.1:6379> sadd redis.net.cn mongodb (integer) 1 redis 127.0.0.1:6379> sadd redis.net.cn rabitmq (integer) 1 redis 127.0.0.1:6379> sadd redis.net.cn rabitmq (integer) 0 redis 127.0.0.1:6379> smembers redis.net.cn 1) "rabitmq" 2) "mongodb" 3) "redis"
注意:以上實例中 rabitmq 添加了兩次,但根據集合內元素的惟一性,第二次插入的元素將被忽略。
集合中最大的成員數爲 232 - 1 (4294967295, 每一個集合可存儲40多億個成員)。
zset(sorted set:有序集合)
Redis zset 和 set 同樣也是string類型元素的集合,且不容許重複的成員。
不一樣的是每一個元素都會關聯一個double類型的分數。redis正是經過分數來爲集合中的成員進行從小到大的排序。
zset的成員是惟一的,但分數(score)卻能夠重複。
zadd 命令
添加元素到集合,元素在集合中存在則更新對應score
zadd key score member
實例
redis 127.0.0.1:6379> zadd redis.net.cn 0 redis (integer) 1 redis 127.0.0.1:6379> zadd redis.net.cn 0 mongodb (integer) 1 redis 127.0.0.1:6379> zadd redis.net.cn 0 rabitmq (integer) 1 redis 127.0.0.1:6379> zadd redis.net.cn 0 rabitmq (integer) 0 redis 127.0.0.1:6379> ZRANGEBYSCORE redis.net.cn 0 1000 1) "redis" 2) "mongodb" 3) "rabitmq"
####################################################################################