Redis介紹
Redis是什麼
redis是一個key-value存儲系統。和Memcached相似,它支持存儲的value類型相對更多,包括string、list、set、zset(sorted set)和hash。這些數據類型都支持push/pop、add/remove、取交集、並集和差集及其餘更豐富的操做,並且這些操做都是原子性的。在此基礎上,redis支持各類不一樣方式的排序。與memcached同樣,爲了保證效率,數據都是緩存在內存中。區別的是redis會週期性的把更新的數據寫入磁盤或者把修改操做寫入追加的記錄文件,而且在此基礎上實現了master-slave(主從)同步。javascript
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目錄下,運行如下命令啓動redishtml
$ src/redis-server
使用內置的客戶端工具與redis交互:java
$ src/redis-cli redis> set name qimi OK redis> get name "q1mi"
Windows
下載windows版 --> 我是下載連接,請點我python
關閉上面這個cmd窗口就關閉redis服務了。git
redis做爲windows服務啓動方式
redis-server --service-install redis.windows.conf
啓動服務:redis-server --service-start
中止服務:redis-server --service-stopgithub
啓動內置客戶端鏈接redis服務: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實例共享一個鏈接池。django
import redis pool = redis.ConnectionPool() r = redis.Redis(connection_pool=pool) r.set('age', 18) print(r.get('age'))
操做
Redis key
Redis 鍵命令用於管理 redis 的鍵。windows
序號 | 命令及描述 |
---|---|
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)
...