1、Redis概念 Redis是一個key-value存儲系統。和Memcached類似,它支持存儲的value類型相對更多,包括string(字元串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add ...
1、Redis概念
Redis是一個key-value存儲系統。和Memcached類似,它支持存儲的value類型相對更多,包括string(字元串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支持各種不同方式的排序。與memcached一樣,為了保證效率,數據都是緩存在記憶體中。區別的是redis會周期性的把更新的數據寫入磁碟或者把修改操作寫入追加的記錄文件,並且在此基礎上實現了master-slave(主從)同步。
2、Redis應用案例
1)微博大V的微博數據被存放於高速緩存中,普通人的微博存放於普通NoSQL資料庫里
2)門戶網站、電商網站、視頻網站首頁的內容都需要緩存(屬於熱數據)
3)雙十一購物狂歡節,電商平臺要利用高速的緩存來彌補資料庫吞吐能力不足。訂單先被緩存,然後負載低谷期,再寫入資料庫
4)電商平臺秒殺/搶購業務需要用高速緩存來實現順序操作-(解決支付的時候才提醒庫存不足的問題)(單線程-棧隊)
5)可以存放短時間內的數據(如驗證碼)
3、Redis的目錄結構
-
RDB:定期將記憶體中的數據保存在硬碟中,可以查看第一個文件,裡面相關內容設置每隔一段時間將數據保存到硬碟中
-
AOF:日誌方式記錄redis數據寫入,意外宕機,重新執行AOF日誌就可以恢複數據,解決的RDB不能實時持久化的問題
-
都需要在配置文件中設置
4、Redis常用的數據結構
1)字元串類型
-
-
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
-
-
2)Redis哈希類型
-
-
當我們覺得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把兩個全刪掉)
-
-
4)Redis集合類型
-
-
如果我們需要列表的元素不可以重覆,可以使用集合類型,元素不可重覆(根據哈希值比較和排序)--順序和插入順序無關
-
集合指令
-
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
-
-
5)Redis有序集合
-
-
有序集合是帶有排序功能的集合,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
-
-
5、Redis常用命令
-
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
6、Redis與Python交互
1)安裝
在命令行安裝即可:pip install redis
2)連接
import redis r = redis.Redis( host="localhost", port=6379, password="", db=0 )
3)操作指令
上面提到的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