緩存、隊列(Memcached、redis、RabbitMQ)

来源:http://www.cnblogs.com/wajika/archive/2016/12/27/6224540.html
-Advertisement-
Play Games

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"),那麼它的執行流程如下:

  1. 將 k1 轉換成一個數字
  2. 將數字和主機列表的長度求餘數,得到一個值 N(N 的範圍: 0 <= N < 列表長度 )
  3. 在主機列表中根據 第2步得到的值為索引獲取主機,例如:host_list[N]
  4. 連接 將第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

                http://www.redis.cn/

 

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/redis
redis 源碼快速安裝文檔
[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 files
redis 安裝目錄及各文件作用
# 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',

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一個字元串數組,{,a,b,1,110,111,13,2,23,22,23442,2645,345,34567,34,3487,5643,64545454,56457,7654564} 寫一個函數,返回結果為{1,2,34,5643,64545454,56457,7654564} 規律,數字判斷,如 ...
  • 1. returnDetail.$mount('#returnDetail'); 不用el 直接可以綁定數據到頁面的id上 作用區域不能交疊多個vue 實體 否則後面的vue 實體會失效。 2. vue created 運行在讀取data 之後, 綁定到數據之前, 如果不想顯示 {{}} 就可以在頁 ...
  • 1.audio自動播放 1 <audio src='xxx.mp3' autoplay></audio> 上面是audio標簽autoplay屬性是自動播放,但是在安卓部分瀏覽器和ios的safari是不會自動播放。在微信,安卓和ios大部分機子都可以知道播放。測試iphone5和iphone6s在 ...
  • 這是我前端生涯第一次和後臺對接,其經歷真是苦不堪言,多次絕處逢生,柳暗花明,可就是遲遲見不到那條村子。當然,最後我還是完成了這次對接。下麵來聊一聊我這白痴一般的經歷。 序章 話說天下大勢,分久必合,合久必分。2016年,程式員的角色已經有了很大的分化,後端、前端、移動端、演算法各領功能變數名稱家輩出,他們都是 ...
  • 原文鏈接: "https://github.com/AlloyTeam/AlloyTouch/wiki/Scoped CSS" 寫在前面 問:什麼是Scoped CSS規範? Scoped CSS規範是Web組件產生不污染其他組件,也不被其他組件污染的CSS規範。 面對組件化的普及,組件的復用很普遍 ...
  • 1.結構性定義 文件類型 <HTML></HTML> (放在檔案的開頭與結尾) 文件主題 <TITLE></TITLE> (必須放在「文頭」區塊內) 文頭 <HEAD></HEAD> (描述性資料,像是「主題」) 文體 <BODY></BODY> (文件本體) (由瀏覽器控制的顯示風格) 標題 <H ...
  • 由[OpenDigg](http://www.opendigg.com/) 出品的前端開源項目周報第三期來啦。我們的前端開源周報集合了OpenDigg一周來新收錄的優質的前端開發方面的開源項目,方便前端開發人員便捷的找到自己需要的項目工具等 ...
  • 本文章已收錄於: AngularJS知識庫 AngularJS知識庫 分類: javascript(55) 分類: javascript(55) http://www.cnblogs.com/xiaoxie53/p/5058198.html 前面的文章介紹了很多angular自帶的指令,下麵我們看看 ...
一周排行
    -Advertisement-
    Play Games
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...
  • 目錄前言PostgreSql安裝測試額外Nuget安裝Person.cs模擬運行Navicate連postgresql解決方案Garnet為什麼要選擇Garnet而不是RedisRedis不再開源Windows版的Redis是由微軟維護的Windows Redis版本老舊,後續可能不再更新Garne ...
  • C#TMS系統代碼-聯表報表學習 領導被裁了之後很快就有人上任了,幾乎是無縫銜接,很難讓我不想到這早就決定好了。我的職責沒有任何變化。感受下來這個系統封裝程度很高,我只要會調用方法就行。這個系統交付之後不會有太多問題,更多應該是做小需求,有大的開發任務應該也是第二期的事,嗯?怎麼感覺我變成運維了?而 ...
  • 我在隨筆《EAV模型(實體-屬性-值)的設計和低代碼的處理方案(1)》中介紹了一些基本的EAV模型設計知識和基於Winform場景下低代碼(或者說無代碼)的一些實現思路,在本篇隨筆中,我們來分析一下這種針對通用業務,且只需定義就能構建業務模塊存儲和界面的解決方案,其中的數據查詢處理的操作。 ...
  • 對某個遠程伺服器啟用和設置NTP服務(Windows系統) 打開註冊表 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer 將 Enabled 的值設置為 1,這將啟用NTP伺服器功 ...
  • title: Django信號與擴展:深入理解與實踐 date: 2024/5/15 22:40:52 updated: 2024/5/15 22:40:52 categories: 後端開發 tags: Django 信號 松耦合 觀察者 擴展 安全 性能 第一部分:Django信號基礎 Djan ...
  • 使用xadmin2遇到的問題&解決 環境配置: 使用的模塊版本: 關聯的包 Django 3.2.15 mysqlclient 2.2.4 xadmin 2.0.1 django-crispy-forms >= 1.6.0 django-import-export >= 0.5.1 django-r ...
  • 今天我打算整點兒不一樣的內容,通過之前學習的TransformerMap和LazyMap鏈,想搞點不一樣的,所以我關註了另外一條鏈DefaultedMap鏈,主要調用鏈為: 調用鏈詳細描述: ObjectInputStream.readObject() DefaultedMap.readObject ...
  • 後端應用級開發者該如何擁抱 AI GC?就是在這樣的一個大的浪潮下,我們的傳統的應用級開發者。我們該如何選擇職業或者是如何去快速轉型,跟上這樣的一個行業的一個浪潮? 0 AI金字塔模型 越往上它的整個難度就是職業機會也好,或者說是整個的這個運作也好,它的難度會越大,然後越往下機會就會越多,所以這是一 ...
  • @Autowired是Spring框架提供的註解,@Resource是Java EE 5規範提供的註解。 @Autowired預設按照類型自動裝配,而@Resource預設按照名稱自動裝配。 @Autowired支持@Qualifier註解來指定裝配哪一個具有相同類型的bean,而@Resourc... ...