程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Redis的基礎與django使用redis

編輯:Python

文章目錄

  • 一、Redis的簡介和安裝
    • 1.1 Redis簡介
    • 1.2 安裝Redis
    • 1.3 啟動和關閉 Redis-server
  • 二、python操作redis
    • 2.1 普通連接
    • 2.2 連接池
    • 2.3 redis庫的操作
  • 三、Redis基本操作
    • 3.1 redis 通用命令
    • 3.2 Key的操作
    • 3.3 Value的操作(常用類型)
      • 3.3.1 字符串(Strings)類型
      • 3.3.2 哈希(Hashes)類型
      • 3.3.3 鏈表(Lists)類型
      • 3.3.4 集合(Sets)類型
      • 3.4.5 有序集合(Sorted Sets)類型
  • 四、管道(Pipelining)
  • 五、在django中使用redis

一、Redis的簡介和安裝

1.1 Redis簡介

Redis是一個用c語言開發的非關系型(NoSQL)數據庫,它將數據以key-value的形式存儲在內存中,性能高並且開源、免費。

redis的應用場景:

  • 緩存系統;
  • 計數器:網站訪問量、轉發量、評論數……;
  • 消息隊列(發布訂閱,阻塞隊列);
  • 排行榜(有序集合);
  • 實時系統:垃圾郵件處理系統(布隆過濾器);
  • ……

redis的其他特點:

  • 支持數據持久化,可以將數據保存到磁盤中,實現永久存儲;
  • value支持多種數據類型:字符串Strings、鏈表Lists、集合Sets、有序集合Sorted Sets、哈希Hashes等等。
  • 支持主從模式,可以配置集群,能支撐起大型的項目。
  • ……

1.2 安裝Redis

  • Ubuntu 下安裝:

    在終端中執行:

    sudo add-apt-repository ppa:redislabs/redis
    sudo apt-get update
    sudo apt-get install redis
    
  • windows 下安裝:

    到官網下載安裝包,直接安裝即可。

  • 測試是否安裝成功:

    redis-cli ping
    # 輸出:PONG,則表示安裝成功
    

    這是redis官方提供的簡易redis客戶端,可以執行redis的各種命令,要退出,輸入:quit後回車。

    指定ip、端口和密碼:

     redis-cli -h host -p port -a password
    

1.3 啟動和關閉 Redis-server

三種啟動方式:

  • 默認啟動方式:

    redis-server
    
  • 指定參數啟動:

    redis-server --port 6380 # 指定端口為6380
    

    redis 的默認端口為6379。

  • 指定配置文件啟動:

    redis-server redis.conf # 文件需要自行創建,文件名隨意
    

    常用配置:

    # 是否以守護進程方式啟動
    daemonize yes
    # 端口號
    port 6379
    # ip地址,默認的 127.0.0.1 不支持遠程連接
    bind 0.0.0.0
    # 工作目錄
    dir "路徑"
    # 日志位置
    logfile "路徑"
    # 關閉保護模式
    protected-mode no
    # 設置密碼
    requirepass 123456
    # 最大內存使用量,默認為0,表示無限制
    maxmemory 128M
    

關閉 redis-server:

redis-cli shutdown

二、python操作redis

使用python操作redis,可以安裝一個第三方庫,名字就叫做redis。它提供了一些接口,能夠使我們更加方便的操作redis。

安裝:

pip install redis

2.1 普通連接

python操作redis,需要通過一個redis連接對象來進行:

import redis
# 創建連接對象
r = redis.Redis(host='localhost', port=6379, db=0)
# 執行具體操作
r.set('foo', 'bar') # 給key設置value
print(r.get('foo')) # 根據key獲取value
# 打印:b'bar'

默認情況下,Python 3中的所有響應都以字節的形式返回。默認的編碼是utf-8,但這可以通過指定redis的encoding參數來定制。

2.2 連接池

連接池是一種提高性能的技術手段,它提前創建好一些連接並保存在池中。當有請求時,就從連接池中直接取出一個連接,用完再放回去。這樣就免去了創建連接和銷毀連接的過程。

