今天就來給大家講解一下Python如何使用Redis,并進行相關(guān)的實戰(zhàn)操作。
提示:本文講解了Redis常用的方法,推薦收藏。
01
Redis的安裝
window版Redis安裝包下載地址:
https://github.com/MicrosoftArchive/redis/releases

Linux版Redis安裝包下載地址:

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

提示:這里就不在展示如何安裝,基本都是下一步的操作。因為安裝包可能有的讀者不知道在哪下載,這里就講一下。下面開始具體的實際操作。
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:辰哥)

可以看到這里英文正常顯示,中文亂碼,為了解決中文亂碼問題,在連接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')) #獲取
這樣就可以正常顯示中文了

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。

還可以這樣設(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'))

3.mget
get可以取出單個value,mget可以批量取出多個value
# 批量獲取-法一print(r.mget("key3","key4"))# 批量獲取-法二v_list=["key3","key4"]print(r.mget(v_list))

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)的列表的某一個值前或后插入一個新值。

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操作以及通用操作。(干貨文章,推薦收藏)