Redis是一個key-value存儲系統。和Memcached相似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操做,並且這些操做都是原子性的。在此基礎上,redis支持各類不一樣方式的排序。與memcached同樣,爲了保證效率,數據都是緩存在內存中。區別的是redis會週期性的把更新的數據寫入磁盤或者把修改操做寫入追加的記錄文件,而且在此基礎上實現了master-slave(主從)同步。html
1)微博大V的微博數據被存放於高速緩存中,普通人的微博存放於普通NoSQL數據庫裏python
2)門戶網站、電商網站、視頻網站首頁的內容都須要緩存(屬於熱數據)redis
3)雙十一購物狂歡節,電商平臺要利用高速的緩存來彌補數據庫吞吐能力不足。訂單先被緩存,而後負載低谷期,再寫入數據庫數據庫
4)電商平臺秒殺/搶購業務須要用高速緩存來實現順序操做-(解決支付的時候才提醒庫存不足的問題)(單線程-棧隊)緩存
5)能夠存放短期內的數據(如驗證碼)數據結構
app
RDB:按期將內存中的數據保存在硬盤中,能夠查看第一個文件,裏面相關內容設置每隔一段時間將數據保存到硬盤中memcached
AOF:日誌方式記錄redis數據寫入,意外宕機,從新執行AOF日誌就能夠恢復數據,解決的RDB不能實時持久化的問題網站
都須要在配置文件中設置spa
String類型既能夠保存普通文字,也能夠保存序列化的二進制數據
String類型最大能夠存儲512M數據(set/get/del)
set/get/del 設置/獲取/刪除
getrange:得到截取字符串內容-》eg:getrange username 0 3----起始,結束位置
strlen:得到字符串長度 -》eg:strlen username
setex:設置帶有過時時間(秒)的key-value-》eg:setex city 10 beijing(秒殺活動的數據)
mset:設置多個key-value -》eg:mset username Charisse age 18
mget:得到多個value -》eg:mget username age
append:用於在字符串結尾追加內容 -》eg:append username abcd
incr:數字自增長1 -》eg:incr num
incrby:數字加上指定的整數值 -》eg:incrby num 25
incrbyflaot:數字加上指定的浮點數 -》eg:incrbyfloat num 2.5/incrbyfloat age -2.5
decr:數字自減1 -》eg:decr age
decrby:數字減去指定的整數值 -》eg:decrby age 5
當咱們以爲value須要保存更復雜的結構化數據,這時可使用哈希類型
哈希指令:
hset:設置哈希表字段 -》eg:hset 1001 username Tom
hmset:設置哈希表多個字段 -》eg:hmset 1001 username Tom job salse
hget:獲取哈希表字段值 -》eg:hget 1001 username
hmget:獲取多個哈希表字段的值 -》eg:hmget 1001 username job
hgetall:獲取全部哈希表字段值 -》eg:hgetall 1001
hkeys:獲取全部哈希表字段名 -》eg:hkeys 1001
hlen:獲取哈希表中的字段數量 -》eg:hlen 1001
hexists:判斷哈希表是否存在某個字段 -》eg:hexists 1001 job
hvals:獲取哈希表的全部字段值 -》eg:hvals 1001
hdel:刪除哈希表的字段 -》eg:hdel 1001 username job
hincrby:讓哈希表某個字段值加上指定的整數值 -》eg:hincrby 1001 age 10【-10】
hincrbyfloat:讓哈希表某個字段值加上指定的浮點數 -》eg:hincrbyfloat 1001 price 3.5
當咱們須要向value保存序列化的數據,可使用列表類型
列表指令
rpush:在列表的右側添加元素 -》eg:rpush hobby music draw dance
lpush:在列表的左側添加元素 -》eg:lpush hobby basketball
lset:修改列表中的元素 -》lset hobby 2 足球 | lset 列表名 索引值 修改值
lrange:輸出列表元素 -》lrange hobby 0 -1(所有)
llen:獲取列表長度 -》eg:llen hobby
lindex:獲取列表某個元素 -》eg:lindex hobby 0
linsert:在某個位置插入元素 -》eg:linsert hobby before/after draw game
lpop:刪除列表最左邊的元素 -》eg:lpop hobby
rpop:刪除列表最右邊的元素 -》eg:rpop hobby
lrem:刪除列表某個元素 -》eg:lrem hobby 1 draw (1把第一個draw 刪掉,2把兩個全刪掉)
若是咱們須要列表的元素不能夠重複,可使用集合類型,元素不可重複(根據哈希值比較和排序)--順序和插入順序無關
集合指令
sadd :定義集合 -》eg:sadd empno 8000
smembers:查看集合全部元素 -》eg:smembers empno
flushall:清空邏輯空間
scard:得到集合長度 -》eg:scard empno
sismember:判斷是否含有某個元素 -》sismember empno 8000
srem:刪除元素 -》eg:srem empno 8000 8800 (del 能夠刪除任何類型)
spop:隨機刪除並返回集合的某個元素 -》eg:spop empno
srandmember:隨機返回集合中的幾個元素 -》eg:srandmember empno 5
有序集合是帶有排序功能的集合,Redis會按照元素分數值排序
有序集合指令
zadd:建立有序集合 -》eg:zadd keword 0 「鹿晗」 0 「馬雲」 0 「張朝陽」
zincrby:分數值+1 -》eg:zincrby keyword 5 "馬雲"
zrevrange:降序查看所有元素 -》eg:zrevrange keyword 0 -1
zcard:得到有序集合長度 -》eg:zcard keyword
zcount:查詢某個分數值間內的元素數量 -》eg:zcount keyword 5 10
zscore:返回元素的分數值 -》eg:zscore keyword 「馬雲」
zrange:得到有序集合的內容(升序)-》eg:zrange keyword 0 -1
zrevrange:得到有序集合的內容(降序)-》eg:zrevrange keyword 0 -1/zrevrange keyword 0 0(最高分)
zrangebyscore:獲取分數值區間內的集合內容(升序)
zrangebyscore keyword 5 10 大於等於5,小於等於10
zrangebyscore keyword 5 (10 大於等於5,小於10
zrangebyscore keyword 100000 +inf 十萬以上
zrevrangebyscore:獲取分數值區間內的集合內容(降序)-》eg:zrevrangebyscore keyword 10 5
zrank:得到元素的升序排名(從0開始)-》eg:zrank keyword 「馬雲」
zrevrank:得到元素的降序排名(從0開始)-》eg:zrevrank keyword 「馬雲」
zrem:刪除有序集合中的元素 -》eg:zrevm keyword ‘’馬雲‘’ 「張朝陽」
zremrangebyrank:刪除排名區間內的元素 -》eg:zremrangebyrank keyword 0 2
zremrangebyscore:刪除分數區間內的元素 -》eg:zremrangebyscore keyword -inf (5000
key命令
del:刪除記錄 -》eg:del keyword
exists:判斷是否存在某個key -》eg:exists employee
exipire:設置記錄過時時間 -》eg:expire employee 5(秒)
expireat:設置記錄的過時時間(unix時間戳)-》eg:expireat employee 1544803200
rename:修改key名稱 -》eg:rename employee emp
persist:移除過時時間 -》eg:persist employee
type:判斷value的數據類型 -》eg:type employee
相關Redis命令可查看官方文檔:http://doc.redisfans.com/index.html
在命令行安裝便可:pip install redis
import redis r = redis.Redis( host="localhost", port=6379, password="", db=0 )
上面提到的5種數據結構,在redis中很類似的,在python中也同樣,這裏僅介紹幾種
a、設置和獲取
r.set("country","英國") r.set("city","倫敦") city = r.get("city").decode("utf-8") print(city)
b、設置多個變量和刪除
r.delete("country","city") r.mset({"country":"德國","city":"柏林"}) result = r.mget("country","city") for one in result: print(one.decode("utf-8"))
c、列表增長和刪除
r.rpush("dname","董事會","祕書處","財務部","技術部") r.lpop("dname") result = r.lrange("dname",0,-1) for one in result: print(one.decode("utf-8"))
d、集合增長和刪除
r.sadd("employee",8000,8001,8002) r.srem("employee",8001) result = r.smembers("employee") r.zadd("keyword",{"馬雲":0,"鄧磊":0,"張朝陽":0}) r.zincrby("keyword","10","馬雲") result = r.zrevrange("keyword",0,-1)
e、哈希增長和刪除
try: r.hmset("9527",{"name":"charisse","age":"18","sec":"male"}) r.hset("9527","city","北京") r.hdel("9527","age") r.hexists("9527","name") result = r.hgetall("9527")# 字典 for one in result: print(one.decode("utf-8"),result[one].decode("utf-8")) except Exception as e: print(e) finally: del r