Memcached 簡介、安裝、使用 Python 操作 Memcached 天生支持集群 redis 簡介、安裝、使用、實例 Python 操作 Redis String、Hash、List、Set、Sort Set 操作 管道 發佈訂閱 簡介、安裝、使用 Python 操作 Memcached ...
- Memcached
- 簡介、安裝、使用
- Python 操作 Memcached
- 天生支持集群
- redis
- 簡介、安裝、使用、實例
- Python 操作 Redis
- String、Hash、List、Set、Sort Set 操作
- 管道
- 發佈訂閱
- RabbitMQ
- 簡介、安裝、使用
- 使用 API 操作 RabbitMQ
- 消息不丟失
- 發佈訂閱
- 關鍵字發送
- 模糊匹配
一、Memcached
1、簡介、安裝、使用
Memcached 是一個高性能的分散式記憶體對象緩存系統,用於動態 Web 應用以減輕資料庫負載壓力。它通過在記憶體中緩存數據和對象來減少讀取資料庫的次數,從而提高動態、資料庫驅動網站的速度。Memcached 基於一個存儲鍵/值對的 hashmap。其守護進程(daemon )是用 C 寫的,但是客戶端可以用任何語言來編寫,並通過 memcached 協議與守護進程通信。
Memcached 記憶體管理機制:
Menceched 通過預分配指定的記憶體空間來存取數據,所有的數據都保存在 memcached 內置的記憶體中。
利用 Slab Allocation 機制來分配和管理記憶體。按照預先規定的大小,將分配的記憶體分割成特定長度的記憶體塊,再把尺寸相同的記憶體塊分成組,這些記憶體塊不會釋放,可以重覆利用。
當存入的數據占滿記憶體空間時,Memcached 使用 LRU 演算法自動刪除不是用的緩存數據,即重用過期數據的記憶體空間。Memcached 是為緩存系統設計的,因此沒有考慮數據的容災問題,和機器的記憶體一樣,重啟機器將會丟失,如果希望服務重啟數據依然能保留,那麼就需要 sina 網開發的 Memcachedb 持久性記憶體緩衝系統,當然還有常見的 NOSQL 服務如 redis。
預設監聽埠:11211
Memcached 安裝
wget http://memcached.org/latest tar -zxvf memcached-1.x.x.tar.gz cd memcached-1.x.x ./configure && make && make test && sudo make install PS:依賴libevent yum install libevent-devel apt-get install libevent-dev
# Memcached 服務安裝 # 1、安裝libevent mkdir /home/oldsuo/tools/ cd /home/oldsuo/tools/ wget http://down1.chinaunix.net/distfiles/libevent-2.0.21-stable.tar.gz ls libevent-2.0.21-stable.tar.gz tar zxf libevent-2.0.21-stable.tar.gz cd libevent-2.0.21-stable ./configure make && make install echo $? cd .. # 2、安裝Memcached wget http://memcached.org/files/memcached-1.4.24.tar.gz tar zxf memcached-1.4.24.tar.gz cd memcached-1.4.24 ./configure make make install echo $? cd .. # PS : memcached-1.4.24.tar -->客戶端 memcached-1.4.24.tar.gz -->服務端 # 3、啟動及關閉服務 echo "/usr/local/lib" >> /etc/ld.so.conf ldconfig # 查看幫助 /usr/local/bin/memcached –h # 啟動Memcached服務 memcached -p 11211 -u root -m 16m -c 10240 –d # 查看啟動狀態 lsof -i :11211 # 關閉服務 pkill memcached # memcached -p 11212 -u root -m 16m -c 10240 -d -P /var/run/11212.pid # kill `cat /var/run/11212.pid` # PS:開機自啟動把上述啟動命令放入/etc/rc.local源碼安裝啟動 Memcached 快速部署文檔
# Memcached PHP 客戶端安裝 cd /home/oldsuo/tools/ wget http://pecl.php.net/get/memcache-3.0.7.tgz tar zxf memcache-3.0.7.tgz cd memcache-3.0.7 /application/php/bin/phpize ./configure --enable-memcahce --with-php-config=/application/php/bin/php-config --with-zlib-dir make make install # 安裝完成後會有類似這樣的提示: Installing shared extensions: /application/php5.3.27/lib/php/extensions/no-debug-zts-20131226/ [root@localhost memcache-3.0.7]# ll /application/php5.3.27/lib/php/extensions/no-debug-zts-20131226/ total 1132 -rwxr-xr-x 1 root root 452913 Nov 17 16:52 memcache.so -rwxr-xr-x. 1 root root 157862 Oct 9 21:01 mysql.so -rwxr-xr-x. 1 root root 542460 Oct 9 19:25 opcache.so # 編輯php.ini文件,添加extension = memcache.so 一行 vim /application/php/lib/php.ini Extension_dir = "/application/php5.3.27/lib/php/extensions/no-debug-zts-20131226/" extension = memcache.so # 重啟 apache 服務是PHP的配置生效 [root@localhost application]# /usr/local/apache/bin/apachectl -t Syntax OK [root@localhost application]# /usr/local/apache/bin/apachectl graceful源碼安裝 Memcached PHP 客戶端
Memcached 啟動
memcached -d -m 10 -u root -l 218.97.240.118 -p 12000 -c 256 -P /tmp/memcached.pid 參數說明: -d 是啟動一個守護進程 -m 是分配給Memcache使用的記憶體數量,單位是MB -u 是運行Memcache的用戶 -l 是監聽的伺服器IP地址 -p 是設置Memcache監聽的埠,最好是1024以上的埠 -c 選項是最大運行的併發連接數,預設是1024,按照你伺服器的負載量來設定 -P 是設置保存Memcache的pid文件
Memcached 命令
存儲命令: set/add/replace/append/prepend/cas 獲取命令: get/gets 其他命令: delete/stats..
Memcached 管理
#1、telnet ip port 方式管理 telnet 127.0.0.1 11211 #2、命令直接操作,nc這樣的命令 [root@localhost application]# printf "stats slabs\r\n"|nc 127.0.0.1 11211 STAT active_slabs 0 STAT total_malloced 0 END #3、管理 Memcached 命令 a、stats 統計Memcached的各種信息。 b、stats reset 重新統計數據,重新開始統計。 c、stats slabs 顯示slabs信息。通過這命令能獲取每個slabs的chunksize長度,從而確定數據保存在哪個slab。 d、stats items 顯示slab中的item數目。 e、stats setting 查看一些Memcached設置,列如線程數…. f、stats slabs 查看slabs相關情況。 g、stats sizes 查看存在Item個數和大小。 h、stats cachedump 查看key value。 i、stats reset 清理統計數據。 j、set|get,gets 用來保存或獲取數據。
# memadmin php 工具管理(memcadmin-1.0.12.tar.gz) 1、安裝memadmin php工具。 cd /home/oldsuo/tools wget http://www.junopen.com/memadmin/memadmin-1.0.12.tar.gz tar zxf memadmin-1.0.12.tar.gz -C /usr/local/apache/htdocs/ ll /usr/local/apache/htdocs/memadmin/ 2、 登陸memadmin php。 web方式訪問:http://IP地址/memadmin/ 預設用戶名密碼都為admin。Memcached memadmin php工具界面化管理安裝部署文檔
2、Python 操作 Memcached
1> 安裝 API 及 基本操作
python 操作 Memcached 使用 Python-memcached 模塊 下載安裝:https://pypi.python.org/pypi/python-memcached import memcache mc = memcache.Client(['192.168.1.5:12000'], debug=True) mc.set("foo", "bar") ret = mc.get('foo') print ret
2> 天生支持集群
python-memcached 模塊原生支持集群操作,其原理本質是在記憶體維護一個主機列表,數字為權重,為3即出現3次,相對應的幾率大
mc = memcache.Client([ ('192.168.1.5:12000', 3), # 數字為權重 ('192.168.1.9:12000', 1), ], debug=True) # 那麼在記憶體中主機列表為: # host_list = ["192.168.1.5","192.168.1.5","192.168.1.5","192.168.1.9",]
那麼問題來了,集群情況下如何選擇伺服器存儲呢?
如果要創建設置一個鍵值對(如:k1 = "v1"),那麼它的執行流程如下:
- 將 k1 轉換成一個數字
- 將數字和主機列表的長度求餘數,得到一個值 N(N 的範圍: 0 <= N < 列表長度 )
- 在主機列表中根據 第2步得到的值為索引獲取主機,例如:host_list[N]
- 連接 將第3步中獲取的主機,將 k1 = "v1" 放置在該伺服器的記憶體中
獲取值的話也一樣
#!/usr/bin/env python #-*- coding:utf-8 -*- __author__ = 'Nick Suo' import binascii str_input = 'suoning' str_bytes = bytes(str_input, encoding='utf-8') num = (((binascii.crc32(str_bytes) & 0xffffffff) >> 16) & 0x7fff) or 1 print(num)源碼、將字元串轉換為數字
3> add
添加一個鍵值對,如果 key 已經存在,重覆添加執行 add 則拋出異常
import memcache mc = memcache.Client(['192.168.1.5:12000'], debug=True) mc.add('k1', 'v1') # mc.add('k1', 'v2') # 報錯,對已經存在的key重覆添加,失敗!!!
4> replace
replace 修改某個 key 的值,如果 key 不存在,則異常
import memcache mc = memcache.Client(['192.168.1.5:12000'], debug=True) # 如果memcache中存在kkkk,則替換成功,否則一場 mc.replace('kkkk','999')
5> set 和 set_multi
set 設置一個鍵值對,如果 key 不存在,則創建
set_multi 設置多個鍵值對,如果 key 不存在,則創建
import memcache mc = memcache.Client(['192.168.1.5:12000'], debug=True) mc.set('name', 'nick') mc.set_multi({'name': 'nick', 'age': '18'})
6> delete 和 delete_multi
delete 刪除指定的一個鍵值對
delete_multi 刪除指定的多個鍵值對
import memcache mc = memcache.Client(['192.168.1.5:12000'], debug=True) mc..delete('name', 'nick') mc.delete_multi({'name': 'nick', 'age': '18'})
7> get 和 get_multi
get 獲取一個鍵值對
get_multi 獲取多個鍵值對
import memcache mc = memcache.Client(['192.168.1.5:12000'], debug=True) val = mc.get('name') item_dict = mc.get_multi(["name", "age",])
8> append 和 prepend
append 修改指定key的值,在該值 後面 追加內容
prepend 修改指定key的值,在該值 前面 插入內容
import memcache mc = memcache.Client(['192.168.1.5:12000'], debug=True) # 原始值: k1 = "v1" mc.append('k1', 'after') # k1 = "v1after" mc.prepend('k1', 'before') # k1 = "beforev1after"
9> decr 和 incr
incr 自增,將 Memcached 中的某個值增加 N ( N 預設為1 )
decr 自減,將 Memcached 中的某個值減少 N ( N 預設為1 )
import memcache mc = memcache.Client(['192.168.1.5:12000'], debug=True) mc.set('k1', '666') mc.incr('k1') # k1 = 667 mc.incr('k1', 10) # k1 = 677 mc.decr('k1') # k1 = 676 mc.decr('k1', 10) # k1 = 666
10> gets 和 cas
這兩個方法就是傳說中的 鎖
為了避免臟數據的產生而生
import memcache mc = memcache.Client(['192.168.1.5:12000'], debug=True, cache_cas=True) v = mc.gets('product_count') # 如果有人在gets之後和cas之前修改了product_count,那下麵的設置將會執行失敗,剖出異常 mc.cas('product_count', "899")
本質:每次執行 gets 時,就從 memcache 中獲取一個自增的數字,通過 cas 去修改 gets 到的值時,會攜帶之前獲取的自增值和 memcache 中的自增值進行比較,如果相等,則可以提交,如果不相等,那表示在 gets 和 cas 執行之間,又有其他人執行了 gets(獲取了緩衝的指定值),如此一來有可能出現非正常的數據,則不允許修改,並報錯。
二、redis
1、簡介、安裝、使用、實例
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 客戶端,使用方便。
官方文檔:http://www.redis.io/documentation
Redis 安裝和使用實例
# Ubuntu 安裝 redis $ sudo apt-get install redis-server # 啟動服務端 $ sudo service redis-server {start|stop|restart|force-reload|status} # 啟動服務端 $ sudo redis-cli
# 源碼安裝 wget http://download.redis.io/releases/redis-3.0.6.tar.gz tar xzf redis-3.0.6.tar.gz cd redis-3.0.6 make # 啟動服務端 src/redis-server # 啟動客戶端 src/redis-cli
# 檢測後臺進程是否存在 ps -ef |grep redis # 檢測6379埠是否在監聽 netstat -lntp | grep 6379 # 客戶端連接 $ sudo redis-cli 127.0.0.1:6379> set foo bar OK 127.0.0.1:6379> get foo "bar"
wget http://download.redis.io/releases/redis-3.0.5.tar.gz tar zxf redis-3.0.5.tar.gz cd redis-3.0.5 #less README make MALLOC=jemalloc make PREFIX=/application/redis-3.0.5 install -->指定安裝路徑 echo $? ln -s /application/redis-3.0.5/ /application/redisredis 源碼快速安裝文檔
[root@localhost redis-3.0.5]# tree /application/redis /application/redis `-- bin |-- redis-benchmark # Redis性能測試工具,測試Redis在系統及你的配置下的讀寫性能。 |-- redis-check-aof # 更新日誌檢查。 |-- redis-check-dump # 用於本地資料庫檢查。 |-- redis-cli # Redis命令行操作工具。也可以telnet根據其純文本協議操作 |-- redis-sentinel -> redis-server `-- redis-server # Redis伺服器的daemon啟動程式。 1 directory, 6 filesredis 安裝目錄及各文件作用
# 1、 配置環境變數 # 編輯vim /etc/profile添加一行 vim /etc/profile export PATH=/application/redis/bin/:$PATH tail -1 /etc/profile -->檢查 source /etc/profile -->生效 echo export PATH=/application/redis/bin/:$PATH >> /etc/profile tail -1 /etc/profile source /etc/profile # 2、 拷貝配置文件 [root@localhost redis-3.0.5]# pwd /home/oldSuo/tools/redis-3.0.5 -->解壓目錄 [root@localhost redis-3.0.5]# mkdir /application/redis/conf [root@localhost redis-3.0.5]# cp redis.conf /application/redis/conf/ cd /home/oldSuo/tools/redis-3.0.5 mkdir /application/redis/conf cp redis.conf /application/redis/conf/ # 3、 啟動redis redis-server /application/redis/conf/redis.conf & lsof -i :6379 [root@localhost redis-3.0.5]# lsof -i :6379 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME redis-ser 5876 root 4u IPv6 793678202 0t0 TCP *:6379 (LISTEN) redis-ser 5876 root 5u IPv4 793678204 0t0 TCP *:6379 (LISTEN) # 4、 關閉redis redis-cli shutdown lsof -i :6379 -->檢查埠 #5、 啟動常見報錯 報錯: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. 解決: [root@localhost redis-3.0.5]# killall redis-server [root@localhost redis-3.0.5]# sysctl vm.overcommit_memory=1 vm.overcommit_memory = 1 永久生效:[root@localhost conf]# vim /etc/sysctl.conf 添加一行vm.overcommit_memory = 1配置並啟動 redis 服務
[root@localhost conf]# redis-cli --help [root@localhost conf]# redis-cli -h 192.168.200.95 [root@localhost conf]# redis-cli 127.0.0.1:6379> help redis-cli 3.0.5 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 127.0.0.1:6379> help get GET key summary: Get the value of a key since: 1.0.0 group: string 127.0.0.1:6379> help set SET key value [EX seconds] [PX milliseconds] [NX|XX] summary: Set the string value of a key since: 1.0.0 group: string 127.0.0.1:6379> set 007 oldSuo OK 127.0.0.1:6379> get 007 "oldSuo" 127.0.0.1:6379> 或者 [root@localhost conf]# redis-cli -h 192.168.200.95 -p 6379 set no005 suoning OK [root@localhost conf]# redis-cli -h 192.168.200.95 -p 6379 get no005 "suoning" 刪除並檢查 [root@localhost conf]# redis-cli del no005 (integer) 1 [root@localhost conf]# redis-cli get no005 (nil)客戶端連接命令及命令測試
# 1、下載安裝 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 [root@localhost phpredis-master]# make install Installing shared extensions: /application/php-5.6.8/lib/php/extensions/no-debug-non-zts-20131226/ [root@localhost phpredis-master]# cd /application/php-5.6.8/lib/php/extensions/no-debug-non-zts-20131226/ [root@localhost no-debug-non-zts-20131226]# ls memcache.so opcache.a opcache.so redis.so [root@localhost no-debug-non-zts-20131226]# # 2、修改php.ini設置,重啟php 在php.ini追加一條記錄 echo "extension = redis.so" >> /application/php/lib/php.ini #重啟 php-fpm killall php-fpm /application/php/sbin/php-fpm #網頁測試 ......redis 的 php 客戶端拓展安裝
# 1、修改從庫redis.conf配置文件 #配置從庫redis.conf配置文件(先裝redis) #添加一行,主庫IP地址及埠 vim /application/redis/conf/redis.conf # slaveof <masterip> <masterport> slaveof 192.168.200.95 6379 # 2、重啟從庫redis服務 pkill redis redis-server /application/redis/conf/redis.conf & #啟動提示 7815:S 23 Nov 19:48:52.059 # Server started, Redis version 3.0.5 7815:S 23 Nov 19:48:52.060 * The server is now ready to accept connections on port 6379 7815:S 23 Nov 19:48:53.060 * Connecting to MASTER 192.168.200.95:6379 -->跟主庫建立連接 7815:S 23 Nov 19:48:53.060 * MASTER <-> SLAVE sync started -->主從同步已經開始 7815:S 23 Nov 19:48:53.062 * Non blocking connect for SYNC fired the event. 7815:S 23 Nov 19:48:53.074 * Master replied to PING, replication can continue... -->主從ping可以繼續 7815:S 23 Nov 19:48:53.075 * Partial resynchronization not possible (no cached master) 7815:S 23 Nov 19:48:53.087 * Full resync from master: 24b26f7abc62830a7ff97516c960ba7fc0992da9:1 7815:S 23 Nov 19:48:53.122 * MASTER <-> SLAVE sync: receiving 32 bytes from master -->接收到位元組數 7815:S 23 Nov 19:48:53.122 * MASTER <-> SLAVE sync: Flushing old data 7815:S 23 Nov 19:48:53.122 * MASTER <-> SLAVE sync: Loading DB in memory 7815:S 23 Nov 19:48:53.122 * MASTER <-> SLAVE sync: Finished with success -->成功 # 3、測試主從同步 # 主庫:寫數據 [root@localhost redis]# redis-cli 127.0.0.1:6379> set test1 oldsuo OK # 從庫: [root@localhost conf]# redis-cli -h localhost -p 6379 monitor -->開啟實時監控 OK 1448280033.096372 [0 192.168.200.95:6379] "PING" 1448280043.125830 [0 192.168.200.95:6379] "PING" 1448280053.154134 [0 192.168.200.95:6379] "PING" 1448280070.858808 [0 192.168.200.95:6379] "SELECT" "0" 1448280070.858828 [0 192.168.200.95:6379] "set" "test1" "oldsuo" -->主庫添加數據,從庫同步 [root@localhost redis]# redis-cli -h 192.168.200.92 get test1 "oldsuo" -->從庫同步成功redis 主從同步
至於 redis 的負載均衡,方案有很多:
LVS、keepalived、Twemproxy
小編有時間再補上吧...
reidis 負載均衡
Redis持久化方式有兩種: (1)RDB 對記憶體中資料庫狀態進行快照 (2)AOF 把每條寫命令都寫入文件,類似mysql的binlog日誌 RDB 將Redis在記憶體中的資料庫狀態保存到磁碟裡面,RDB文件是一個經過壓縮的二進位文件,通過該文件可以還原生成RDB文件時的資料庫狀態 RDB的生成方式: (1)執行命令手動生成 有兩個Redis命令可以用於生成RDB文件,一個是SAVE,另一個是BGSAVE SAVE命令會阻塞Redis伺服器進程,直到RDB文件創建完畢為止,在伺服器進程阻塞期間,伺服器不能處理任何命令請求 BGSAVE命令會派生出一個子進程,然後由子進程負責創建RDB文件,伺服器進程(父進程)繼續處理命令請求,創建RDB文件結束之前,客戶端發送的BGSAVE和SAVE命令會被伺服器拒絕 (2)通過配置自動生成 可以設置伺服器配置的save選項,讓伺服器每隔一段時間自動執行一次BGSAVE命令 可以通過save選項設置多個保存條件,但只要其中任意一個條件被滿足,伺服器就會執行BGSAVE命令 例如: save 900 1 save 300 10 save 60 10000 那麼只要滿足以下三個條件中的任意一個,BGSAVE命令就會被執行 伺服器在900秒之內,對資料庫進行了至少1次修改 伺服器在300秒之內,對資料庫進行了至少10次修改 伺服器在60秒之內,對資料庫進行了至少10000次修改 AOF AOF持久化是通過保存Redis伺服器所執行的寫命令來記錄資料庫狀態的 AOF文件刷新的方式,有三種 (1)appendfsync always - 每提交一個修改命令都調用fsync刷新到AOF文件,非常非常慢,但也非常安全 (2)appendfsync everysec - 每秒鐘都調用fsync刷新到AOF文件,很快,但可能會丟失一秒以內的數據 (3)appendfsync no - 依靠OS進行刷新,redis不主動刷新AOF,這樣最快,但安全性就差 預設並推薦每秒刷新,這樣在速度和安全上都做到了兼顧 數據恢復 RDB方式 RDB文件的載入工作是在伺服器啟動時自動執行的,沒有專門用於載入RDB文件的命令,只要Redis伺服器在啟動時檢測到RDB文件存在,它就會自動載入RDB文件,伺服器在載入RDB文件期間,會一直處於阻塞狀態,直到載入工作完成為止 AOF方式 伺服器在啟動時,通過載入和執行AOF文件中保存的命令來還原伺服器關閉之前的資料庫狀態,具體過程: (1)載入AOF文件 (2)創建模擬客戶端 (3)從AOF文件中讀取一條命令 (4)使用模擬客戶端執行命令 (5)迴圈讀取並執行命令,直到全部完成 如果同時啟用了RDB和AOF方式,AOF優先,啟動時只載入AOF文件恢複數據redis 持久化
2、Python 操作 Redis
python 安裝 redis 模塊:
$ sudo 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
API 的使用
1> 操作模式
redis-py 提供兩個類 Redis 和 StrictRedis 用於實現 Redis 的操作命令,StrictRedis 用於實現大部分官方的命令,並使用官方的語法和命令,Redis 是 StrictRedis 的子類,用於向後相容舊版本的 redis-py
import redis r = redis.Redis(host='192.168.1.5', port=6379) r.set('foo', 'Bar') print r.get('foo')
2> 連接池
redis-py 使用 connection pool 來管理對一個 redis server 的所有連接,避免每次建立、釋放連接帶來的額外開銷。預設每個 Redis 實例都會維護著一個自己的連接池。也可以覆蓋直接建立一個連接池,然後作為參數 Redis,這樣就可以實現多個 Redis 實例共用一個連接池資源。實現客戶端分片或有連接如何管理更細的顆粒控制。
pool = redis.ConnectionPool(host='192.168.1.5', port=6379) r = redis.Redis(connection_pool=pool) r.set('foo', 'Bar') print r.get('foo')
3> 操作
分為五種數據類型,見下圖:
① String 操作,String 在記憶體中格式是一個 name 對應一個 value 來存儲
set(name, value, ex=None, px=None, nx=False, xx=False)
# 在Redis中設置值,預設,不存在則創建,存在則修改 # 參數: ex,過期時間(秒) px,過期時間(毫秒) nx,如果設置為True,則只有name不存在時,當前set操作才執行 xx,如果設置為True,則只有name存在時,崗前set操作才執行setnx(name, value)
# 設置值,只有name不存在時,執行設置操作(添加)setex(name, value, time)
# 設置值 # 參數: time,過期時間(數字秒 或 timedelta對象)psetex(name, time_ms, value)
# 設置值 # 參數: time_ms,過期時間(數字毫秒 或 timedelta對象)mset(*args, **kwargs)
# 批量設置值 # 如: mset(k1='v1', k2='v2') 或 mget({'k1': 'v1', 'k2': 'v2'})get(name)
# 獲取值mget(keys, *args)
# 批量獲取 # 如: mget('ylr', 'nick') 或 r.mget(['ylr', 'nick'])getset(name, value)
# 設置新值並獲取原來的值getrange(key, start, end)
# 獲取子序列(根據位元組獲取,非字元) # 參數: name,Redis 的 name start,起始位置(位元組) end,結束位置(位元組) # 如: "索寧" ,0-3表示 "索"setrange(name, offset, value)
# 修改字元串內容,從指定字元串索引開始向後替換(新值太長時,則向後添加) # 參數: offset,字元串的索引,位元組(一個漢字三個位元組) value,要設置的值setbit(name, offset, value)
# 對name對應值的二進位表示的位進行操作 # 參數: # name,redis的name # offset,位的索引(將值變換成二進位後再進行索引) # value,值只能是 1 或 0 # 註:如果在Redis中有一個對應: n1 = "foo", 那麼字元串foo的二進位表示為:01100110 01101111 01101111 所以,如果執行 setbit('n1',