實戰|教你用Python玩轉Redis

以前辰哥已經給你們教了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

https://redis.io/downloadapp

上面兩張圖顯示的都是截止到目前,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操做以及通用操做。(乾貨文章,推薦收藏

相關文章
相關標籤/搜索