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的目錄結構

為了防止意外宕機丟失資料,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
3)Redis串列型別
當我們需要向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 redisr = 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
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/35458.html
標籤:NoSQL
