redis 一百二十篇(簡單介紹)之第一篇
阿新 • • 發佈:2020-03-29
### 前言
總結自己的redis,日常使用不是特別頻繁,所以比較基礎。
### 開篇
redis 是無關係型資料庫,因為其實記憶體資料庫,所以常常和他的競爭對手memcached對比,因為兩者原理基礎相似,儲存方式也是key和value的方式。
在memcached中value只能是字串,而redis就有5種結構了。當然這並是不說mencached就比redis差,只是介紹出redis有哪些優點。
redis最大的優勢或者說特點和普通的關係型資料庫而言就在於是記憶體中,這意味著我們有很好都讀寫能力。
缺點也就很明顯了,因為在記憶體中消耗的資源成本肯定比持久化儲存的成本高。畢竟你要向公司申請一臺redis,公司會考慮到今年給你們部門的開銷,畢竟公司上層很可能不懂什麼是技術,只知道資本主義那一套。
如果是技術出身的老闆可能還會懟我們開發人員,因為他會在技術與資本之前權衡,但是往往選擇資本主義,然後用著他的專業術語和我們溝通一番。
好了說到記憶體,那麼肯定得考慮如何持久化,因為別的不說,你總得備份資料庫吧,萬一伺服器抽風呢?
1.時間點儲存,每隔一段時間儲存一些資料或者說某個時間點來儲存資料,總之就是規劃時間這回事。然後這種方式被別人稱為rdb,redis database。
2.AOF方式,(append only file)。這種方式就是通過操作日誌的方式,每一次寫(增刪改)的操作都會被記錄,這樣就做到了持久化了。
上面的優劣點就不介紹了,因為第一章只是簡單的介紹。
#### redis的資料結構
前文:我在遠端操作,使用redis client作為演示。
redis 開啟遠端:修改 protected-mode 為 no ; 修改 daemonize 為 no ; 修改預設的,設定為 bind 0.0.0.0,然後新增一個密碼,具體的可百度。當然這樣是不安全的,只作為演示。
![](https://img2020.cnblogs.com/blog/1289794/202003/1289794-20200329115302687-480496541.png)
上圖是我連線資料庫後的,但是我只使用第一個,就算是生產環境一般也使用一個。
上文介紹到redis和memcached不同之處,在於由5種資料結構,看一下吧。
#### string 字元
set str string
key: str value string
![](https://img2020.cnblogs.com/blog/1289794/202003/1289794-20200329131935830-214809899.png)
當然我們命令列檢視的方式:
get str
![](https://img2020.cnblogs.com/blog/1289794/202003/1289794-20200329132028267-1181986260.png)
刪除的話,就是del str,在此不演示了。
#### list 列表
新增一個list,key命名為keylist 值為item1
rpush keylist item1
![](https://img2020.cnblogs.com/blog/1289794/202003/1289794-20200329132254930-735590579.png)
當然我們也可以左邊push進入:lpush keylist item2
![](https://img2020.cnblogs.com/blog/1289794/202003/1289794-20200329132515967-687576199.png)
你們看item2在item1的上方
刪除的方式,一個是往左邊彈出:
![](https://img2020.cnblogs.com/blog/1289794/202003/1289794-20200329132715364-1952432546.png)
檢視一下剩下什麼:
lrange listkey 0 -1
![](https://img2020.cnblogs.com/blog/1289794/202003/1289794-20200329144652979-1116258274.png)
因為redis client 是在是不好用,所以換回了putty,命令列模式。
往右邊彈出:
rpop listkey
這樣就沒有任何資料了。
lrange listkey 0 -1
![](https://img2020.cnblogs.com/blog/1289794/202003/1289794-20200329144915401-1792748373.png)
在列表中是支援索引的。
![](https://img2020.cnblogs.com/blog/1289794/202003/1289794-20200329145043817-1327470429.png)
上圖中使用了lindex 索引。但是是沒有rindex。
#### 集合
集合通過雜湊來實現的,這意味著每個字元都是不同的,集合同時是無序的。這和我們在高階語言中學習集合是一致的。
sadd setkey item1
往集合中增加一個值,如果key不存在就建立,返回了集合中的值的數量。
![](https://img2020.cnblogs.com/blog/1289794/202003/1289794-20200329145746413-1896258518.png)
查詢集合是使用:smembers setkey
![](https://img2020.cnblogs.com/blog/1289794/202003/1289794-20200329145944932-238811880.png)
中間有一個我打錯了,望見諒。
查詢的方式是:sismember setkey item1 如果存在返回1,不存在返回0
![](https://img2020.cnblogs.com/blog/1289794/202003/1289794-20200329150115806-415234890.png)
刪除是srem setkey item1,刪除了是1,沒有刪除是0。
![](https://img2020.cnblogs.com/blog/1289794/202003/1289794-20200329150257877-377951680.png)
#### 雜湊
如果把其他型別比作游擊隊,那麼雜湊名字雖然有個散字,但是卻是一個團隊。
這似乎補充了redis沒有表的問題。
使用hset作為新增雜湊:
hset hashkey subhashkey1 item1-1
![](https://img2020.cnblogs.com/blog/1289794/202003/1289794-20200329151724478-722750286.png)
如果subhashkey1存在將會覆蓋,且返回0。
查詢的方式是hget,hget hashkey subhashkey1
![](https://img2020.cnblogs.com/blog/1289794/202003/1289794-20200329151845731-1369384232.png)
查詢雜湊中的keys,可以用hkeys hashkey.那麼將會顯示出subhashkey1,這裡我就不展示。
如果使用hgetall hashkey,那麼顯示的將會是:
![](https://img2020.cnblogs.com/blog/1289794/202003/1289794-20200329152345124-1366981870.png)
會顯示所有的鍵值對,包括了值。
下圖為刪除的:
![](https://img2020.cnblogs.com/blog/1289794/202003/1289794-20200329152455703-2136791554.png)
#### 有序集合
寫到這裡,其實應該返回到集合去檢視的。
前面解釋了集合是通過雜湊實現的,集合是有索引的。
對應的是——雜湊值:value。
在有序集合中,只是這個雜湊值不再是系統幫助我們生成,而是我們手動輸入,這樣我們通過我們輸入的值就可以找到value。
有兩個一定要記住的術語:
1.有序集合的鍵被稱作成員。
2.有序集合的值被稱作分值。
我們通過zadd來新增。
![](https://img2020.cnblogs.com/blog/1289794/202003/1289794-20200329153519606-1353052083.png)
上文可知,通知1是添加了,0是覆蓋了。
對了,redis符合一句話,沒有錯誤就是成功了,所以不存在返回0是出現錯誤。
zrange zsetkey 0 -1
是查詢。
zrange zsetkey 0 -1 會有另外一個引數,就是展示出我們輸入的成員。
如下圖:
![](https://img2020.cnblogs.com/blog/1289794/202003/1289794-20200329154022922-435989180.png)
有一個zrangescore的,也特別重要:
![](https://img2020.cnblogs.com/blog/1289794/202003/1289794-20200329154413757-329341606.png)
它會根據我們的成員範圍來查詢。
最後一個是刪除zrem,zrem刪除的是分值,而不是成員,因為他是一個集合,而不是一個雜湊。
![](https://img2020.cnblogs.com/blog/1289794/202003/1289794-20200329154718198-1545389167.png)
如果我們使用zrem通過成員去刪除的話:
![](https://img2020.cnblogs.com/blog/1289794/202003/1289794-20200329154808653-990163533.png)
是不會成功的,返回結果為0,代表zrem中沒有101這個分值,而不是說這條語句失敗了。
### 總結
redis 的語句都特別好理解,但是在使用中一般都會出現問題,當然這些問題都會交給運維人員去解決(重啟以及刪庫跑路),但是當持續崩的話,可能自己都會受到