redis是一個很是重要的非關係型(No-Sql)數據庫,數據庫分兩種類型(關係型數據庫和非關係型數據庫),咱們以前學習的mysql數據庫是一種典型的關係型數據庫,而redis是一種典型的非關係型數據庫。python
redis再也不像mysql那樣按照一對多或者一對一的那種關係存儲,而是以key-value的形式建立結構,它沒有表和字段一說,只有key-value,簡單,直接,易操做。mysql
redis對比memcache數據庫(也是一種非關係型數據庫)的共同點:git
- 將數據緩存到內存中;github
- 屬於key-value結構;redis
不一樣點:sql
- redis能夠作持久化(即將數據保存到磁盤上,相比mencache更安全);數據庫
- redis支持更豐富的數據類型,value能夠是字符串、鏈表、哈希,集合,而mencache的value只能是字符串;緩存
一、redis下載並安裝安全
本文如下載Redis-x64-3.2.100.msi爲例,下載地址>>>服務器
下載地址:https://github.com/MicrosoftArchive/redis/releases
二、安裝完成後啓動服務器(端口號6379)
redis-server.exe是服務端,雙擊便可運行服務端
redis-cli.exe是客戶端,雙擊以下圖
三、使用
一、下載redis
1
|
pip install redis
|
二、使用
1)鏈接方式一
import redis # 默認鏈接本機的6379,因此下面括號中的能夠不寫 # 參數decode_responses=True表示解碼,默認爲false r = redis.Redis(host='127.0.0.1', port=6379, decode_responses=True) r.set('age', '22') print(r.get('age')) # b'22' 注意:存的是字節
2)鏈接方式二(鏈接池的方式,客戶端可使用鏈接池中的,避免鏈接開銷)
import redis pool = redis.ConnectionPool(host='', port=6379, decode_responses=True) r = redis.Redis(connection_pool=pool) r.set('age', '22') print(r.get('age'))
三、redis的字符串(String)操做
redis中的String在內存中按照一個name對應一個value來存儲。如圖:
1)set(name, value, ex=None, px=None, nx=False, xx=False)
1
2
3
4
5
6
|
在Redis中設置值,默認,不存在則建立,存在則修改
參數:
ex,過時時間(秒)
px,過時時間(毫秒)
nx,若是設置爲
True
,則只有name不存在時,當前
set
操做才執行
xx,若是設置爲
True
,則只有name存在時,崗前
set
操做才執行
|
2)setnx(name, value)
1
|
設置值,只有name不存在時,執行設置操做(添加)
|
3)setex(name, value, time)
1
2
3
|
設置值
參數:
time,過時時間(數字秒 或 timedelta對象)
|
4)psetex(name, time_ms, value)
1
2
3
|
設置值
參數:
time_ms,過時時間(數字毫秒 或 timedelta對象)
|
5)mset(*args, **kwargs)
1
2
3
|
批量設置值
如:
mset(k1
=
'v1'
, k2
=
'v2'
) 或 mget({
'k1'
:
'v1'
,
'k2'
:
'v2'
})
|
6)get(name)
1
|
獲取值
|
7)mget(keys, *args)
1
2
3
|
批量獲取
如:
mget(
'ylr'
,
'wupeiqi'
) 或 r.mget([
'ylr'
,
'wupeiqi'
])
|
8)getset(name, value)
1
|
設置新值並獲取原來的值
|
9)getrange(key, start, end)
1
2
3
4
5
6
|
獲取子序列(根據字節獲取,非字符)
參數:
name,Redis 的 name
start,起始位置(字節)
end,結束位置(字節)
如:
"武沛齊"
,
0
-
3
表示
"武"
|
10)setrange(name, offset, value)
1
2
3
4
|
修改字符串內容,從指定字符串索引開始向後替換(新值太長時,則向後添加)
參數:
offset,字符串的索引,字節(一個漢字三個字節)
value,要設置的值
|
11)incr(self, name, amount=1)
1
2
3
4
5
|
自增 name對應的值,當name不存在時,則建立name=amount,不然,則自增。
參數:
name,Redis的name
amount,自增數(必須是整數)
注:同incrby
|
12)decr(self, name, amount=1)
1
2
3
4
|
自減 name對應的值,當name不存在時,則建立name=amount,不然,則自減。
參數:
name,Redis的name
amount,自減數(整數)
|
13)append(key, value)
1
2
3
4
|
在redis name對應的值後面追加內容
參數:
key, redis的name
value, 要追加的字符串
|
四、redis的哈希(Hash)操做
redis中Hash在內存中的存儲格式以下圖:
1)hset(name, key, value)
1
2
3
4
5
6
7
|
name對應的
hash
中設置一個鍵值對(不存在,則建立;不然,修改)
參數:
name,redis的name
key,name對應的
hash
中的key
value,name對應的
hash
中的value
注:
hsetnx(name, key, value),當name對應的
hash
中不存在當前key時則建立(至關於添加)
|
2)hmset(name, mapping)
1
2
3
4
5
6
|
在name對應的
hash
中批量設置鍵值對
參數:
name,redis的name
mapping,字典,如:{
'k1'
:
'v1'
,
'k2'
:
'v2'
}
如:
r.hmset(
'xx'
, {
'k1'
:
'v1'
,
'k2'
:
'v2'
})
|
3)hget(name,key)
1
|
在name對應的
hash
中獲取根據key獲取value
|
4)hmget(name, keys, *args)
1
2
3
4
5
6
7
8
9
|
在name對應的
hash
中獲取多個key的值
參數:
name,reids對應的name
keys,要獲取key集合,如:[
'k1'
,
'k2'
,
'k3'
]
*
args,要獲取的key,如:k1,k2,k3
如:
r.mget(
'xx'
, [
'k1'
,
'k2'
])
或
print
r.hmget(
'xx'
,
'k1'
,
'k2'
)
|
5)hgetall(name)
1
|
獲取name對應
hash
的全部鍵值
|
6)hlen(name)
1
|
獲取name對應的
hash
中鍵值對的個數
|
7)hkeys(name)
1
|
獲取name對應的
hash
中全部的key的值
|
8)hvals(name)
1
|
獲取name對應的
hash
中全部的value的值
|
9)hexists(name, key)
1
|
檢查name對應的
hash
是否存在當前傳入的key
|
10)hdel(name,*keys)
1
|
將name對應的
hash
中指定key的鍵值對刪除
|
11)hincrby(name, key, amount=1)
1
2
3
4
5
|
自增name對應的
hash
中的指定key的值,不存在則建立key
=
amount
參數:
name,redis中的name
key,
hash
對應的key
amount,自增數(整數)
|
五、redis的鏈式(List)操做
redis中的List在內存中按照一個name對應一個List來存儲。如圖:
1)lpush(name,values)
1
2
3
4
5
6
|
在name對應的
list
中添加元素,每一個新的元素都添加到列表的最左邊
如:
r.lpush(
'oo'
,
11
,
22
,
33
)
保存順序爲:
33
,
22
,
11
擴展:
rpush(name, values) 表示從右向左操做
|
2)lpushx(name,value)
1
2
3
|
在name對應的
list
中添加元素,只有name已經存在時,值添加到列表的最左邊
更多:
rpushx(name, value) 表示從右向左操做
|
3)llen(name)
1
|
name對應的
list
元素的個數
|
4)linsert(name, where, refvalue, value))
1
2
3
4
5
6
|
在name對應的列表的某一個值前或後插入一個新值
參數:
name,redis的name
where,BEFORE或AFTER
refvalue,標杆值,即:在它先後插入數據
value,要插入的數據
|
5)r.lset(name, index, value)
1
2
3
4
5
|
對name對應的
list
中的某一個索引位置從新賦值
參數:
name,redis的name
index,
list
的索引位置
value,要設置的值
|
6)r.lrem(name, value, num)
1
2
3
4
5
6
7
8
|
在name對應的
list
中刪除指定的值
參數:
name,redis的name
value,要刪除的值
num, num
=
0
,刪除列表中全部的指定值;
num
=
2
,從前到後,刪除
2
個;
num
=
-
2
,從後向前,刪除
2
個;
|
7)lpop(name)
1
2
3
|
在name對應的列表的左側獲取第一個元素並在列表中移除,返回值則是第一個元素
更多:
rpop(name) 表示從右向左操做
|
8)lindex(name, index)
1
|
在name對應的列表中根據索引獲取列表元素
|
9)lrange(name, start, end)
1
2
3
4
5
|
在name對應的列表分片獲取數據
參數:
name,redis的name
start,索引的起始位置
end,索引結束位置
|
10)ltrim(name, start, end)
1
2
3
4
5
|
在name對應的列表中移除沒有在start
-
end索引之間的值
參數:
name,redis的name
start,索引的起始位置
end,索引結束位置
|
11)rpoplpush(src, dst)
1
2
3
4
|
從一個列表取出最右邊的元素,同時將其添加至另外一個列表的最左邊
參數:
src,要取數據的列表的name
dst,要添加數據的列表的name
|
12)blpop(keys, timeout)
1
2
3
4
5
|
將多個列表排列,按照從左到右去pop對應列表的元素
參數:
keys,redis的name的集合
timeout,超時時間,當元素全部列表的元素獲取完以後,阻塞等待列表內有數據的時間(秒),
0
表示永遠阻塞更多:
r.brpop(keys, timeout),從右向左獲取數據
|
13)brpoplpush(src, dst, timeout=0)
1
2
3
4
5
|
從一個列表的右側移除一個元素並將其添加到另外一個列表的左側
參數:
src,取出並要移除元素的列表對應的name
dst,要插入元素的列表對應的name
timeout,當src對應的列表中沒有數據時,阻塞等待其有數據的超時時間(秒),
0
表示永遠阻塞
|
六、redis的集合(Set)操做
Set集合就是不容許重複的列表
1)sadd(name,values)
1
|
name對應的集合中添加元素
|
2)scard(name)
1
|
獲取name對應的集合中元素個數
|
3)sdiff(keys, *args)
1
|
在第一個name對應的集合中且不在其餘name對應的集合的元素集合
|
4)sdiffstore(dest, keys, *args)
1
|
獲取第一個name對應的集合中且不在其餘name對應的集合,再將其新加入到dest對應的集合中
|
5)sinter(keys, *args)
1
|
獲取多一個name對應集合的並集
|
6)sinterstore(dest, keys, *args)
1
|
獲取多一個name對應集合的並集,再講其加入到dest對應的集合中
|
7)sismember(name, value)
1
|
檢查value是不是name對應的集合的成員
|
8)smembers(name)
1
|
獲取name對應的集合的全部成員
|
有序集合,在集合的基礎上,爲每元素排序;元素的排序須要根據另一個值來進行比較,因此,對於有序集合,每個元素有兩個值,即:值和分數,分數專門用來作排序
1)zadd(name, *args, **kwargs)
1
2
3
4
5
|
在name對應的有序集合中添加元素
如:
zadd(
'zz'
,
'n1'
,
1
,
'n2'
,
2
)
或
zadd(
'zz'
, n1
=
11
, n2
=
22
)
|
2)zcard(name)
1
|
獲取name對應的有序集合元素的數量
|
3)zcount(name, min, max)
1
|
獲取name對應的有序集合中分數 在 [
min
,
max
] 之間的個數
|
4)zincrby(name, value, amount)
1
|
自增name對應的有序集合的 name 對應的分數
|
5)zrank(name, value)
1
2
3
|
獲取某個值在 name對應的有序集合中的排行(從
0
開始)
更多:
zrevrank(name, value),從大到小排序
|
6)zrem(name, values)
1
2
|
刪除name對應的有序集合中值是values的成員
如:zrem(
'zz'
, [
's1'
,
's2'
])
|
七、其餘經常使用操做
1)delete(*names)
1
|
根據刪除redis中的任意數據類型
|
2)exists(name)
1
|
檢測redis的name是否存在
|
3)keys(pattern='*')
1
2
3
4
5
6
|
根據模型獲取redis的name
更多:
KEYS
*
匹配數據庫中全部 key 。
KEYS h?llo 匹配 hello , hallo 和 hxllo 等。
KEYS h
*
llo 匹配 hllo 和 heeeeello 等。
KEYS h[ae]llo 匹配 hello 和 hallo ,但不匹配 hillo
|
4)expire(name ,time)
1
|
爲某個redis的某個name設置超時時間
|
5)rename(src, dst)
1
|
對redis的name重命名爲
|
6)move(name, db))
1
|
將redis的某個值移動到指定的db下
|
7)randomkey()
1
|
隨機獲取一個redis的name(不刪除)
|
8)type(name)
1
|
獲取name對應值的類型
|