【python】redis模塊

單線程,通過(guò)epoll實(shí)現(xiàn)高并發(fā),端口6379

10年積累的成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問(wèn)題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站策劃后付款的網(wǎng)站建設(shè)流程,更有團(tuán)風(fēng)免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

linux下載地址:http://redis.io/download

windows下載地址:https://github.com/MSOpenTech/redis/releases

 

本文介紹的內(nèi)容:

string:存字符串

hash:存名字和值

list:存列表

set:存集合

sort set:有序集合,帶權(quán)值排序的集合,可以應(yīng)用到學(xué)生對(duì)應(yīng)的分?jǐn)?shù)

發(fā)布和訂閱

小技巧

 

系統(tǒng)下命令
參數(shù)
作用
redis-cti -h ip port

ip:指定IP

port:主機(jī)端口

在redis安裝目錄下運(yùn)行,啟動(dòng)redis實(shí)例

set name value

name:鍵名

value:鍵值

設(shè)置鍵名和鍵值
get namename:鍵名
獲取鍵值
set name value ex time

name :鍵名

value:鍵值

ex:指定存在時(shí)間

time:時(shí)間

設(shè)置鍵的存在時(shí)間,過(guò)期自動(dòng)刪除

 

 

Python下命令:

ConnectionPool(host,port)

host:redis服務(wù)器地址

port:端口

連接到redis服務(wù)器pool=redis.ConnectionPool(host='192.168.1.1',port=6379)
Redis(connection_pool)connection_pool:上面的鏈接綁定鏈接實(shí)例conn=(connection_pool=pool)
pipeline(transaction)transaction:redis鏈接創(chuàng)建管道pipe=redis.pipeline(transaction=conn)
execute()提交操作pipe.excute()

通用操作

select(db)db:redis數(shù)據(jù)庫(kù)名。redis默認(rèn)16個(gè)數(shù)據(jù)庫(kù)。名字是0~15選取并使用redis的數(shù)據(jù)庫(kù)
delete(*names)
*names刪除對(duì)應(yīng)的name
exists(name)name判斷key是否存在
keys(pattern='*')

pattern:支持以正通配符

*:匹配任意多個(gè)字符

?:只匹配一個(gè)字符

[]:指定匹配[]的字符

以上可以搭配使用

匹配pattern指定的name

 

 

expire(name,time)

name:

time:

為name設(shè)存活時(shí)間,過(guò)期自動(dòng)刪除
rename(src,dst)

src:

dst:

把name由src改成dst
move(name,db)

name:

db:

把name移動(dòng)到指定的db下,如果目標(biāo)db已存在相同name,則不移動(dòng) 
type(name)name:查看name的類型
randomkey()隨機(jī)獲取一個(gè)name
scan(cursor,match,count)

cursor:默認(rèn)0

match:默認(rèn)None

count:默認(rèn)None

從cursor開(kāi)始,匹配符合match條件,只匹配count條
scan_iter(match,count)

match:

count:

匹配count個(gè),符合match條件的name,返回迭代器
Redis()

host:

port:

connection_pool:

連接到redis服務(wù)器
ConnectionPool()

host:

port:

創(chuàng)建鏈接憑據(jù),供Redis()方法使用
pipeline(transaction,shard_hint)

transaction:默認(rèn)False,不每次都與服務(wù)器交互

shard_hint:默認(rèn)None

創(chuàng)建一個(gè)道對(duì)象,使用管道對(duì)象進(jìn)行set后,必須使用execute()方法,才能上傳數(shù)據(jù)到redis服務(wù)端,減少了服務(wù)器和客戶端的交互次數(shù)

pipe=r.pipeline()

pipe.set(name,value)

execute()提交管道內(nèi)容到redis服務(wù)器pipe.execute()
STR操作
set()

name:key名

value:key值

ex:過(guò)期時(shí)間,秒

px:過(guò)期時(shí)間,毫秒

nx:False。True:name不存在則set

xx:False。True:name存在則set

設(shè)置key和key值
setnx(name,value)

name:key名

value:key值

如果key不存在,設(shè)置key和key值

 

setex(name,value,time_s)

 

name:key名

value:key值

time_s:過(guò)期時(shí)間,秒

設(shè)置key和key的值,到時(shí)間自動(dòng)刪除key
psetex(name,time_ms,value)

name:key名

value:key值

time_ms:過(guò)期時(shí)間,毫秒

