以前辰哥已經給你們教了Python如何去鏈接Mysql(實戰|教你用Python玩轉Mysql),並進行相應操做(插、查、改、刪)。除了Mysql外,Python最常搭配的數據庫還有Redis。python
那麼今天辰哥就來給你們講解一下Python如何使用Redis,並進行相關的實戰操做。git
提示:本文講解了Redis經常使用的方法,推薦收藏。github
01redis
Redis的安裝sql
window版Redis安裝包下載地址:數據庫
https://github.com/MicrosoftArchive/redis/releases緩存
Linux版Redis安裝包下載地址:cookie
上面兩張圖顯示的都是截止到目前,Redis最新版本,辰哥已經把這上面提到的安裝包下載好,後臺回覆:redis安裝包,直接獲取。dom
提示:這裏就不在展現如何安裝,基本都是下一步的操做。由於安裝包可能有的讀者不知道在哪下載,這裏就講一下。下面開始具體的實際操做。
02
Redis簡介
Redis是一個key-value存儲系統(數據庫)。redis支持存儲的value類型有不少種,如string(字符串)、list(鏈表)、set(集合)、zset(有序集合)和hash(哈希類型)。
爲了保證效率,數據都是緩存在內存中。能夠週期性的把更新的數據寫入磁盤或者把修改操做寫入追加文件。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對應的主機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,並設置了兩個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存儲結構是key-value,不一樣的是value類型的不一樣,因此這裏就對不一樣的類型進行詳細介紹。
03
string操做
1.set
r.set('name1', 'chenge') #添加
在Redis中設置值,默認不存在就建立,存在就修改
此外set設置的時候還能夠加入過時時間(相似cookie有效期這樣),一旦過時以後,再經過key去取value時,value的結果爲None。
還能夠這樣設置
#設置過時時間(秒),這裏是5秒過時r.setex('key1',5,'value1')#設置過時時間(毫秒),這裏是1000耗秒過時r.psetex("key2",1000,"value2")
2.mset
set是設置單個key-value,mset能夠批量設置多個key-value
# 批量設置值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),根據start和end去截取序列(取出的value)
print(r.getrange("key3",0,3)) # 輸出:valu
5.append
append(key, value),在key對應的值後面追加內容
print(r.get("key3")) #輸出:'value3r.append("key3","chenge")print(r.get("key3")) #輸出:value3chenge
6.strlen
strlen(key),返回key對應值的字節長度(一個漢字3個字節)
r.set("key5","辰哥")print(r.strlen("key5")) # 輸出:6r.set("key6","chenge")print(r.strlen("key6")) # 輸出:6
以上這6個方法是string字符串中經常使用的,此外還有一些方法(不經常使用),辰哥就不一一介紹,須要用到的時候能夠去redis官方文檔學習。
04
List操做
Redis中的List在內存中按照一個key對應一個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對應的list元素的個數
r.lpush("key9",2,3,4) # 輸出:3
4.linsert
linsert(key, where, refvalue, value)),在name對應的列表的某一個值前或後插入一個新值。
r.linsert("key9","BEFORE","2","chenge")#在列表內找到第一個元素2,在它前面插入chenge# 輸出:chenge,2,3,4
5.lset
r.lset(key, index, value),對list中的某一個索引位置從新賦值
r.lset("key9",0,"辰哥")
6.lpop
lpop(name),移除列表的左側第一個元素,返回值則是第一個元素
print(r.lpop("key9"))
7.lindex
lindex(name, index),根據索引獲取列表內元素,好比返回第一個元素
print(r.lindex("key9",1))
8.lrange
lrange(name, start, end), 分片獲取元素
print(r.lrange("key9", 0, -1)) #輸出所有內容
# 輸出:['4', '3', '2']
9.ltrim
ltrim(name, start, end),移除列表內沒有在該索引以內的值
r.ltrim("key9", 0, 2)
05
Hash操做
Redis中的hash在內存中相似一個key對應一個dict來存儲
1.hset和hget
hset(name, key, value),name對應的hash中設置一個鍵值對(不存在,則建立,不然,修改)
hget(name,key),在name對應的hash中根據key獲取value
r.hset("key10","a1","a2")#在key10對應的hash中根據key獲取valueprint(r.hget("key10","a1"))#輸出:a2
2.hgetall、hmset和hmget
hgetall(name),獲取name對應hash的全部鍵值
print(r.hgetall("key10")) # 輸出:{'a1': 'a2'}
hmset(name, mapping),在name對應的hash中批量設置鍵值對
其中mapping:字典
dic = {"c1":"cc","d1":"dd"}r.hmset("key11",dic)print(r.hget("key11","c1")) #輸出:cc
hmget(name, keys, *args),在name對應的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中鍵值對的個數
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對應的hash是否存在當前傳入的key
hdel(name,*keys),刪除指定name對應的key所在的鍵值對
print(r.hexists("key11","c1"))#輸出:Trueprint(r.hexists("key11","c2"))#輸出:False#刪除指定key11對應的c1所在的鍵值對r.hdel("key11","c1")print(r.hexists("key11","c1"))#輸出:False
06
Set操做
Set集合就是不容許重複的列表
1.sadd、smembers和scard
sadd(key,values),給key對應的集合中添加元素
smembers(key),獲取key對應的集合的全部成員
scard(key),獲取key對應的集合中的元素個數
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對應的集合中且不在其餘key對應的集合的元素集合
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),至關於把sdiff獲取的值加入到newkey對應的集合中
r.sdiffstore("key16","key13","key14","key15")print(r.smembers("key16")) #輸出:{'a4'}
3.sinter和 sinterstore
sinter(keys, *args),獲取多個key對應集合的並集
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對應集合的並集,再講其加入到newkey對應的集合中
r.sinterstore("key17","key13","key14","key15")print(r.smembers("key17")) #輸出:{'a2'}
4.sismember、smove和 spop
sismember(name, value),檢查value是不是name對應的集合內的元素
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),從集合的右側移除一個元素,並將其返回
print(r.spop("key19")) #輸出:a5print(r.smembers("key19")) #輸出:{'a2'}
5.有序集合
此外還有有序集合操做:在集合的基礎上,爲每個元素排序。
zadd(name, mapping),其中name爲有序集合名,mapping爲dict類型的鍵-值對
zcard(name),獲取有序集合內元素的數量
zcount(name, min, max),#獲取有序集合中分數在[min,max]之間的個數
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進行對應的操做,redis有一些無視類型的通用操做方法。(這裏就只是列出方法並說明,就再也不一一演示)
delete(*names),根據name刪除redis中的任意數據類型
exists(name),檢測redis的name是否存在
keys(pattern='*'),根據* ?等通配符匹配獲取redis的name
expire(name ,time),爲某個name設置超時時間
rename(src, dst),重命名
move(name, db)),將redis的某個值移動到指定的db下
randomkey(),隨機獲取一個redis的name(不刪除)
type(name),獲取name對應值的類型
08
小結
今天的技術講解文章就到此結束,主要是將瞭如何經過python去鏈接Redis,Redis的存儲結構是key-value類型,本文按value類型分類講解了string字符串操做、list操做、hash操做、set操做以及通用操做。(乾貨文章,推薦收藏)