Python Redis常用操作(持續更新)
阿新 • • 發佈:2020-05-27
[TOC]
# 1、Redis簡介
`redis`是業界主流的`key-value`,`nosql`資料庫之一。和Memcached類似,它支援儲存的value型別相對更多,包括`string`(字串)、`list`(列表)、`set`(集合)、`zset`(sorted set --有序集合)和`hash`(雜湊型別)。這些資料型別都支援push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支援各種不同方式的排序。與memcached一樣,為了保證效率,資料都是快取在記憶體中。區別的是redis會週期性的把更新的資料寫入磁碟或者把修改操作寫入追加的記錄檔案,並且在此基礎上實現了master-slave(主從)同步。
**Redis優點**
* 異常快速 : Redis是非常快的,每秒可以執行大約110000設定操作,81000個/每秒的讀取操作。
* 支援豐富的資料型別 : Redis支援最大多數開發人員已經知道如列表,集合,可排序集合,雜湊等資料型別。
* 這使得在應用中很容易解決的各種問題,因為我們知道哪些問題處理使用哪種資料型別更好解決。
* 操作都是原子的 : 所有 Redis 的操作都是原子,從而確保當兩個客戶同時訪問 Redis 伺服器得到的是更新後的值(最新值)。
* MultiUtility工具:Redis是一個多功能實用工具,可以在很多如:快取,訊息傳遞佇列中使用(Redis原生支援釋出/訂閱),在應用程式中,如:Web應用程式會話,網站頁面點選數等任何短暫的資料;
# 2、Redis部署
這裡以docker方式部署Redis,首先需要安裝Docker Engine,這裡就不演示怎麼安裝Docker Engine了,預設大家都安裝了Docker Engine。
1.拉取redis映象
```bash
$ docker pull redis:5.0.9
```
2.啟動redis
```bash
$ docker run -d --name myredis -p 6379:6379 redis:5.0.9 --requirepass "gs123456"
```
# 3、Redis API應用
**1.操作模式**
`redis-py`提供兩個類`Redis`和`StrictRedis`用於實現`Redis的命令`,`StrictRedis`用於實現大部分官方的命令,並使用官方的語法和命令,Redis是`StrictRedis`的子類,用於向後相容舊版本的`redis-py`。
![](https://img2020.cnblogs.com/blog/1679739/202005/1679739-20200527003150937-445824186.png)
1.安裝redis模組
```bash
$ pip3.8 install redis
```
2.使用redis模組
```python
import redis
# 連線redis的ip地址/主機名,port,password=None
r = redis.Redis(host="127.0.0.1",port=6379,password="gs123456")
r.set("foo","Bar") # 設定key,格式:key[value]
print(r.get("foo")) # 獲取key,格式:get key
```
**2.連線池**
`redis-py`使用`connection pool`來管理對一個`redis server`的所有連線,避免每次建立、釋放連線的開銷。預設,每個`Redis例項`都會維護一個`自己的連線池`。可以直接建立一個連線池,然後作為引數Redis,這樣就可以實現`多個Redis例項共享一個連線池`。
總之:當程式建立資料來源例項時,系統會一次性建立多個數據庫連線,並把這些資料庫連線儲存在連線池中,當程式需要進行資料庫訪問時,無需重新新建資料庫連線,而是從連線池中取出一個空閒的資料庫連線
```python
import redis
# 建立連線池,將連線儲存在連線池中
pool = redis.ConnectionPool(host="127.0.0.1",port=6379,password="gs123456",max_connections=50)
# 建立一個redis例項,並使用連線池"pool"
r = redis.Redis(connection_pool=pool)
r.set("foo","Bar")
print(r.get("foo"))
```
# 4、String操作
redis中的`String`在記憶體中按照一個name對應一個value來儲存。如圖:
![](https://img2020.cnblogs.com/blog/1679739/202005/1679739-20200527003256316-786145699.png)
1.set語法:
```python
# 在Redis中設定值,預設,不存在則建立,存在則修改
set(name, value, ex=None, px=None, nx=False, xx=False, keepttl=False)
name:設定鍵
value:設定值
ex:設定過期時間(秒級)
px:設定過期時間(毫秒)
nx:如果設定為True,則只有name不存在時,當前set操作才執行,同setnx(name, value)
xx:如果設定為True,則只有name存在時,當前set操作才執行
```
set用法:
```python
r.set("name1","jack",ex=3600)
r.set("name2","xander",xx=36000)
```
2.setnx語法:
```python
# 設定值,只有name不存在時,執行設定操作(新增)
setnx(name, value)
```
3.setex語法:
```python
# 設定值,引數:time -->過期時間(數字秒 或 timedelta物件)
setex(name, value, time)
```
4.psetex語法:
```python
# 設定值,引數:time_ms,過期時間(數字毫秒 或 timedelta物件)
psetex(name, time_ms, value)
```
5.mset語法:
```python
# 批量設定值
mset(mapping)
```
mset用法:
```python
data = {
"k1":"v1",
"k2":"v2",
}
r.mset(data)
```
6.get語法:
```python
# 根據key獲取值
get(name)
```
get用法:
```python
r.set("foo","xoo")
ret = r.get("foo")
print(ret) # b'xoo'
```
7.mset語法:
```python
# 批量獲取值,根據多key獲取多個值
```
mset用法:
```python
# 方法一
ret = r.mget("k1","k2")
print(ret) # [b'v1', b'v2']
# 方法二
data = ["k1","k2"]
ret = r.mget(data)
print(ret) # [b'v1', b'v2']
# 方法三
data = ("k1","k2")
ret = r.mget(data)
print(ret) # [b'v1', b'v2']
```
8.getset語法:
```python
# 設定新值並獲取原來的值
getset(name, value)
```
getset用法:
```python
r.set("foo","xoo")
ret = r.getset("foo","yoo")
print(ret) # b'xoo'
```
9.append語法:
```python
# key對應的值後面追加內容
append(key, value)
```
append用法:
```python
r.set("name","jack")
r.append("name","-m")
ret = r.get("name")
print(ret) # b'jack-m'
```
10.strlen語法:
```python
# 返回字串的長度,當name不存在時返回0
strlen(self, name)
```
strlen用法:
```python
r.set("name","jack-")
ret = r.strlen("name")
print(ret)