設(shè)置key和key的值,到時(shí)間自動(dòng)刪除key
mset(*args,**kwargs)批量設(shè)置

mset(r1='1',r2='2')

或:

mset({r1:'1',r2:'2'})

setbit()

name:key名

offset:偏移量

value:值

設(shè)置string的ASCII碼,二進(jìn)制位的值
get()name:key名獲取鍵值
mget()*args:多個(gè)key名,逗號(hào)分割獲取多個(gè)鍵值
getset()

name:key名

value:值

 

獲取當(dāng)前鍵值,并設(shè)置新值
getbit()

name:key名

offset:偏移量

獲取string的ASCII碼二進(jìn)制位的值
bitop('operation',dest,*keys)

operation:and(與)or(或)not(非)xor(異或)

dest:新的redis名字

*keys:要查找的redis名

 

把要查找的redis名按operation進(jìn)行二進(jìn)制位運(yùn)算,結(jié)果存放在dest里面

bitop('and','result','r1','r2','r3')
incr(name,amount)

name:key名

amount:只能是整型,默認(rèn)是1

每次運(yùn)行把name增量加amount,運(yùn)行幾次incr,name的值就是幾

decr(name,amount)

name:key名

amount:只能是整型,默認(rèn)是1

每次運(yùn)行把name字段減amount,運(yùn)行幾次decr,name就減幾次,可以減到負(fù)值
imcrbyfloat(name,amount)

name:key名

amount:可以是浮點(diǎn)型,默認(rèn)1.0

strlen()name:key名返回name的字符串長(zhǎng)度
append(name,str)

name:key名

str:追加的字符

把str追加到name的后面

HASH操作

hset(name,key,value)

name:redis的name
key:name對(duì)應(yīng)的hash中的key
value:name對(duì)應(yīng)的hash中的value

hash以字典存儲(chǔ)

設(shè)置name[key]的值

hsetnx(name, key, value)

name:redis的name
key:name對(duì)應(yīng)的hash中的key
value:name對(duì)應(yīng)的hash中的value

name中不存在當(dāng)前key

設(shè)置key的值,存在則不修改

hget(name,key)

name:redis的name

key:name對(duì)應(yīng)的hash中的key

獲取neme中key的值
hkeys(name)name:redis的name獲取name對(duì)應(yīng)的hash中所有的key的名字
hvals(name)name:redis的name獲取name對(duì)應(yīng)的hash中所有的key的值
hmset(name,dict)

name:redis的name

dict:字典,如:{'k1':'v1', 'k2': 'v2'}

批量設(shè)置name的哈希值
hgetall(name)name:redis的name獲取name對(duì)應(yīng)hash的所有鍵值
hmget(name,*keys)

name:redis的name

*keys:['k1', 'k2']或'k1', 'k2'

一次獲取指定的多個(gè)key值
hdel(name,*keys)

name:redis的name

*keys:['k1', 'k2']或'k1', 'k2'

刪除name中的keys
hlen(name)name:獲取name中keys的個(gè)數(shù)
hexists(name,key)

name:

key:

檢查name的key是否存在
hdel(name,*keys)

name:

*keys:

刪除
hincrby(name,key,amount)

name:

key:

amount:默認(rèn)1,可指定。

自增name中key的值,不存在則創(chuàng)建新key

key=amount

hincrbyfloat(name,key,amount)

name:

key:

amount:默認(rèn)1.0,可指定其浮點(diǎn)數(shù)。

自增name中key的值,不存在則創(chuàng)建新key

key=amount

hscan(name,cursor,match,count)

name:

cursor:默認(rèn)0,指定游標(biāo)位置。從哪開(kāi)始查。

match:默認(rèn)None,匹配表達(dá)式。

count:默認(rèn)None

查找指定key

**增量式迭代獲取,對(duì)于數(shù)據(jù)大的數(shù)據(jù)非常有用,hscan可以實(shí)現(xiàn)分片的獲取數(shù)據(jù),并非一次性將數(shù)據(jù)全部獲取完,從而放置內(nèi)存被撐爆

從位置0開(kāi)始,查找info中的包含a的字段,并且只找前三個(gè)

hscan('info',0,'*a*',3)

hscan_iter(name,match,count)

name:

match:匹配指定key,默認(rèn)None 表示所有的key

count:每次分片最少獲取個(gè)數(shù),默認(rèn)None表示采用Redis的默認(rèn)分片個(gè)數(shù)

查找指定key,并返回迭代器,讀取時(shí)循環(huán)迭代器for item in r.hscan_iter('xx'):
print item
LIST操作
lpush(name,values)

name:表名

values:值。

1, 2, 3

向name表里存values,新的在左邊,先入后出
lrange(name,start,end)

name:

start:開(kāi)始位置

end:結(jié)束位置

取列表

取所有start=0,end=-1

rpush(name,values)

name:表名

values:值。

1, 2, 3

向name表里存values,新的在右邊,后入先出
rrange(name,start,end)
lpushx(name,values)

name:表名

values:值。

1, 2, 3

列表存在才存
llen(name)name:表名返回列表個(gè)數(shù)
linsert(name,where,refvalue,value)

name:表名

where:before或after

refvalue:標(biāo)桿值,在它的前或后插入

value:要插入的數(shù)據(jù)

在name表的某一個(gè)值前或后插入一個(gè)新值
lset(name,index,value)

name:表名

index:修改索引第幾個(gè)參數(shù),從0開(kāi)始

value:修改的值

修改
lrem(name,value,num)

name:表名

value:要?jiǎng)h除的值

num:0刪除表中所有的value指定值

        2 從前到后,刪除兩個(gè)

        -2 從后到前,刪除兩個(gè)

刪除
lpop(name)name:從左向右讀取一個(gè)值,并刪除
lrange(name,start,end)

name:

start:

end:

獲取name表分片數(shù)據(jù)
lindex(name,index)

name:

index:下標(biāo)

讀取指定下標(biāo)的值
ltrim(name,start,end)

name:

start:

end:

保留start到end之間的數(shù)據(jù),其它刪除
rpoplpush(src,dst)

src:

dst:

從src表的最右邊取出數(shù)據(jù)

存放到dst表的最左邊

blpop(keys,timeout)

keys:redis name的集合

timeout:默認(rèn)為0。超時(shí)時(shí)間,所有的元素取完以后,等待timeout秒,0為永遠(yuǎn)阻塞

從列表左邊取出并刪除redis name所有元素,并等待timeout秒

等待期間,其它用戶放入值,會(huì)繼續(xù)刪除

brpop(keys,timeout)

keys:

timeout

從列表右邊取出并刪除redis name所有元素,并等待timeout秒
brpoplpush(src,dst,timeout)

src:

dst:

timeout:

從src列表右邊取出并刪除元素,存入dst列表的左邊。
SET操作
sadd(name,*values)

name:

values:

集合有去重特性,所以重復(fù)數(shù)據(jù)不能添加
smembers(name)name:
scard(name)name:獲取元素個(gè)數(shù)
sdiff(*keys)

*keys:多個(gè)redis 的name

 

獲取前者的差集,只顯示第一個(gè)集合中,其它集合沒(méi)有的元素sdiff("name1","name2")
sdiffstore(dst,*src)

dst:

*src:

將只存在src1集合里,不存在src2,src3等等的元素,存放到dst里。
sinter(*keys)*keys:多個(gè)redis 的name

交集,顯示幾個(gè)keys里都有的元素

sinterstore(dst,*src)

交集,把幾個(gè)src中都有的元素存到dst里
sunion(*keys)*keys:并集,把所有keys里的元素相加
sunionstore(dst,*src)

dst:

*src:

sismember(name,value)

name:

value:

查找name里面的value成員

有返回1,沒(méi)有返回0

smove(src,dst,value)

src:

dst:

value:

將value從src移動(dòng)到dst
spop(name)name:從集合的后面刪除元素,并返回值
srandmember(name,numbers)

name:

numbers:默認(rèn)1

隨機(jī)返回numbers個(gè)元素
srem(name,value)

name:

value:

刪除name里指定的value
sscan(name,index,match,count)

name:

index:

match:

count:

sscan_iter(name,match,count)

name:

match:

count:

有序集合
zadd(name,*args,**kwargs)

name:

*args:

**kwargs"

把權(quán)重和值放入name里面

數(shù)越小,值越在前

如查value和權(quán)重值已存在,修改權(quán)重為當(dāng)前權(quán)重

redis.zadd('my-key', 'name1', 1.1, 'name2', 2.2, name3=3.3, name4=4.4)
zcount(name,min,max)

name:

min:

max:

獲取min到max分?jǐn)?shù)的個(gè)數(shù)(包含min和max)
zcard(name)name:統(tǒng)計(jì)name里元素的個(gè)數(shù)
zrange(name,start,end,desc,withscores,score_cast_func)

name:

start:元素起始位置

end:

desc:默認(rèn)False,從小到大排序,True從大到小排序。

withscores:默認(rèn)False,只獲取元素的值。True獲取值和分?jǐn)?shù)。

score_cast_func:默認(rèn)float,可以對(duì)分?jǐn)?shù)進(jìn)行類型的轉(zhuǎn)換

取出name中,從start到end的元素

全?。? -1

 

應(yīng)用場(chǎng)景,可以保存成績(jī)。。。

zrevrange(name,start,end,withscores,score_cast_func)

name:

start:元素起始位置

end:

withscores:默認(rèn)False,只獲取元素的值。True獲取值和分?jǐn)?shù)。

score_cast_func:默認(rèn)float,可以對(duì)分?jǐn)?shù)進(jìn)行類型的轉(zhuǎn)換

獲取指定位置的值和分?jǐn)?shù),從大到小排序
zrangebyscore(name,min,max,start,num,withscores,score_cast_func)

name:

min:

max:

start:默認(rèn)None

num:默認(rèn)None

withscores:默認(rèn)False,只獲取元素的值。True獲取值和分?jǐn)?shù)。

score_cast_func:默認(rèn)float,可以對(duì)分?jǐn)?shù)進(jìn)行類型的轉(zhuǎn)換

按照分?jǐn)?shù)范圍,從start(value)位置開(kāi)始,獲取name中的有序集合的元素,順序從小到大
zrevrangebyscore(name,min,max,start,num,withscores,score_cast_func)

name:

min:

max:

start:默認(rèn)None

num:默認(rèn)None

withscores:默認(rèn)False,只獲取元素的值。True獲取值和分?jǐn)?shù)。

score_cast_func:默認(rèn)float,可以對(duì)分?jǐn)?shù)進(jìn)行類型的轉(zhuǎn)換

從大到小排序。
zincrby(name,value,amount)

name:

value:

amount:默認(rèn)1

運(yùn)行一次,value的值增加amount指定的數(shù)值。
zrank(name,value)

name:

value:

獲取value在name中的index(從0開(kāi)始)

zrevrank(name,value)

name:

value:

獲取value在name中的index(從0開(kāi)始),

從大到小

zrangebylex(name,min,max,start,num)

name:

min:左區(qū)間,+表示正無(wú)限,-表示負(fù)無(wú)限,(表示開(kāi)區(qū)間,[表示閉區(qū)間。

max:右區(qū)間

start:默認(rèn)None,對(duì)結(jié)果進(jìn)行分片,從start開(kāi)始。

num:默認(rèn)None,對(duì)結(jié)果進(jìn)行分片,從start開(kāi)始顯示num個(gè)

當(dāng)有相同的分?jǐn)?shù)時(shí),對(duì)value進(jìn)行匹配。
zrem(name,value)

name:

value:

刪除集合中value的元素
zremrangebyrank(name,min,max)

name:

min:

max:

刪除排行(index)從min到max范圍的元素
zremrangebyscore(name,min,max)

name:

min:

max:

刪除分?jǐn)?shù)是min到max范圍的元素
zremrangebylex(name,min,max)

name:

min:

max:

刪除值是min到max范圍的元素
zscore(name,value)

name:

value:

獲取value的分?jǐn)?shù)
zinterstore(dest,keys,aggregate)

dest:

keys:

aggregage:默認(rèn)None,分?jǐn)?shù)按sum??梢詾閟um,min,max

keys的交集,存儲(chǔ)到dest,keys對(duì)應(yīng)的分?jǐn)?shù),按aggregage操作
zunionstore(dest,keys,aggregate)

dest:

keys:

aggregage:默認(rèn)None,可以為sum,min,max

并集,存儲(chǔ)到dest,
zscan(name,cursor,match,count,score_cast_func)

name

cursor:

match:

count:

score_case_func:默認(rèn)float,可以對(duì)分?jǐn)?shù)進(jìn)行類型的轉(zhuǎn)換

從cursor開(kāi)始查找符合match的元素,查找count個(gè)
zscan_iter(name,match,count,score_cast_func)

name:

match:

count:

score_cast_func:

從cursor開(kāi)始查找符合match的元素,查找count個(gè),返回迭代,需要循環(huán)讀取。

發(fā)布和訂閱:

redis自帶命令

PSUBSCRIBE pattern [pattern...]

訂閱一個(gè)或多個(gè)符合給定模式(條件)的頻道。

支持*通配符

PUNSUBSCRIBE [pattern[pattern...]]

退訂所有給定模式(條件)的頻道

支持*通配符

PUBSUB <subcommand>[argument[argument...]]查看訂閱與發(fā)布系統(tǒng)狀態(tài)
PUBLISH channel message將信息發(fā)送到指定的頻道。
SUBSCRIBE channel [channel...]訂閱給定的一個(gè)或多個(gè)頻道的信息。
UNSUBSCRIBE channel [channel...]命令用于退訂給定的一個(gè)或多個(gè)頻道的信息。
Python模塊命令
subscribe
publish

 事務(wù):

 事務(wù)開(kāi)始后,所有的操作必須提交,否則不保存到數(shù)據(jù)庫(kù)

MULTI事務(wù)開(kāi)始
EXEC事務(wù)結(jié)束

 

問(wèn)題:

1、1億在線用戶查詢:

    把數(shù)據(jù)庫(kù)里的自增ID寫(xiě)進(jìn)offset,在線則設(shè)置為1,下線清除掉。一個(gè)用戶狀態(tài)只占一個(gè)二進(jìn)制位。

    setbit(n5,1,1)

    setbit(n5,2,1)

    ......

 

    統(tǒng)計(jì)用戶在線,使用bitcount(n5),就可以了。

 

    查看用戶是否在線,使用getbit(n5,999),返回0,不在線;返回1在線。

 

2,驗(yàn)證碼

我們經(jīng)常在登錄一些網(wǎng)站或是進(jìn)行付款等操作的時(shí)候,都會(huì)收到一些驗(yàn)證碼,并且說(shuō)10min后失效。

實(shí)際上就可以通過(guò)下面一條指令來(lái)實(shí)現(xiàn):

set phone_num code ex 600

用手機(jī)號(hào)作為key,驗(yàn)證碼作為值,超時(shí)6min。這樣當(dāng)你輸入好驗(yàn)證碼,提交的時(shí)候,后臺(tái)就可以了先get phone_num,再比較你的輸入和數(shù)據(jù)庫(kù)里面存的值,從而完成身份的驗(yàn)證。

 

3,session

早前,網(wǎng)站通過(guò)cookie來(lái)保存用戶的用戶名和密碼,之后出現(xiàn)了很多的安全隱患,因此就提出了session的機(jī)制。

用戶登陸成功之后,本地的cookie會(huì)保留一個(gè)較長(zhǎng)的隨機(jī)碼,而網(wǎng)站后的后臺(tái)則存儲(chǔ)了這個(gè)隨機(jī)碼和你的用戶id的對(duì)應(yīng)關(guān)系。在你第二次登錄的時(shí)候,cookie會(huì)傳輸?shù)胶笈_(tái),而后臺(tái)則根據(jù)你的隨機(jī)碼,獲取你的用戶信息,如果符合,則自動(dòng)登錄。這樣,即使網(wǎng)站上有不法分子獲取了你的cookie,也得不到你的任何信息,因?yàn)槟愕恼鎸?shí)的有用的信息都存儲(chǔ)在網(wǎng)站的后臺(tái)。

我們?cè)诘卿涏]箱的時(shí)候,通常都會(huì)有一個(gè)選項(xiàng),7天內(nèi)自動(dòng)登錄。這其實(shí)就是給后臺(tái)存的session設(shè)置了一個(gè)超時(shí)。聰明的你是不是已經(jīng)會(huì)自己實(shí)現(xiàn)了呢?

NX:(if Not eXist)只有鍵key不存在的時(shí)候才會(huì)設(shè)置key的值

XX:只有鍵key存在的時(shí)候才會(huì)設(shè)置key的值

NX通常用于實(shí)現(xiàn)鎖機(jī)制,XX的功能,小喵暫時(shí)木有頭緒。。。想到應(yīng)用場(chǎng)景的筒子們可以留言告訴小喵,小喵看到了一定會(huì)更新的。

 

 

系統(tǒng)下命令參考:

http://www.runoob.com/redis/redis-tutorial.html

https://www.cnblogs.com/idiotgroup/p/5455282.html

https://www.cnblogs.com/xtsec/p/7000404.html

新聞名稱:【python】redis模塊
網(wǎng)頁(yè)鏈接:http://bm7419.com/article40/jcssho.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、域名注冊(cè)、服務(wù)器托管網(wǎng)頁(yè)設(shè)計(jì)公司、App開(kāi)發(fā)、網(wǎng)站營(yíng)銷

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營(yíng)