python 操作 Redis


Redis 模塊基本介紹

參考

數據緩存系統:

  • mongodb:直接持久化,直接存儲在於硬盤的緩存系統(有疑問)
  • redis:半持久化,存儲於內存和硬盤
  • memcache:數據只能存儲在內存里的緩存系統

redis

redis是一個key-value存儲系統,支持的數據類型:

  • string
  • list
  • zet
  • szet(有序集合)
  • hash(哈希類型)

這些數據類型都支持:push/pop,add/remove及取交集、並集和差集。關鍵的是,這些操作都是原子性

redis-py 的 API

  • 連接方式和連接池
  • 操作:string操作、hash操作、list操作、set操作、sort set 操作
  • 管道(pipeline)的使用
  • 發布訂閱
    redis-py GitHub 鏈接

連接 redis

連接方式:redis 提供了2個類

  1. StrictRedis:實現了大部分官方的命令
  2. Redis:是 StrictRedis 的子類,用於向后兼容舊版的Redis

普通連接

import redis

redis_config = {
    "host": "192.168.189.100",
    "port": 6379
}
# redis連接對象
redis_conn = redis.Redis(**redis_config)

redis_conn.set("name","ping")
print redis_conn.get("name")

連接池

管理對一個 redis server 的所有連接,避免每次建立,釋放連接的開銷。默認,每個redis實例后悔維護一個自己的連接池,可以直接建立一個連接池,作為參數傳給redis,這樣可以實現多個redis實例共享一個連接池。

import redis

redis_config = {
    "host": "192.168.189.100",
    "port": 6379
}

redis_pool = redis.ConnectPool(**redis_config)
r = redis.Redis(connection_pool=redis_pool)
r.set('name','qiang')
print r.get('name')

redis 字符串操作

redis中的String在在內存中按照一個name對應一個value來存儲

set() 參數:
set(name, value, ex=None, px=None, nx=False, xx=False)
ex,過期時間(秒)
px,過期時間(毫秒)
nx,如果設置為True,則只有name不存在時,當前set操作才執行,同setnx(name, value)
xx,如果設置為True,則只有name存在時,當前set操作才執行

單次設置key-value

import redis

redis_config = {
    "host": "192.168.189.100",
    "port": 6379
}

# 新建一個連接池
redis_pool = redis.ConnectionPool(**redis_config)
# 新建一個 Redis 連接對象
r = redis.Redis(connection_pool=redis_pool)
# 在 Redis 中設置值,若不存在則新建,存在則替換
r.set("name","ping")

print r.get("name")

批量設置key-value

import redis

redis_config = {
    "host": "192.168.189.100",
    "port": 6379
}

# 新建一個連接池
redis_pool = redis.ConnectionPool(**redis_config)
# 新建一個 Redis 連接對象
r = redis.Redis(connection_pool=redis_pool)
# 在 Redis 中設置值,若不存在則新建,存在則替換

k_v_pair = {
    "alpha": "a",
    "bete": "b",
    "gamma": "c"
}
# 批量設置值
r.mset(**k_v_pair)

# 批量取值
print r.mget("alpha", "bete", "gamma")

redis list操作

redis中的List在內存中按照一個name對應一個list來存儲

lpush(name,values)

#在 name 對應的list中添加元素,每個新的元素都添加到列表的最左邊
r.lpush("list1","alpha")
r.lpush("list1",3,4,5)
# 查看列表結果
print r.lrange("list1",0,-1)
# 結果
['5', '4', '3', 'alpha']

rpush(name,values)

# 同lpush,但每個新的元素都添加到列表的最右邊

lpushx(name,value)

# 在name對應的list中添加元素,只有name已經存在時,值添加到列表的最左邊,否則為空

rpushx(name,value)

# 在name對應的list中添加元素,只有name已經存在時,值添加到列表的最右邊,否則為空

llen(name)

# name 對應的list元素的個數
print r.llen("list1")

linsert(name,where,refvalue,value)
參數對應:
name: redis的name
where: BEFORE(前)或AFTER(后)
refvalue: 列表內的值
value: 要插入的數據

# 在name對應的列表的某一個值前或后插入一個新值
r.linsert("list1","BEFORE","alpha","bete")  #在列表內找到第一個元素alpha,在其之前插入 beta

lset(name,index,value)

# 對list中的某一個索引位置重新賦值,替換掉以前的元素
r.lset("list1",0,"beta")

r.lrem(name,value,num)
參數對應:
name: redis的name
value: 要刪除的值
num: num=0 刪除列表中所有的指定值;
num=2 從前到后,刪除2個;
num=-2 從后向前,刪除2個

# 刪除name對應的list中的指定值
r.lrem("list1","beta",num=1)

r.lpop(name)

# 移除列表的左側第一個元素,並返回,相當於出桟
print r.lpop("list1")

r.lindex(name,index)

# 根據索引獲取列表內元素
print r.lindex("list1",1)

lrange(name,start,end)

# 分片獲取元素,如獲取整個list
print r.lrange("list1",0,-1)

ltrim(name,start,end)

# 移除列表內沒有在該索引之內的值
r.ltrim("list1",0,2)

rpoplpush(src,dst)

# 從一個列表取出最右邊的元素,同時將其添加到另一個列表的最左邊
# src 要取數據的列表
# dst 要添加數據的列表

brpoplpush(src,dst,timeout=0)

# 同rpoplpush,多了timeout
# timeout:取數據的列表沒元素后的阻塞時間,0為一直阻塞
r.brpoplpush("list1","list2",timeout=0)

blpop(keys,timeout)

# 將多個列表排序,按照從左到右去移除各個列表內的元素
r.lpush("list1",3,4,5)
r.lpush("list2",3,4,5)

while True:
    print r.blpop(["list1","list2"],timeout=0)
    print r.lrange("list1",0,-1),r.lrange("name",0,-1)

#結果如下:
('list1', '5')
['4', '3'] ['5', '4', '3']
('list1', '4')
['3'] ['5', '4', '3']
('list1', '3')
[] ['5', '4', '3']
('list2', '5')
[] ['4', '3']
('list2', '4')
[] ['3']
('list2', '3')
[] []

brpop(keys,timeout)

# 同 blpop,將多個列表排序,按照從右往左移除各個列表內的元素

redis set操作

set集合就是不重復的列表

sadd(name,values)

# 給name對應的集合中添加元素
r.sadd("set1","aa")
r.sadd("set2","aa",1,2,"bb")

smembers(name)

# 獲取name對應的集合的所有成員

scard(name)

# 獲取name對應的集合中的元素個數
r.scard("set1")

有序集合

在集合的基礎上,為每個元素排序,元素的排序需要根據另外一個值來進行比較,所以,對於有序集合,每一個元素有兩個值,即:值和分數,分數專門用開做排序。

zadd(name,*args,**kwargs)

# 在name對應的有序集合中添加元素
r.zadd("set1","a",1,"b",2,"c",3)
# 或者
r.zadd("set1",b1=10,b2=5)

zcard(name)

# 獲取有序集合內元素的數量

zcount(name,min,max)

# 獲取有序集合中分數在[min,max]之間的個數
print r.zcount("set1",1,5)

Redis Hash操作

hashRedis2.0后增加的一種數據類型,類似大多數編程語言中的map數據結構一樣,Redis是鍵值對的集合,也就是說它存放的是字符串和字符串之間的映射。由於這個特性,hash特別適用於存儲一個對象。講一個對象存儲在hash中會占用更少的內存,並且可以方便的存取整個對象。

hset命令

hset 命令用來就愛那個某個hash指定鍵的值,如果間不存在,則創建並設置對應的值,返回一個整數1,如果鍵已經存在,則對應的值將被覆蓋並返回整數0.具體格式為:

hset hash_name field value

#示例:

127.0.0.1:6379> hset myhash name fred
(integer) 1
127.0.0.1:6379> hset myhash name fred2
(integer) 0

** hmset 命令**

hmset命令和hset命令的作用相似,可以用來設置hash的鍵和值。不同的是hmset可以同時設置多個鍵值對,操作成功后hmset命令返回一個簡單的字符串'ok'.具體格式如下:

hmset hash_name field1 value1 field2 value2...

#示例
127.0.0.1:6379> hmset myhash name fred age 24
OK
127.0.0.1:6379> hget myhash name
"fred"
127.0.0.1:6379> hget myhash age
"24"

hsetnx 命令

hsetnx 命令也用來在指定鍵不存在的情況下設置鍵值信息。如果鍵不存在,則Redis會先創建鍵,然后設置對應的值,操作成功后返回整數1。如果該鍵已經存在,則該命令不進行任何操作,返回值為0.具體格式如下:

hsetnx hash_name field value

#示例
127.0.0.1:6379> hsetnx myhsh address hangzhou
(integer) 1
127.0.0.1:6379> hsetnx myhsh address guangzhou
(integer) 0
127.0.0.1:6379> hget myhsh address
"hangzhou"

hget命令

hget 命令用開獲取某個hash指定key的值。如果該鍵存在,直接返回對應的值,否則返回nil。具體格式如下:

hget hash_name field

#示例
127.0.0.1:6379> hset myhash name fred
(integer) 0
127.0.0.1:6379> hget myhash name
"fred"
127.0.0.1:6379> hget myhash nonkey
(nil)

hmget命令

hmget命令和hget命令類似,用來返回某個hash多個鍵的值的列表,對於不存在的鍵,返回nil值。具體格式如下:

hmget hash_name field1 field2...

#示例
127.0.0.1:6379> hmset myhash name fred age 24
OK
127.0.0.1:6379> hmget myhash name age weight
1) "fred"
2) "24"
3) (nil)

hexists命令

hexists命令令用來判斷某個hash指定鍵是否存在,若存在返回整數1,否則返回0。具體格式如下:

hexists hash_name field

#示例
127.0.0.1:6379> hset myhash name fred
(integer) 0
127.0.0.1:6379> hexists myhash name
(integer) 1
127.0.0.1:6379> hexists myhash home
(integer) 0

hlen命令

hlen命令用來返回某個hash中所有鍵的數量。具體格式如下:

hlen hash_name

#示例:
127.0.0.1:6379> hmset myhash name fred age 24
OK
127.0.0.1:6379> hlen myhash
(integer) 2
127.0.0.1:6379> hlen nonhash
(integer) 0


hdel命令

hdel命令用來刪除某個hash指定的鍵,如果該鍵不存在,則不進行任何操作。hdel命令的返回值是成功刪除的鍵的數量(不包括不存在的鍵)。具體格式為:

hdel hash_name field:

#示例
127.0.0.1:6379> hmset myhash name fred age 24
OK
127.0.0.1:6379> hdel myhash name age
(integer) 2
127.0.0.1:6379> hmget myhash name age
1) (nil)
2) (nil)

hgetall命令

hgetall命令返回一個列表,該列表包含了某個hash的所有鍵和值。在返回值中,先是鍵,接下來的一個元素是對應的值,所以hgetall命令返回的列表長度是hash大小的兩倍。具體格式如下:

hgetall hash_name

#示例
127.0.0.1:6379> hmset myhash name fred age 24
OK
127.0.0.1:6379> hgetall myhash
1) "name"
2) "fred"
3) "age"
4) "24"

其他操作

在redis客戶端中執行

# 根據name刪除redis中的任意數據類型
delete(*name)

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

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

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

# 重命名
rename(src,dst)

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

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

# 獲取name對應值的類型
type(name)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM