Python Redis經常使用操做(持續更新)

一、Redis簡介

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

  • 異常快速 : Redis是很是快的,每秒能夠執行大約110000設置操做,81000個/每秒的讀取操做。
  • 支持豐富的數據類型 : Redis支持最大多數開發人員已經知道如列表,集合,可排序集合,哈希等數據類型。
  • 這使得在應用中很容易解決的各類問題,由於咱們知道哪些問題處理使用哪一種數據類型更好解決。
  • 操做都是原子的 : 全部 Redis 的操做都是原子,從而確保當兩個客戶同時訪問 Redis 服務器獲得的是更新後的值(最新值)。
  • MultiUtility工具:Redis是一個多功能實用工具,能夠在不少如:緩存,消息傳遞隊列中使用(Redis原生支持發佈/訂閱),在應用程序中,如:Web應用程序會話,網站頁面點擊數等任何短暫的數據;

二、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"

三、Redis API應用

1.操做模式
redis-py提供兩個類RedisStrictRedis用於實現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"))

四、String操做

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
相關文章
相關標籤/搜索