標籤:取資料 exists dex ping rem 串連 redis命令 range redis
Redis 模組基本介紹
[toc]
參考
資料緩衝系統:
- 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 redisredis_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 redisredis_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 redisredis_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 redisredis_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)
# 分區擷取元素,如擷取整個listprint 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
特別適用於儲存一個對象。講一個Object Storage Service在hash
中會佔用更少的記憶體,並且可以方便的存取整個對象。
hset命令
hset 命令用來就愛那個某個hash指定鍵的值,如果間不存在,則建立並設定對應的值,返回一個整數1,如果鍵已經存在,則對應的值將被覆蓋並返回整數0.具體格式為:
hset hash_name field value#樣本:127.0.0.1:6379> hset myhash name fred(integer) 1127.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 24OK127.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) 1127.0.0.1:6379> hsetnx myhsh address guangzhou(integer) 0127.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) 0127.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 24OK127.0.0.1:6379> hmget myhash name age weight1) "fred"2) "24"3) (nil)
hexists命令
hexists命令令用來判斷某個hash指定鍵是否存在,若存在返回整數1,否則返回0。具體格式如下:
hexists hash_name field#樣本127.0.0.1:6379> hset myhash name fred(integer) 0127.0.0.1:6379> hexists myhash name(integer) 1127.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 24OK127.0.0.1:6379> hlen myhash(integer) 2127.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 24OK127.0.0.1:6379> hdel myhash name age(integer) 2127.0.0.1:6379> hmget myhash name age1) (nil)2) (nil)
hgetall命令
hgetall命令返回一個列表,該列表包含了某個hash的所有鍵和值。在傳回值中,先是鍵,接下來的一個元素是對應的值,所以hgetall命令返回的列表長度是hash大小的兩倍。具體格式如下:
hgetall hash_name#樣本127.0.0.1:6379> hmset myhash name fred age 24OK127.0.0.1:6379> hgetall myhash1) "name"2) "fred"3) "age"4) "24"
其他動作
在redis用戶端中執行
# 根據name刪除redis中的任意資料類型delete(*name)# 檢測redis的name是否存在exists(name)# 根據 *?等萬用字元匹配擷取redis的namekeys(pattern=‘*‘)# 為某個name設定逾時時間expire(name,time)# 重新命名rename(src,dst)# 將redis的某個值移動到指定的db下move(name,db)# 隨機擷取一個redis的name(不刪除)randomkey()# 擷取name對應值的類型type(name)
python 操作 Redis