python操作Redis快取 python操作Redis快取
python操作Redis快取
https://www.cnblogs.com/guotianbao/p/8683037.html
學習資料: 電子書資源
聯絡郵箱:[email protected]
flask微電影: movie_project
閱讀目錄
正文
回到頂部一、Redis的安裝
xshell連上伺服器,依次輸入以下程式碼:
1 2 3 4 |
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
|
如果不巧發生以下截圖中的錯誤:
說明未安裝gcc,如果是centos系統,輸入:yum install gcc安裝gcc即可,然後再次輸入make執行。
輸入make後,很不幸,再次發生如下截圖錯誤:
推測是因為編譯庫的問題。
將make改為make MALLOC=libc 再次執行!好事多磨。
終於安裝成功了!
還有配置檔案的修改什麼的先不折騰了,此時已然可以啟動Redis服務
1 2 3 4 5 6 7 8 |
src
/
redis
-
server
# 啟動服務端
# 啟動客戶端的程式碼如下
src
/
redis
-
cli
redis>
set
foo bar
OK
redis> get foo
"bar"
|
看到上面的影象,說明服務端已經起來了!
但是看到很多WARNING,沒錯,此時你用pycharm寫了連線redis服務端的程式碼,但是你發現服務端竟然沒有響應
OK,在服務端Ctrl + C ,先把服務斷開
分別執行下面的語句:
1 2 3 4 |
echo
511
>
/
proc
/
sys
/
net
/
core
/
somaxconn
echo
"vm.overcommit_memory = 1"
>>
/
etc
/
sysctl.conf
sysctl vm.overcommit_memory
=
1
echo never >
/
sys
/
kernel
/
mm
/
transparent_hugepage
/
enabled
|
在/etc下的rc.local的最後新增:
1 |
echo never >
/
sys
/
kernel
/
mm
/
transparent_hugepage
/
enabled
|
最後的重點來了,折騰半天還是伺服器不鳥我,無奈之下試了試臨時關閉防火牆:
1 |
service iptables stop
|
唉呀呀,終於成功了!
我在另一臺伺服器用了另一種搭建方法:傳送門也成功了,但是也不要忘記要臨時關掉防火牆。
回到頂部
二、Redis的兩種連線方式
1.簡單連線
1 2 3 4 5 |
import
redis
conn
=
redis.Redis(host
=
'207.148.120.229'
, port
=
6379
)
conn.
set
(
'foo'
,
'Bar'
)
print
(conn.get(
'foo'
))
a
=
input
(
'按任意鍵結束'
)
|
2.使用連線池
為了減少每次建立、釋放連線的開銷,推薦使用連線池
redis使用connection pool來管理對一個redis服務的所有連線。
多個redis例項可共享一個連線池。
1 2 3 4 5 6 7 |
import
redis
pool
=
redis.ConnectionPool(host
=
'207.148.120.229'
,port
=
6379
)
conn
=
redis.Redis(connection_pool
=
pool)
conn.
set
(
'key'
,
'Hello World'
)
print
(conn.get(
'key'
))
a
=
input
(
'按任意鍵結束'
)
|
三、五大資料型別
1.String操作
redis中的String在在記憶體中按照一個key對應一個value來儲存。以鍵值對的方式儲存。
set(name, value, ex=None, px=None, nx=False, xx=False)
+ View Codemset(*args, **kwargs) 批量設定值
View Codeget(name) 獲取值
print(conn.get('k1'))
mget(keys, *args) 批量獲取值
View Codegetset(name, value) 設定新值並獲取原來的值
View Codegetrange(key, start, end) 獲取name對應value的指定位元組
View Codesetrange(name, offset, value) 從指定位元組開始替換新值
View Codestrlen(name) 獲取name對應的value的長度
View Codeincr(self, name, amount=1) name存在,則自增amount,否則設定name的value值為amount
View Codedecr(self, name, amount=1) 自減(整數)
View Codeappend(key, value)
View Code2.Hash操作
hset(name, key, value) 設定值
View Codehmset(name, mapping) 批量設定值
View Codehmget(name, keys, *args) 獲取多個值
View Codehgetall(name) 獲取name對應hash的所有鍵值
View Codehlen(name) 獲取name對應的hash中鍵值對的個數
hkeys(name) 獲取name對應的hash中所有的key的值
hvals(name) 獲取name對應的hash中所有的value的值
hdel(name,*keys) 將name對應的hash中指定key的鍵值對刪除
hincrby(name, key, amount=1) 自增(整數)
View Codehincrbyfloat(name, key, amount=1.0) 自增(浮點數)
hscan(name, cursor=0, match=None, count=None) 增量式迭代獲取
View Codehscan_iter(name, match=None, count=None)
View Code3.List操作
lpush(name,values)
View Codelpushx(name,value)
View Codellen(name) name對應的list元素的個數
linsert(name, where, refvalue, value))
View Coder.lset(name, index, value)
View Coder.lrem(name, value, num)
View Codelpop(name)
View Codelindex(name, index) 在name對應的列表中根據索引獲取列表元素
lrange(name, start, end)
View Codeltrim(name, start, end)
View Coderpoplpush(src, dst)
View Codeblpop(keys, timeout)
# 將多個列表排列,按照從左到右去pop對應列表的元素 # 引數: # keys,redis的name的集合 # timeout,超時時間,當元素所有列表的元素獲取完之後,阻塞等待列表內有資料的時間(秒), 0 表示永遠阻塞 # 更多: # r.brpop(keys, timeout),從右向左獲取資料
brpoplpush(src, dst, timeout=0)
View Code自定義增量迭代
View Code4.Set操作
Set集合就是不允許重複的列表
sadd(name,values) name對應的集合中新增元素
scard(name) 獲取name對應的集合中元素個數
sdiff(keys, *args) 在第一個name對應的集合中且不在其他name對應的集合的元素集合
sdiffstore(dest, keys, *args) 獲取第一個name對應的集合中且不在其他name對應的集合,再將其新加入到dest對應的集合中
sinter(keys, *args) 獲取多一個name對應集合的並集
sinterstore(dest, keys, *args) 獲取多一個name對應集合的並集,再講其加入到dest對應的集合中
sismember(name, value) 檢查value是否是name對應的集合的成員
smembers(name) 獲取name對應的集合的所有成員
smove(src, dst, value) 將某個成員從一個集合中移動到另外一個集合
spop(name) 從集合的右側(尾部)移除一個成員,並將其返回
srandmember(name, numbers) 從name對應的集合中隨機獲取 numbers 個元素
srem(name, values) 在name對應的集合中刪除某些值
sunion(keys, *args) 獲取多一個name對應的集合的並集
sunionstore(dest,keys, *args) 獲取多一個name對應的集合的並集,並將結果儲存到dest對應的集合中
sscan_iter(name, match=None, count=None) 同字串的操作,用於增量迭代分批獲取元素,避免記憶體消耗太大
5.有序集合
在集合的基礎上,為每元素排序;元素的排序需要根據另外一個值來進行比較,所以,對於有序集合,每一個元素有兩個值,即:值和分數,分數專門用來做排序。
zadd(name, *args, **kwargs) 在name對應的有序集合中新增元素
View Codezcard(name) 獲取name對應的有序集合元素的數量
zcount(name, min, max) 獲取name對應的有序集合中分數 在 [min,max] 之間的個數
zincrby(name, value, amount) 自增name對應的有序集合的 name 對應的分數
View Coder.zrange( name, start, end, desc=False, withscores=False, score_cast_func=float)
View Codezrank(name, value)
View Codezrangebylex(name, min, max, start=None, num=None)
View Codezrem(name, values)
View Codezremrangebyrank(name, min, max) 根據排行範圍刪除
zremrangebyscore(name, min, max) 根據分數範圍刪除
zremrangebylex(name, min, max) 根據值返回刪除
zscore(name, value) 獲取name對應有序集合中 value 對應的分數
zinterstore(dest, keys, aggregate=None)
View Codezunionstore(dest, keys, aggregate=None)
View Codezscan_iter(name, match=None, count=None,score_cast_func=float) 同字串相似,相較於字串新增score_cast_func,用來對分數進行操作
6.其他常用操作
delete(*names) 根據name刪除redis中的任意資料型別
exists(name) 檢測redis的name是否存在
keys(pattern='*')
View Codeexpire(name ,time) 為某個redis的某個name設定超時時間
rename(src, dst) 對redis的name重新命名
move(name, db) 將redis的某個值移動到指定的db下
randomkey() 隨機獲取一個redis的name(不刪除)
type(name) 獲取name對應值的型別
scan(cursor=0, match=None, count=None)
scan_iter(match=None, count=None) 同字串操作,用於增量迭代獲取key
回到頂部四、管道
redis-py預設在執行每次請求都會建立(連線池申請連線)和斷開(歸還連線池)一次連線操作,如果想要在一次請求中指定多個命令,則可以使用pipline實現一次請求指定多個命令,並且預設情況下一次pipline 是原子性操作。
View Code 回到頂部五、釋出和訂閱
釋出者:伺服器
訂閱者:Dashboad和資料處理
Demo如下:
RedisHelper
訂閱者:
View Code
釋出者:
View Code