Redis介紹
Redis是什么
redis是一個key-value存儲系統。和Memcached類似,它支持存儲的value類型相對更多,包括string、list、set、zset(sorted set)和hash。這些數據類型都支持push/pop、add/remove、取交集、並集和差集及其他更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支持各種不同方式的排序。與memcached一樣,為了保證效率,數據都是緩存在內存中。區別的是redis會周期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,並且在此基礎上實現了master-slave(主從)同步。
Redis下載與安裝
Linux
$ wget http://download.redis.io/releases/redis-5.0.3.tar.gz $ tar xzf redis-5.0.3.tar.gz $ cd redis-5.0.3 $ make
此時,可執行文件在src目錄下,運行以下命令啟動redis
$ src/redis-server
使用內置的客戶端工具與redis交互:
$ src/redis-cli redis> set name qimi OK redis> get name "q1mi"
Windows
下載windows版 --> 我是下載鏈接,請點我
關閉上面這個cmd窗口就關閉redis服務了。
redis作為windows服務啟動方式
redis-server --service-install redis.windows.conf
啟動服務:redis-server --service-start
停止服務:redis-server --service-stop
啟動內置客戶端連接redis服務:
Python操作Redis
安裝python連接redis的工具
pip install redis
redis模塊基本使用
連接方式
redis-py提供兩個類Redis和StrictRedis用於實現Redis的命令,StrictRedis用於實現大部分官方的命令,並使用官方的語法和命令,Redis是StrictRedis的子類,用於向后兼容舊版本的redis-py。
import redis r = redis.Redis() # 默認連本地 # r = redis.Redis(host='11.12.13.14', port=6379) # 可配置要連接的IP和端口 r.set('name', 'q1mi') print(r.get('name'))
連接池
redis-py使用connection pool來管理對一個redis server的所有連接,避免每次建立、釋放連接的開銷。默認,每個Redis實例都會維護一個自己的連接池。可以直接建立一個連接池,然后作為參數Redis,這樣就可以實現多個Redis實例共享一個連接池。
import redis pool = redis.ConnectionPool() r = redis.Redis(connection_pool=pool) r.set('age', 18) print(r.get('age'))
操作
Redis key
Redis 鍵命令用於管理 redis 的鍵。
序號 | 命令及描述 |
---|---|
1 | DEL key 該命令用於在 key 存在時刪除 key。 |
2 | DUMP key 序列化給定 key ,並返回被序列化的值。 |
3 | EXISTS key 檢查給定 key 是否存在。 |
4 | EXPIRE key seconds 為給定 key 設置過期時間,以秒計。 |
5 | EXPIREAT key timestamp EXPIREAT 的作用和 EXPIRE 類似,都用於為 key 設置過期時間。 不同在於 EXPIREAT 命令接受的時間參數是 UNIX 時間戳(unix timestamp)。 |
6 | PEXPIRE key milliseconds 設置 key 的過期時間以毫秒計。 |
7 | PEXPIREAT key milliseconds-timestamp 設置 key 過期時間的時間戳(unix timestamp) 以毫秒計 |
8 | KEYS pattern 查找所有符合給定模式( pattern)的 key 。 |
9 | MOVE key db 將當前數據庫的 key 移動到給定的數據庫 db 當中。 |
10 | PERSIST key 移除 key 的過期時間,key 將持久保持。 |
11 | PTTL key 以毫秒為單位返回 key 的剩余的過期時間。 |
12 | TTL key 以秒為單位,返回給定 key 的剩余生存時間(TTL, time to live)。 |
13 | RANDOMKEY 從當前數據庫中隨機返回一個 key 。 |
14 | RENAME key newkey 修改 key 的名稱 |
15 | RENAMENX key newkey 僅當 newkey 不存在時,將 key 改名為 newkey 。 |
16 | TYPE key 返回 key 所儲存的值的類型。 |
Redis String操作
String操作,redis中的String在內存中按照一個name對應一個value來存儲。
序號 | 命令及描述 |
---|---|
1 | SET key value 設置指定 key 的值 |
2 | GET key 獲取指定 key 的值。 |
3 | GETRANGE key start end 返回 key 中字符串值的子字符 |
4 | GETSET key value 將給定 key 的值設為 value ,並返回 key 的舊值(old value)。 |
5 | GETBIT key offset 對 key 所儲存的字符串值,獲取指定偏移量上的位(bit)。 |
6 | MGET key1 [key2..] 獲取所有(一個或多個)給定 key 的值。 |
7 | SETBIT key offset value 對 key 所儲存的字符串值,設置或清除指定偏移量上的位(bit)。 |
8 | SETEX key seconds value 將值 value 關聯到 key ,並將 key 的過期時間設為 seconds (以秒為單位)。 |
9 | SETNX key value 只有在 key 不存在時設置 key 的值。 |
10 | SETRANGE key offset value 用 value 參數覆寫給定 key 所儲存的字符串值,從偏移量 offset 開始。 |
11 | STRLEN key 返回 key 所儲存的字符串值的長度。 |
12 | MSET key value [key value ...] 同時設置一個或多個 key-value 對。 |
13 | MSETNX key value [key value ...] 同時設置一個或多個 key-value 對,當且僅當所有給定 key 都不存在。 |
14 | PSETEX key milliseconds value 這個命令和 SETEX 命令相似,但它以毫秒為單位設置 key 的生存時間,而不是像 SETEX 命令那樣,以秒為單位。 |
15 | INCR key 將 key 中儲存的數字值增一。 |
16 | INCRBY key increment 將 key 所儲存的值加上給定的增量值(increment) 。 |
17 | INCRBYFLOAT key increment 將 key 所儲存的值加上給定的浮點增量值(increment) 。 |
18 | DECR key 將 key 中儲存的數字值減一。 |
19 | DECRBY key decrement key 所儲存的值減去給定的減量值(decrement) 。 |
20 | APPEND key value 如果 key 已經存在並且是一個字符串, APPEND 命令將指定的 value 追加到該 key 原來值(value)的末尾。 |
Redis Hash操作
Redis hash 是一個string類型的field和value的映射表,hash特別適合用於存儲對象。
Redis 中每個 hash 可以存儲 232-1 鍵值對(40多億)。
序號 | 命令及描述 |
---|---|
1 | HDEL key field1 [field2] 刪除一個或多個哈希表字段 |
2 | HEXISTS key field 查看哈希表 key 中,指定的字段是否存在。 |
3 | HGET key field 獲取存儲在哈希表中指定字段的值。 |
4 | HGETALL key 獲取在哈希表中指定 key 的所有字段和值 |
5 | HINCRBY key field increment 為哈希表 key 中的指定字段的整數值加上增量 increment 。 |
6 | HINCRBYFLOAT key field increment 為哈希表 key 中的指定字段的浮點數值加上增量 increment 。 |
7 | HKEYS key 獲取所有哈希表中的字段 |
8 | HLEN key 獲取哈希表中字段的數量 |
9 | HMGET key field1 [field2] 獲取所有給定字段的值 |
10 | HMSET key field1 value1 [field2 value2 ] 同時將多個 field-value (域-值)對設置到哈希表 key 中。 |
11 | HSET key field value 將哈希表 key 中的字段 field 的值設為 value 。 |
12 | HSETNX key field value 只有在字段 field 不存在時,設置哈希表字段的值。 |
13 | HVALS key 獲取哈希表中所有值 |
14 | HSCAN key cursor [MATCH pattern] [COUNT count] 迭代哈希表中的鍵值對。 |
Redis List操作
Redis List是簡單的字符串列表,按照插入順序排序。你可以添加一個元素到List的頭部(左邊)或者尾部(右邊)
一個List最多可以包含 232-1 個元素 (4294967295, 每個List超過40億個元素)。
序號 | 命令及描述 |
---|---|
1 | BLPOP key1 [key2 ] timeout 移出並獲取列表的第一個元素, 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素為止。 |
2 | BRPOP key1 [key2 ] timeout 移出並獲取列表的最后一個元素, 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素為止。 |
3 | BRPOPLPUSH source destination timeout 從列表中彈出一個值,將彈出的元素插入到另外一個列表中並返回它; 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素為止。 |
4 | LINDEX key index 通過索引獲取列表中的元素 |
5 | LINSERT key BEFORE|AFTER pivot value 在列表的元素前或者后插入元素 |
6 | LLEN key 獲取列表長度 |
7 | LPOP key 移出並獲取列表的第一個元素 |
8 | LPUSH key value1 [value2] 將一個或多個值插入到列表頭部 |
9 | LPUSHX key value 將一個值插入到已存在的列表頭部 |
10 | LRANGE key start stop 獲取列表指定范圍內的元素 |
11 | LREM key count value 移除列表元素 |
12 | LSET key index value 通過索引設置列表元素的值 |
13 | LTRIM key start stop 對一個列表進行修剪(trim),就是說,讓列表只保留指定區間內的元素,不在指定區間之內的元素都將被刪除。 |
14 | RPOP key 移除列表的最后一個元素,返回值為移除的元素。 |
15 | RPOPLPUSH source destination 移除列表的最后一個元素,並將該元素添加到另一個列表並返回 |
16 | RPUSH key value1 [value2] 在列表中添加一個或多個值 |
17 | RPUSHX key value 為已存在的列表添加值 |
Redis Set操作
Redis 的 Set 是 String 類型的無序集合。Set成員是唯一的,這就意味着Set中不能出現重復的數據。
Redis 中Set是通過哈希表實現的,所以添加,刪除,查找的復雜度都是 O(1)。
Set 中最大的成員數為 232-1 (4294967295, 每個set可存儲40多億個成員)。
序號 | 命令及描述 |
---|---|
1 | SADD key member1 [member2] 向集合添加一個或多個成員 |
2 | SCARD key 獲取集合的成員數 |
3 | SDIFF key1 [key2] 返回給定所有集合的差集 |
4 | SDIFFSTORE destination key1 [key2] 返回給定所有集合的差集並存儲在 destination 中 |
5 | SINTER key1 [key2] 返回給定所有集合的交集 |
6 | SINTERSTORE destination key1 [key2] 返回給定所有集合的交集並存儲在 destination 中 |
7 | SISMEMBER key member 判斷 member 元素是否是集合 key 的成員 |
8 | SMEMBERS key 返回集合中的所有成員 |
9 | SMOVE source destination member 將 member 元素從 source 集合移動到 destination 集合 |
10 | SPOP key 移除並返回集合中的一個隨機元素 |
11 | SRANDMEMBER key [count] 返回集合中一個或多個隨機數 |
12 | SREM key member1 [member2] 移除集合中一個或多個成員 |
13 | SUNION key1 [key2] 返回所有給定集合的並集 |
14 | SUNIONSTORE destination key1 [key2] 所有給定集合的並集存儲在 destination 集合中 |
15 | SSCAN key cursor [MATCH pattern] [COUNT count] 迭代集合中的元素 |
Redis zset操作
Redis 有序集合和集合一樣也是string類型元素的集合,且不允許重復的成員。
不同的是每個元素都會關聯一個double類型的分數。redis正是通過分數來為集合中的成員進行從小到大的排序。
有序集合的成員是唯一的,但分數(score)卻可以重復。
集合是通過哈希表實現的,所以添加,刪除,查找的復雜度都是O(1)。 集合中最大的成員數為 232-1 (4294967295, 每個集合可存儲40多億個成員)。
管道
redis-py默認在執行每次請求都會創建(連接池申請連接)和斷開(歸還連接池)一次連接操作,如果想要在一次請求中指定多個命令,則可以使用pipline實現一次請求指定多個命令,並且默認情況下一次pipline 是原子性操作。
import redis pool = redis.ConnectionPool() r = redis.Redis(connection_pool=pool) # pipe = r.pipeline(transaction=False) pipe = r.pipeline(transaction=True) pipe.multi() pipe.set('name', 'Q1mi') pipe.set('role', 'JPG') pipe.execute()
Django配置Redis
安裝
django項目中配置redis作為cache緩存,需要先安裝django-redis模塊
pip install django-redis
配置
在settings.py中,按如下配置CACHE連接的redis信息:
CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", "LOCATION": "redis://127.0.0.1:6379", "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", "CONNECTION_POOL_KWARGS": {"max_connections": 100}, # "PASSWORD": "密碼", "DECODE_RESPONSES":True } }, }
使用
先獲取redis連接:
import django_redis CACHE = django_redis.get_redis_connection()
在視圖中
...
CACHE.set(key, value)
...