import redis
# 創建連接池
pool = redis.ConnectionPool(host='localhost', port=6379,
db=0, max_connections=1000)
# 從連接池獲取連接對象
r = redis.Redis(connection_pool=pool)
# 像普通連接一樣使用即可

max_connections指的是請求池中的最大連接數,默認是 2 31 2^{31} 231。

2.3 redis庫的操作

redis庫中的方法以及方法的參數與redis-cli的命令以及參數是一致的,方法名稱對應命令,方法參數對應命令參數。因此,學會了redis-cli的命令,就學會了redis庫的使用。

三、Redis基本操作

我們現在通過redis-cli 來學習一下redis的具體操作,它會提示參數,十分好用。

3.1 redis 通用命令

  • 通過 redis-cli 連接 redis-server:

    redis-cli [-p 端口 -h ip地址] # 默認連接本地地址和6379端口
    
  • 如果設置了密碼:

    redis-cli -a 密碼
    

    也可以先正常連接,進入客戶端後,輸入auth回車,再輸入密碼,完成驗證。

  • 退出 redis-cli:

    exit # 或quit
    
  • 查看服務器詳細信息 :

    info
    
  • 查看redis配置信息:

    config get *
    
  • 修改redis配置:

    config set requirepass 密碼
    
  • 將所做的修改保存到配置文件:

    config rewrite
    
  • 查看所有連接到服務器的客戶端信息:

    client list
    
  • 關閉客戶端連接:

    client kill ip:端口
    
  • 清空所有數據庫:

    flushall
    
  • 清空當前數據庫:

    flushdb
    
  • 選擇一個數據庫:

    select 數字
    

    redis默認有16個數據庫,編號0~15,默認的是第0個。

  • 實時監控服務器:

    monitor
    

    一般用於日志審計。

3.2 Key的操作

Redis的key是二進制安全的,這意味著我們可以使用任何二進制序列作為key,從像"foo"這樣的字符串到JPEG文件的內容,甚至是空字符串。key的大小最大允許 512 MB。

  • 刪除指定的key:

    DEL key1 key2 ...
    

    key被刪除,value也就不復存在。

  • 檢查指定的key是否存在:

    EXISTS key1 key2 ...
    

    存在幾個,就返回幾。

  • 查看數據庫中key的總數:

    DBSIZE
    
  • 給key設置過期時間:

    EXPIRE key 秒數
    

    到達指定秒數後,該key就會被刪除(key刪除則value跟著一起消失)。

  • 查看剩余有效期:

    TTL key
    
  • 去除過期限制:

    PERSIST key
    
  • 返回符合給定模式(pattern)的所有key:

    KEYS A* # 返回以A開頭的key
    KEYS * # 返回所有key
    
  • 查看key所存儲的value的數據結構類型:

    type key
    
  • 重命名key:

    RENAME OLD_KEY_NAME NEW_KEY_NAME
    
  • 移動key到指定數據庫:

    MOVE key db
    
  • 隨機返回一個key:

    RANDOMKEY
    

3.3 Value的操作(常用類型)

3.3.1 字符串(Strings)類型

string 是 redis 最基本的類型,它可以包含任何數據。比如jpg圖片或者序列化的對象,string 類型的值最大能存儲 512MB。

  • 為指定的key設置value:

    SET key value [EX 參數] [NX|XX]
    
    • EX:過期時間,單位為秒;
    • NX:僅當該key不存在時,設置該key;
    • XX:僅當該key存在時,設置該key;
  • 獲取指定key的value:

    GET key
    
  • 為多個key設置多個value:

    MSET key1 value1 key2 value2 ...
    
  • 獲取所有給定key的值:

    MGET key1 key2 ...
    
  • 給key設置一個新的value並返回舊的value:

    GETSET key value # 返回舊value
    
  • 給指定key的value切片,然後返回子字符串:

    GETRANGE key 起始索引 結束索引
    SET key1 hello,world
    GETRANGE key1 0 4 # 返回"hello"
    GETRANGE key1 -5 -1 # 返回"world"
    
  • 重寫指定位置後面的value值:

    SETRANGE key 起始位置 value
    SET key1 hello,world
    SETRANGE key1 4 ,redis
    GET key1 # 返回"hell,redis"
    
  • 將key的整數值增加1:

    INCR key
    

    key中的value不是整數或者字面值不是整數,則會報錯。

  • 將key的整數值減少1:

    DECR key
    
  • 在value後面追加內容:

    APPEND key 追加的內容
    

