redis
是業界主流的key-value
,nosql
數據庫之一。和Memcached相似,它支持存儲的value類型相對更多,包括string
(字符串)、list
(列表)、set
(集合)、zset
(sorted set --有序集合)和hash
(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操做,並且這些操做都是原子性的。在此基礎上,redis支持各類不一樣方式的排序。與memcached同樣,爲了保證效率,數據都是緩存在內存中。區別的是redis會週期性的把更新的數據寫入磁盤或者把修改操做寫入追加的記錄文件,而且在此基礎上實現了master-slave(主從)同步。python
Redis優勢redis
這裏以docker方式部署Redis,首先須要安裝Docker Engine,這裏就不演示怎麼安裝Docker Engine了,默認你們都安裝了Docker Engine。sql
1.拉取redis鏡像docker
$ docker pull redis:5.0.9
2.啓動redis數據庫
$ docker run -d --name myredis -p 6379:6379 redis:5.0.9 --requirepass "gs123456"
1.操做模式
redis-py
提供兩個類Redis
和StrictRedis
用於實現Redis的命令
,StrictRedis
用於實現大部分官方的命令,並使用官方的語法和命令,Redis是StrictRedis
的子類,用於向後兼容舊版本的redis-py
。
api
1.安裝redis模塊緩存
$ pip3.8 install redis
2.使用redis模塊bash
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實例共享一個鏈接池
。服務器
總之:當程序建立數據源實例時,系統會一次性建立多個數據庫鏈接,並把這些數據庫鏈接保存在鏈接池中,當程序須要進行數據庫訪問時,無需從新新建數據庫鏈接,而是從鏈接池中取出一個空閒的數據庫鏈接app
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"))
redis中的String
在內存中按照一個name對應一個value來存儲。如圖:
1.set語法:
# 在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用法:
r.set("name1","jack",ex=3600) r.set("name2","xander",xx=36000)
2.setnx語法:
# 設置值,只有name不存在時,執行設置操做(添加) setnx(name, value)
3.setex語法:
# 設置值,參數:time -->過時時間(數字秒 或 timedelta對象) setex(name, value, time)
4.psetex語法:
# 設置值,參數:time_ms,過時時間(數字毫秒 或 timedelta對象) psetex(name, time_ms, value)
5.mset語法:
# 批量設置值 mset(mapping)
mset用法:
data = { "k1":"v1", "k2":"v2", } r.mset(data)
6.get語法:
# 根據key獲取值 get(name)
get用法:
r.set("foo","xoo") ret = r.get("foo") print(ret) # b'xoo'
7.mset語法:
# 批量獲取值,根據多key獲取多個值
mset用法:
# 方法一 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語法:
# 設置新值並獲取原來的值 getset(name, value)
getset用法:
r.set("foo","xoo") ret = r.getset("foo","yoo") print(ret) # b'xoo'
9.append語法:
# key對應的值後面追加內容 append(key, value)
append用法:
r.set("name","jack") r.append("name","-m") ret = r.get("name") print(ret) # b'jack-m'
10.strlen語法:
# 返回字符串的長度,當name不存在時返回0 strlen(self, name)
strlen用法:
r.set("name","jack-") ret = r.strlen("name") print(ret) # 5