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個類
StrictRedis
:實現了大部分官方的命令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操作
hash
是Redis2.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)