安裝redis-py
pip3 install redis

redis 服務器內(nèi)
python 操作 redis
默認情況下,所有響應在Python 3中以字節(jié)返回(輸出打印 type 為 bytes),在Python 2中以str返回。用戶負責解碼為Python 3字符串或Python 2 unicode對象。

image.png
import redis
#連接 redis
#指定主機地址,port與服務器連接,redis默認數(shù)據(jù)庫有16個,默認db是0
r = redis.Redis(host='172.17.0.4',port=6380,db=0) #password='**'
print(r.get('foo'))
r.set('foo','[1,2,3]')
print(r.get('foo'))
print(r.keys())
r.delete('foo')
print(r.keys())

image.png
python 連接 redis 使用連接池
redis-py使用connection pool來管理對一個redis server的所有連接,避免每次建立、釋放連接的開銷。默認,每個Redis實例都會維護一個自己的連接池。可以直接建立一個連接池,然后作為參數(shù)Redis,這樣就可以實現(xiàn)多個Redis實例共享一個連接池
import redis
pool = redis.ConnectionPool(host='172.17.0.4', port=6380)
r = redis.Redis(connection_pool=pool)
r.set('foo', 'Bar')
print(r.get('foo'))
python 連接 redis 主從服務器 sentinel 集群 (哨兵模式)

image.png
import redis
from redis.sentinel import Sentinel
#連接哨兵服務器(主機名也可以用域名)
sentinel = Sentinel([('172.17.0.4',26379),('172.17.0.4',26380),('172.17.0.4',26381)],socket_timeout=0.5)
# 獲取主服務器地址
master = sentinel.discover_master('mymaster')
print(master)
# 獲取從服務器地址
slave = sentinel.discover_slaves('mymaster')
print(slave)
# 獲取主服務器進行寫入
master = sentinel.master_for('mymaster', socket_timeout=0.5, db=0)
print("主服務器插入前的name為:",master.get('name'))
w_ret = master.set('name', 'shark')
print("主服務器插入后的name為:", master.get('name'))
# # 獲取從服務器進行讀?。J是round-roubin)
slave = sentinel.slave_for('mymaster', socket_timeout=0.5, db=0)
r_ret = slave.get('name')
print("從服務器的name為:", r_ret)

image.png
會出現(xiàn)如下報錯

報錯1
解決方案: 配置文件中寫入
bind 0.0.0.0
daemonize no
protected-mode no

報錯2
解決方案: 配置文件中
sentinel monitor mymaster 127.0.0.1 6380 2
改成
sentinel monitor mymaster 172.17.0.4 6380 2
python 操作 redis 集群
啟動集群
redis-server /etc/redis/7001.conf
redis-server /etc/redis/7002.conf
redis-server /etc/redis/7003.conf
redis-server /etc/redis/7004.conf
redis-server /etc/redis/7005.conf
redis-server /etc/redis/7006.conf

啟動哨兵后

集群信息
pip3 install redis-py-cluster
#python連接rediscluster集群測試
from rediscluster import StrictRedisCluster
startup_nodes = [{"host": "172.17.0.3", "port": "7001"},
{"host": "172.17.0.3", "port": "7002"},
{"host": "172.17.0.3", "port": "7003"},
{"host": "172.17.0.3", "port": "7004"},
{"host": "172.17.0.3", "port": "7005"},
{"host": "172.17.0.3", "port": "7006"} ]
# Note: 與python3一起使用時,decode_responses必須設置為True
m1 = StrictRedisCluster(startup_nodes=startup_nodes, decode_responses=True)
m1.set("name", "shark")
print("集群中的 name 為:",m1.get("name"))
打印結(jié)果如下:

image.png
可能有報錯如下

image.png
原因是 rediscluster 和 redis-py 版本不兼容
建議使用以下版本

image.png
redis存儲session
安裝模塊
pip3 install django-redis
pip3 install Django==2.1.5
創(chuàng)建django項目
django-admin startproject redissite

image.png
修改settings.py文件

image.png
寫入
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://172.17.0.2:7001/0",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
"PASSWORD": "",
# "PARSER_CLASS": "redis.connection.HiredisParser",
# "SOCKET_TIMEOUT": 10,
# "CONNECTION_POOL_CLASS_KWARGS": {
# "max_connections": 2,
# }
}
}
}
#SESSION_COOKIE_AGE = 30 * 60 #設置session過期時間為30分鐘
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
創(chuàng)建應用 appredis
django-admin startapp appredis
編寫session視圖函數(shù) appredis/views.py
from django.shortcuts import render,HttpResponse
def set_session(request):
request.session['username']='shark'
request.session['age']=18
return HttpResponse("設置sesson成功")
def get_session(request):
username=request.session['username']
age = request.session['age']
return HttpResponse(username+":"+str(age))
在主路由文件中添加url路由 mydjango/urls.py
from django.contrib import admin
from django.urls import path
from appredis import views
urlpatterns = [
path('set_session/',views.set_session),
path('get_session/',views.get_session),
path('admin/', admin.site.urls),
]
確保啟動redis服務端,默認方式啟動
redis-server /etc/redis/7001.conf
redis-cli -p 7001
發(fā)送ping命令得到pong即可
啟動django
python3 manage.py runserver
訪問視圖,設置一條session信息,存入redis數(shù)據(jù)庫

image.png
訪問視圖,獲取session信息

image.png
檢查redis數(shù)據(jù)庫
redis-cli -p 7001
127.0.0.1:7001> keys *

多了一條 key
查看此 key 的值

byte二進制字符串格式