https://www.cnblogs.com/guotianbao/p/8683037.htmlhtml
學習資料: 電子書資源 python
聯繫郵箱:gmu1592618@gmail.comgit
flask微電影: movie_project github
正文shell
xshell連上服務器,依次輸入如下代碼:flask
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
|
若是不巧發生如下截圖中的錯誤:centos
說明未安裝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
|
唉呀呀,終於成功了!
我在另外一臺服務器用了另外一種搭建方法:傳送門也成功了,可是也不要忘記要臨時關掉防火牆。
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
(
'按任意鍵結束'
)
|
爲了減小每次創建、釋放鏈接的開銷,推薦使用鏈接池
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
(
'按任意鍵結束'
)
|
redis中的String在在內存中按照一個key對應一個value來存儲。以鍵值對的方式存儲。
set(name, value, ex=None, px=None, nx=False, xx=False)
mset(*args, **kwargs) 批量設置值
get(name) 獲取值
print(conn.get('k1'))
mget(keys, *args) 批量獲取值
getset(name, value) 設置新值並獲取原來的值
getrange(key, start, end) 獲取name對應value的指定字節
setrange(name, offset, value) 從指定字節開始替換新值
strlen(name) 獲取name對應的value的長度
incr(self, name, amount=1) name存在,則自增amount,不然設置name的value值爲amount
decr(self, name, amount=1) 自減(整數)
append(key, value)
hset(name, key, value) 設置值
hmset(name, mapping) 批量設置值
hmget(name, keys, *args) 獲取多個值
hgetall(name) 獲取name對應hash的全部鍵值
hlen(name) 獲取name對應的hash中鍵值對的個數
hkeys(name) 獲取name對應的hash中全部的key的值
hvals(name) 獲取name對應的hash中全部的value的值
hdel(name,*keys) 將name對應的hash中指定key的鍵值對刪除
hincrby(name, key, amount=1) 自增(整數)
hincrbyfloat(name, key, amount=1.0) 自增(浮點數)
hscan(name, cursor=0, match=None, count=None) 增量式迭代獲取
hscan_iter(name, match=None, count=None)
lpush(name,values)
lpushx(name,value)
llen(name) name對應的list元素的個數
linsert(name, where, refvalue, value))
r.lset(name, index, value)
r.lrem(name, value, num)
lpop(name)
lindex(name, index) 在name對應的列表中根據索引獲取列表元素
lrange(name, start, end)
ltrim(name, start, end)
rpoplpush(src, dst)
blpop(keys, timeout)
# 將多個列表排列,按照從左到右去pop對應列表的元素 # 參數: # keys,redis的name的集合 # timeout,超時時間,當元素全部列表的元素獲取完以後,阻塞等待列表內有數據的時間(秒), 0 表示永遠阻塞 # 更多: # r.brpop(keys, timeout),從右向左獲取數據
brpoplpush(src, dst, timeout=0)
自定義增量迭代
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) 同字符串的操做,用於增量迭代分批獲取元素,避免內存消耗太大
在集合的基礎上,爲每元素排序;元素的排序須要根據另一個值來進行比較,因此,對於有序集合,每個元素有兩個值,即:值和分數,分數專門用來作排序。
zadd(name, *args, **kwargs) 在name對應的有序集合中添加元素
zcard(name) 獲取name對應的有序集合元素的數量
zcount(name, min, max) 獲取name對應的有序集合中分數 在 [min,max] 之間的個數
zincrby(name, value, amount) 自增name對應的有序集合的 name 對應的分數
r.zrange( name, start, end, desc=False, withscores=False, score_cast_func=float)
zrank(name, value)
zrangebylex(name, min, max, start=None, num=None)
zrem(name, values)
zremrangebyrank(name, min, max) 根據排行範圍刪除
zremrangebyscore(name, min, max) 根據分數範圍刪除
zremrangebylex(name, min, max) 根據值返回刪除
zscore(name, value) 獲取name對應有序集合中 value 對應的分數
zinterstore(dest, keys, aggregate=None)
zunionstore(dest, keys, aggregate=None)
zscan_iter(name, match=None, count=None,score_cast_func=float) 同字符串類似,相較於字符串新增score_cast_func,用來對分數進行操做
delete(*names) 根據name刪除redis中的任意數據類型
exists(name) 檢測redis的name是否存在
keys(pattern='*')
expire(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 是原子性操做。
發佈者:服務器
訂閱者:Dashboad和數據處理
Demo以下:
訂閱者:
發佈者: