實戰(zhàn)|教你用Python玩轉(zhuǎn)Redis

今天就來給大家講解一下Python如何使用Redis,并進行相關(guān)的實戰(zhàn)操作。

提示本文講解了Redis常用的方法,推薦收藏。

01

Redis的安裝

window版Redis安裝包下載地址:

https://github.com/MicrosoftArchive/redis/releases

image

Linux版Redis安裝包下載地址:

https://redis.io/download

image

上面兩張圖顯示的都是截止到目前,Redis最新版本,辰哥已經(jīng)把這上面提到的安裝包下載好,后臺回復(fù):redis安裝包,直接獲取。

image

提示這里就不在展示如何安裝,基本都是下一步的操作。因為安裝包可能有的讀者不知道在哪下載,這里就講一下。下面開始具體的實際操作。

02

Redis簡介

Redis是一個key-value存儲系統(tǒng)(數(shù)據(jù)庫)。redis支持存儲的value類型有很多種,如string(字符串)、list(鏈表)、set(集合)、zset(有序集合)和hash(哈希類型)。

為了保證效率,數(shù)據(jù)都是緩存在內(nèi)存中??梢灾芷谛缘陌迅碌臄?shù)據(jù)寫入磁盤或者把修改操作寫入追加文件。Redis提供了Python,Ruby,Java,Php的客戶端,使用很方便,本文主要以Python來講解Redis的操作。

1.安裝redis庫

通過下面命令進行安裝

pip install redis

redis庫:Python3鏈接redis

2.python連接redis

python連接redis分兩種情況(一種是有密碼,一種是無密碼

因為redis安裝的時候,默認是無密碼的

有密碼:

import redis

r = redis.Redis(host="192.168.31.196", port=6379,password="123456")

密碼是:123456,host是redis對應(yīng)的主機ip,port是端口6379(redis默認端口)

無密碼:

import redis

r = redis.Redis(host='192.168.31.196', port=6379)

上面的連接方式屬于普通連接相對于連接池來說),此外還有連接池(connection pool)的連接方式,可以管理所有的連接,避免每次建立、釋放連接帶來的開銷。

連接池:

import redispool = redis.ConnectionPool(host='192.168.31.196', port=6379)r = redis.Redis(connection_pool=pool)

先看一個例子

import redisr = redis.Redis(host='192.168.31.196', port=6379)r.set('name1', 'chenge')   #添加r.set('name2', '辰哥')   #添加print(r.get('name1'))   #獲取print(r.get('name2'))   #獲取

在通過Python代碼連接redis,并設(shè)置了兩個key-value(name1:chenge 和 name2:辰哥

image

可以看到這里英文正常顯示,中文亂碼,為了解決中文亂碼問題,在連接Redis的時候,加入utf-8的編碼格式

import redisr = redis.Redis(host='192.168.31.196', port=6379,decode_responses=True, charset='UTF-8', encoding='UTF-8')r.set('name1', 'chenge')   #添加r.set('name2', '辰哥')   #添加print(r.get('name1'))   #獲取print(r.get('name2'))   #獲取

這樣就可以正常顯示中文了

image

ok,連接好Redis之后,下面開始講解Redis的各種操作。Redis存儲結(jié)構(gòu)是key-value,不同的是value類型的不同,所以這里就對不同的類型進行詳細介紹。

03

string操作

1.set

r.set('name1', 'chenge')   #添加

在Redis中設(shè)置值,默認不存在就創(chuàng)建,存在就修改

此外set設(shè)置的時候還可以加入過期時間(類似cookie有效期這樣),一旦過期之后,再通過key去取value時,value的結(jié)果為None。

image

還可以這樣設(shè)置

#設(shè)置過期時間(秒),這里是5秒過期r.setex('key1',5,'value1')#設(shè)置過期時間(毫秒),這里是1000耗秒過期r.psetex("key2",1000,"value2")

2.mset

set是設(shè)置單個key-value,mset可以批量設(shè)置多個key-value

# 批量設(shè)置值r.mset({'key3':'value3', 'key4':'value4'})print(r.get('key3'))print(r.get('key4'))
image

3.mget

get可以取出單個value,mget可以批量取出多個value

# 批量獲取-法一print(r.mget("key3","key4"))# 批量獲取-法二v_list=["key3","key4"]print(r.mget(v_list))
image

4.getrange

getrange(key, start, end),根據(jù)start和end去截取序列(取出的value)

print(r.getrange("key3",0,3)) # 輸出:valu

5.append

append(key, value),在key對應(yīng)的值后面追加內(nèi)容

print(r.get("key3"))    #輸出:'value3r.append("key3","chenge")print(r.get("key3"))    #輸出:value3chenge

6.strlen

strlen(key),返回key對應(yīng)值的字節(jié)長度(一個漢字3個字節(jié)

r.set("key5","辰哥")print(r.strlen("key5")) # 輸出:6r.set("key6","chenge")print(r.strlen("key6")) # 輸出:6

以上這6個方法是string字符串中常用的,此外還有一些方法(不常用),辰哥就不一一介紹,需要用到的時候可以去redis官方文檔學(xué)習(xí)。

04

List操作

Redis中的List在內(nèi)存中按照一個key對應(yīng)一個List來存儲

1.lpush和rpush

lpush(key,values),每個新元素都添加到列表最左邊

rpush(key,values),每個新元素都添加到列表最右邊

r.lpush("key7",1)r.lpush("key7",2,3,4)#保存在列表中的順序為4,3,2,1r.rpush("key8",1)r.rpush("key8",2,3,4)#保存在列表中的順序為1,2,3,4

2.lpushx和rpushx

lpushx(key,value),添加元素時,只有key存在,value添加到列表最左邊

rpushx(key,value),添加元素時,只有key存在,value添加到列表最右邊

3.llen

llen(key),返回key對應(yīng)的list元素的個數(shù)

r.lpush("key9",2,3,4) # 輸出:3

4.linsert

linsert(key, where, refvalue, value)),在name對應(yīng)的列表的某一個值前或后插入一個新值。

image
r.linsert("key9","BEFORE","2","chenge")#在列表內(nèi)找到第一個元素2,在它前面插入chenge# 輸出:chenge,2,3,4

5.lset

r.lset(key, index, value),對list中的某一個索引位置重新賦值

r.lset("key9",0,"辰哥")

6.lpop

lpop(name),移除列表的左側(cè)第一個元素,返回值則是第一個元素

print(r.lpop("key9"))

7.lindex

lindex(name, index),根據(jù)索引獲取列表內(nèi)元素,比如返回第一個元素

print(r.lindex("key9",1))

8.lrange

lrange(name, start, end), 分片獲取元素

print(r.lrange("key9", 0, -1)) #輸出全部內(nèi)容

# 輸出:['4', '3', '2']

9.ltrim

ltrim(name, start, end),移除列表內(nèi)沒有在該索引之內(nèi)的值

r.ltrim("key9", 0, 2)

05

Hash操作

Redis中的hash在內(nèi)存中類似一個key對應(yīng)一個dict來存儲

1.hset和hget

hset(name, key, value),name對應(yīng)的hash中設(shè)置一個鍵值對(不存在,則創(chuàng)建,否則,修改)

hget(name,key),在name對應(yīng)的hash中根據(jù)key獲取value

r.hset("key10","a1","a2")#在key10對應(yīng)的hash中根據(jù)key獲取valueprint(r.hget("key10","a1"))#輸出:a2

2.hgetall、hmset和hmget

hgetall(name),獲取name對應(yīng)hash的所有鍵值

print(r.hgetall("key10")) # 輸出:{'a1': 'a2'}

hmset(name, mapping),在name對應(yīng)的hash中批量設(shè)置鍵值對

其中mapping:字典

dic = {"c1":"cc","d1":"dd"}r.hmset("key11",dic)print(r.hget("key11","c1")) #輸出:cc

hmget(name, keys, *args),在name對應(yīng)的hash中獲取多個key的值

k_list=["c1","d1"]print(r.hmget("key11",k_list))  # 輸出:['cc', 'dd']print(r.hmget("key11","c1","d1")) # 輸出:['cc', 'dd']

3.hlen、hkeys和hvals

hlen(name),獲取hash中鍵值對的個數(shù)

hkeys(name),獲取hash中所有的key的值

hvals(name),獲取hash中所有的value的值

print(r.hlen("key11")) #輸出:2print(r.hkeys("key11")) #輸出:['c1', 'd1']print(r.hvals("key11")) #輸出:['cc', 'dd']

4.hexists和hdel

hexists(name, key),檢查name對應(yīng)的hash是否存在當(dāng)前傳入的key

hdel(name,*keys),刪除指定name對應(yīng)的key所在的鍵值對

print(r.hexists("key11","c1"))#輸出:Trueprint(r.hexists("key11","c2"))#輸出:False#刪除指定key11對應(yīng)的c1所在的鍵值對r.hdel("key11","c1")print(r.hexists("key11","c1"))#輸出:False

06

Set操作

Set集合就是不允許重復(fù)的列表

1.sadd、smembers和scard

sadd(key,values),給key對應(yīng)的集合中添加元素

smembers(key),獲取key對應(yīng)的集合的所有成員

scard(key),獲取key對應(yīng)的集合中的元素個數(shù)

r.sadd("key12","a1")r.sadd("key12","a1","a1")print(r.smembers("key12")) #輸出:{'a1'}print(r.scard("key12")) #輸出:1

2.sdiff 和 sdiffstore

sdiff(keys, *args),在第一個key對應(yīng)的集合中且不在其他key對應(yīng)的集合的元素集合

r.sadd("key13","a1","a2","a4")r.sadd("key14","a2","a3")r.sadd("key15","a1","a2","a3")print(r.sdiff("key13","key14","key15"))#輸出:{'a4'}

sdiffstore(newkey, keys, *args),相當(dāng)于把sdiff獲取的值加入到newkey對應(yīng)的集合中

r.sdiffstore("key16","key13","key14","key15")print(r.smembers("key16")) #輸出:{'a4'}

3.sinter和 sinterstore

sinter(keys, *args),獲取多個key對應(yīng)集合的并集

r.sadd("key13","a1","a2","a4")r.sadd("key14","a2","a3")r.sadd("key15","a1","a2","a3")print(r.sinter("key13","key14","key15"))#輸出:{'a2'}

sinterstore(newkey, keys, *args),獲取多個key對應(yīng)集合的并集,再講其加入到newkey對應(yīng)的集合中

r.sinterstore("key17","key13","key14","key15")print(r.smembers("key17")) #輸出:{'a2'}

4.sismember、smove和 spop

sismember(name, value),檢查value是否是name對應(yīng)的集合內(nèi)的元素

r.sadd("key13", "a1", "a2", "a4")print(r.sismember("key13","a1")) # 輸出:Trueprint(r.sismember("key13","a5")) # 輸出:False

smove(src, dst, value),將某個元素從一個集合中移動到另外一個集合

r.sadd("key18", "a1", "a2", "a4")r.sadd("key19", "a5")r.smove("key18", "key19", "a2")print(r.smembers("key19")) #輸出:{'a2', 'a5'}

spop(name),從集合的右側(cè)移除一個元素,并將其返回

print(r.spop("key19")) #輸出:a5print(r.smembers("key19")) #輸出:{'a2'}

5.有序集合

此外還有有序集合操作:在集合的基礎(chǔ)上,為每一個元素排序。

zadd(name, mapping),其中name為有序集合名,mapping為dict類型的鍵-值對

zcard(name),獲取有序集合內(nèi)元素的數(shù)量

zcount(name, min, max),#獲取有序集合中分數(shù)在[min,max]之間的個數(shù)

r.zadd("key20", {"a": 10, "b": 3, "c": 8})print(r.zcard("key20")) #輸出:3print(r.zcount("key20", 2, 5)) #輸出:1print(r.zcount("key20", 7, 15)) #輸出:1

07

通用操作

以上是按不同類型的value進行對應(yīng)的操作,redis有一些無視類型的通用操作方法。(這里就只是列出方法并說明,就不再一一演示

delete(names)*,根據(jù)name刪除redis中的任意數(shù)據(jù)類型

exists(name),檢測redis的name是否存在

keys(pattern='')*,根據(jù)* ?等通配符匹配獲取redis的name

expire(name ,time),為某個name設(shè)置超時時間

rename(src, dst),重命名

move(name, db)),將redis的某個值移動到指定的db下

randomkey(),隨機獲取一個redis的name(不刪除)

type(name),獲取name對應(yīng)值的類型

08

小結(jié)

今天的技術(shù)講解文章就到此結(jié)束,主要是將了如何通過python去連接Redis,Redis的存儲結(jié)構(gòu)是key-value類型,本文按value類型分類講解了string字符串操作、list操作、hash操作、set操作以及通用操作。(干貨文章,推薦收藏

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容