3.3.2 哈希(Hashes)類型

redis的哈希類型是一個==“字段-值(field-value)”的集合==,類似於python中的字典。

  • 設置key的內容:

    HSET key field1 value1 [field2 value2 ...]
    
  • 獲取key中指定字段的內容:

    HGET key field
    
  • 獲取key中多個字段的值:

    HMGET key field1 [field2 ...]
    
  • 刪除一個或多個字段:

    HDEL key field1 [field2 ...]
    
  • 查看key中,指定字段是否存在:

    HEXIETS key field
    
  • 獲取指定key的所有字段和值(慎用):

    HGETALL key
    
  • 迭代獲取key中的所有字段和值(建議以此替代HGETALL):

    HSCAN key cursor # 開始一次迭代時,cursor傳入0
    

    返回值除了字段和值外,還有本次迭代後的游標(cursor)位置,我們需要在下一次調用中使用它作為游標參數。

    而在開始一次全新的迭代時,游標的值應該傳入0;

  • 獲取指定key中的所有字段:

    HKEYS key
    
  • 獲取指定key中的所有值:

    HVALS key
    
  • 獲取字段的數量:

    HLEN key
    
  • 讓字段的整數值加上一個增量:

    HINCRBY key field 增量
    

    這個增量可以是負數,以此實現減少的效果。

3.3.3 鏈表(Lists)類型

Redis鏈表是根據插入順序排序的字符串元素集合,它們是基於鏈表數據結構實現的。

  • 在鏈表前面(左面)添加一個或多個元素:

    LPUSH key element1 [element2 ...]
    
  • 在鏈表後面(右面)添加一個或多個元素:

    RPUSH key element1 [element2 ...]
    
  • 獲取鏈表長度:

    LLEN key
    
  • 將元素插入鏈表的指定元素之前或之後:

    LINSERT key BEFORE|AFTER 指定元素 要插入的元素
    
  • 在指定位置放入元素:

    LSET key 索引 element
    

    新的元素會覆蓋原來的元素。

  • 從鏈表移除元素:

    LREM key count element
    
    • count > 0:表示從左往右移除count個與指定元素相等的元素;

    • count < 0:表示從右往左移除count個與指定元素相等的元素;

    • count = 0:表示移除所有與指定元素相等的元素;

  • 移除並返回鏈表中的第一個或前幾個元素:

    LPOP key [count]
    
  • 移除並返回鏈表中的最後一個或後幾個元素:

    RPOP key [count]
    
  • 根據索引獲取指定元素:

    LINDEX key index
    
  • 刪除並返回鏈表中的第一個元素,沒有可用的元素就阻塞,直到有可用的元素:

    BLPOP key [key ...] timeout
    

    timeout指阻塞的最大秒數,是一個雙精度值,設置為0表示無時間限制。

3.3.4 集合(Sets)類型

Redis的Sets是唯一的、無序的字符串元素的集合,不能出現重復的數據。

  • 向集合添加一個或多個成員:

    SADD key member [memebr1 ...]
    
  • 獲取一個集合中成員的數量:

    SCARD key
    
  • 返回集合中的所有成員:

    SMEMBERS key
    
  • 判斷給定的值是否是集合的成員:

    SISMEMBER key member
    
  • 返回多個集合的交集:

    SINTER key [key ...]
    
  • 返回多個集合的並集:

    SUNION key [key ...]
    
  • 返回一個集合與給定集合的差集的元素:

    SDIFF key1 key2
    
  • 從集合中隨機返回一個成員並從集合中移除:

    SPOP key [count]
    

    count用來設置隨機返回的數量,不寫就是1個。

  • 從集合中刪除指定成員:

    SREM key member [member ...]
    

3.4.5 有序集合(Sorted Sets)類型

Redis的Sorted Sets類似於上面的Sets,但每個字符串元素都與一個名為score的浮點數值相關聯。與Sets不同,Sorted Sets中的元素是按照它們的score從小到大排序,因此它可以檢索一個范圍內的元素(例如,獲取前10個或下10個)。

  • 向有序集合添加一個或多個成員,如果已經存在,則更新其score:

    ZADD key [NX|XX] score member
    
    • NX:只添加新元素。不要更新已經存在的元素。
    • XX:只更新已經存在的元素。不要添加新元素。
  • 從有序集合中刪除若干個元素:

    ZREM key member [member ……]
    
  • 獲取成員的score:

    ASCORE key member
    
  • 增加成員的score值:

    ZINCRBY key 增量 member
    
  • 迭代有序集合中的元素:

    ZSCAN key 游標
    
  • 獲取有序集合中的成員數:

    ZCARD key
    
  • 按照索引獲取一個范圍內的成員:

    ZRANGE key min max
    
  • 按照score獲取一個范圍內的成員:

    ZRANGEBYSCORE min max
    
  • 獲取成員的索引(從0開始):

    ZRANK key member
    

更多redis 命令請參考官方文檔:傳送門

四、管道(Pipelining)

Redis是一個使用客戶端-服務器模型的TCP服務器,也被稱為請求/響應協議。也就是說,redis每次執行一個請求,需要經過以下步驟:

  1. 客戶端向服務器發送一個查詢,然後從套接字讀取數據,通常以阻塞的方式獲取服務器的響應。
  2. 服務器處理命令並將響應發送回客戶端。

如果現在有一堆命令等待執行,發送完一個請求,等待響應再發送下一個請求……就會造成時間上的浪費。所以,我們希望能夠一次就發送多條命令,以節省時間。而管道就能幫助我們實現這一需求。

通過管道可以在無需等待請求被響應的情況下,發送下一個請求。並且,通過管道還可以對事務進行部分支持(不支持回滾)。

使用方法(通過python的redis庫):

import redis
conn = redis.Redis("127.0.0.1", 6379)
pipe = conn.pipeline(transaction=True) # 參數代表使用事務
# 開啟事務塊
pipe.multi()
pipe.set('key', 'value')
# ......
# 執行事務塊
pipe.execute()

五、在django中使用redis

django是不支持redis作為緩存的,但我們可以使用上面的redis庫,也可以使用專門的django-redis庫添加支持。下面簡單說一下django-redis的使用方法。

  • 安裝django-redis:

    pip install django-redis
    
  • 在項目配置文件中,配置CACHES後端:

    CACHES = {
    "default": {
    "BACKEND": "django_redis.cache.RedisCache",
    "LOCATION": "redis://127.0.0.1:6379/1",
    "OPTIONS": {
    "CLIENT_CLASS": "django_redis.client.DefaultClient",
    }
    }
    }
    

    LOCATION支持三種參數:

    • 創建一個正常的TCP套接字連接:

      redis://[[username]:[password]]@localhost:6379/0

    • 創建一個SSL封裝的TCP套接字連接:

      rediss://[[username]:[password]]@localhost:6379/0

    • 創建一個unix domain套接字連接:

      unix://[[username]:[password]]@/path/to/socket.sock?db=0

    如果有密碼,在OPTIONS中設置"PASSWORD":"密碼"

  • 使用方法有兩種:

    • 使用django提供的接口:

      from django.core.cache import cache
      cache.set("key", value, timeout=30)
      cache.get("key", default="默認值")
      
    • 使用django-redis:

      from django-redis import get_redis_connection
      conn = get_redis_connection("default")
      conn.hgetall("key")
      

更加詳細的說明,請參考官方文檔:傳送門

先自我介紹一下,小編13年上師交大畢業,曾經在小公司待過,去過華為OPPO等大廠,18年進入阿裡,直到現在。深知大多數初中級java工程師,想要升技能,往往是需要自己摸索成長或是報班學習,但對於培訓機構動則近萬元的學費,著實壓力不小。自己不成體系的自學效率很低又漫長,而且容易碰到天花板技術停止不前。因此我收集了一份《java開發全套學習資料》送給大家,初衷也很簡單,就是希望幫助到想自學又不知道該從何學起的朋友,同時減輕大家的負擔。添加下方名片,即可獲取全套學習資料哦


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved