Redis學習第八課:Redis高級實用特性(一)

Redis高級實用特性

注:我學習的環境是vmware7.1 + ubantu10.10+ redis 3.0.2

1、安全性

設置客戶端連接后進行任何其他指定前需要的密碼。因為redis速度相當快,一個外部用戶可以在一秒鐘進行很多次的密碼嘗試,這就需要設定非常強大的密碼來防止暴力破解。 可以在Redis的配置文件中找到如下項: # requirepass foobared requirepass anny

root@ubuntu:/usr/local/redis# ps -e

root@ubuntu:/usr/local/redis# kill -9 2039
root@ubuntu:/usr/local/redis# netstat -tunpl | grep 6379
root@ubuntu:/usr/local/redis# ./bin/redis-server ./etc/redis.conf?
root@ubuntu:/usr/local/redis# ./bin/redis-cli
127.0.0.1:6379> keys *
(error) NOAUTH Authentication required.
127.0.0.1:6379>

為Redis設置密碼后,再啟動Redis客戶端,命令就無法執行。

對Redis客戶端進行授權,通過以下命令:

127.0.0.1:6379> auth anny
OK

或者在啟動Redis客戶端時,設置密碼,命令如下:

root@ubuntu:/usr/local/redis# ./bin/redis-cli -a anny


2、主從復制

Redis主從復制配置和使用都要非常簡單。通過主從復制可以允許多個slave server擁有和master server相同的數據庫副本。

Redis主從復制的特點:

1、Master可以擁有多個slave。

2、多個slave可以連接同一個master外,還可以連接到其它的slave。

3、主從復制不會阻塞master, 在同步數據時,master可以繼續處理client請求。

4、提高系統的伸縮性。

注意:Redis的主從復制,不僅僅是master與slave相連接,也可以slave與slave相連接,當master宕機時,另一個主要的slave立馬轉換角色,變成master。

?

Redis主從復制過程:
1、Slave與master建立連接,發送sync同步命令。
2、master會啟動一個后臺進程,將數據庫快照保存到文件中,同時master主進程會開始收集新的寫命令并緩存。
3、后臺完在保存后,就將此文件發送給slave。
4、slave將此文件保存到硬盤上。

配置主從服務器:

只需要修改slave的配置文件中加入以下配置:

slaveof 192.168.32.216 6379 #指定master的ip和端口

masterauth anny #這是主機的密碼

主從服務器實驗操作:

1、首先將本臺虛擬機重命名為Redis_master,通過下面命令關機。

root@ubuntu:/usr/local/redis#init 0

2、通過vmware,在Redis_master虛擬機名稱上點右鍵,點擊“Clone”命令,一路點“下一步”,直到完成。將新克隆的虛擬機重命名為Redis_slave。

3、分別啟動虛擬機redis_master和redis_slave。

4、切換到虛擬機redis_slave,修改IP。修改/usr/local/redis/etc/redis.conf文件,修改以下內容: ????

slaveof 192.168.32.216 6379 ????

masterauth anny

5、分別啟動兩臺機器的redis-server.

6、我們在虛擬機redis_master的 redis客戶端寫入數據,數據會自動同步到虛擬機redis_slave上。

7、如何判斷誰是主誰是從,可以通過info命令查看role內容。


3、事務處理

Redis 事務可以一次執行多個命令, 并且帶有以下兩個重要的保證:

  • 事務是一個單獨的隔離操作:事務中的所有命令都會序列化、按順序地執行。事務在執行的過程中,不會被其他客戶端發送來的命令請求所打斷。
  • 事務是一個原子操作:事務中的命令要么全部被執行,要么全部都不執行。

一個事務從開始到執行會經歷以下三個階段:

  • 開始事務。
  • 命令入隊。
  • 執行事務。

Redis對事務的支持目前還比較簡單。Redis只能保證一個client發起的事務中命令可以連續的執行,而中間不會插入其他client的命令。當一個client在一個連接中發出multi命令時,這個連接會進入一個事務上下文,該連接后續的命令不會立即執行,而是先放到一個隊列中,當執行exec命令時,redis會順序的執行隊列中的所有命令

Redis 事務命令

下表列出了 redis 事務的相關命令:

?

序號命令及描述
1DISCARD?取消事務,放棄執行事務塊內的所有命令。
2EXEC?執行所有事務塊內的命令。
3MULTI?標記一個事務塊的開始。
4UNWATCH?取消 WATCH 命令對所有 key 的監視。
5WATCH key [key ...]?監視一個(或多個) key ,如果在事務執行之前這個(或這些) key 被其他命令所改動,那么事務將被打斷。

?

multi:將任務命令放入隊列

exec:順序執行本事務上下文隊列中的任務命令。

127.0.0.1:6379> get age
"20"
127.0.0.1:6379>?multi
OK
127.0.0.1:6379> set age 10
QUEUED
127.0.0.1:6379> set age 20
QUEUED
127.0.0.1:6379>?exec
1) OK
2) OK
127.0.0.1:6379> get age
"20"

discard:清空事務的命令隊列并退出事務上下文,即我們常說的事務回滾。

當執行了multi命令后,如果想取消事務處理,可以使用discard命令。

127.0.0.1:6379>?multi
OK
127.0.0.1:6379> set age 30
QUEUED
127.0.0.1:6379> set age 40
QUEUED
127.0.0.1:6379>?discard
OK
127.0.0.1:6379> get age
"20"

強調:在Redis的事務上下文中,當其中某一個命令執行失敗時,不會影響到其他命令的執行。這一點跟我們理解中的事務不一樣,發生錯誤,不會回滾。

看下面例子,在整個事務中,第一條命令執行成功,而第二條命令執行失敗,但事務沒有回滾。

127.0.0.1:6379> get age
"20"
127.0.0.1:6379> get name
"test"
127.0.0.1:6379> multi
OK
127.0.0.1:6379> incr age
QUEUED
127.0.0.1:6379> incr name
QUEUED
127.0.0.1:6379> exec
1) (integer) 21
2) (error) ERR value is not an integer or out of range
127.0.0.1:6379> get age
"21"

樂觀鎖:
大多數是基于數據版本(version)的記錄機制實現的。即為數據增加一個版本標識,在基于數據庫表的版本解決方案中,一般是通過為數據庫表增加一個“version”字段來實現讀出數據時,將此版本號一同讀出,之后更新時,對此版本號加1。此時,將提交數據的版本號與數據庫表對應記錄的當前版本號時行比對,如果提交的數據版本號大于數據庫當前版本號,則予以更新,否則認為是過期數據。

watch命令會監視給定的key,當exec的時候如果監視的key從調用watch后發生過變化,則整個事務會失敗。也可以調用watch命令多次監視多個key,這樣就可以對指定的key加樂觀鎖。注意watch的key是對整個連接有效的,事務也一樣。如果連接斷開,監視和事務都會被自動清除。當然exec、discard、unwatch命令都會清除連接中的所有監視。

Redis樂觀鎖實例:

在第一個終端中,通過watch命令監控名稱為“age“的key:

127.0.0.1:6379> get age
"21"
127.0.0.1:6379>?watch age
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set age 18
QUEUED

然后我在第二個終端中,對key為“age“進行賦值。

127.0.0.1:6379> set age 25
OK

然后我又回到第一個終端進行后續命令,這時執行事務返回nil,表示事務執行不成功。
127.0.0.1:6379> exec
(nil)
127.0.0.1:6379> get age
"25"

?

轉載于:https://www.cnblogs.com/zxtceq/p/7250987.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/253905.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/253905.shtml
英文地址,請注明出處:http://en.pswp.cn/news/253905.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

分布式緩存的面試題9

1、面試題 如何保證緩存與數據庫的雙寫一致性? 2、面試官心里分析 你只要用緩存,就可能會涉及到緩存與數據庫雙存儲雙寫,你只要是雙寫,就一定會有數據一致性的問題,那么你如何解決一致性問題? 3、面試題剖析…

ROS與navigation教程——概述

navigation是ROS的二維導航功能包,簡單來說,就是根據輸入的里程計等傳感器的信息流和機器人的全局位置,通過導航算法,計算得出安全可靠的機器人速度控制指令。 代碼庫:https://github.com/ros-planning/navigation 代…

Linux下c開發 之 線程通信與pthread_cond_wait()的使用

pthread_cond_wait() /************pthread_cond_wait()的使用方法**********/pthread_mutex_lock(&qlock); pthread_cond_wait(&qready, &qlock);pthread_mutex_unlock(&qlock);/*****************************************************/The mutex passed …

ROS與navigation教程——ACML參數配置

<launch> <!--//后為wiki官網的參數說明 &#xff08;&#xff09;中為粗讀算法參數說明及理解 面臨的問題常用地圖有2種&#xff1a;1.基于特征&#xff0c;僅指明在指定位置&#xff08;地圖中包含的對象的位置&#xff09;的環境的形狀。特征表示使得調節對象的位置…

【設計模式】單例模式 Singleton Pattern

通常我們在寫程序的時候會碰到一個類只允許在整個系統中只存在一個實例&#xff08;Instance&#xff09; 的情況&#xff0c; 比如說我們想做一計數器&#xff0c;統計某些接口調用的次數&#xff0c;通常我們的數據庫連接也是只期望有一個實例。Windows系統的系統任務管理器…

修改輸入框placeholder的默認樣式

一般網頁中都用到input的placeholder屬性&#xff0c;想讓這個默認樣式和網頁保持一致&#xff0c;就需要重新設定樣式&#xff0c;百度百度&#xff1a; :-moz-placeholder { / color: #000; opacity:1; }支持/* Mozilla Firefox 4 to 18 * ::-moz-placeholder { color: #000;…

進程及線程通信總結

上文我們介紹了如何建立一個簡單的多線程程序&#xff0c;多線程之間不可避免的需要進行通信 。相比于進程間通信來說&#xff0c;線程間通信無疑是相對比較簡單的。 首先我們來看看最簡單的方法&#xff0c;那就是使用全局變量&#xff08;靜態變量也可以&#xff09;來進行通…

ROS multi-master——multimaster_fkie配置

多主站ROS配置和mutimaster_fkie ROS版本&#xff1a;kinetic 操作系統&#xff1a;Ubuntu 16.04。 multimaster_fkie&#xff1a;github 1網絡配置 1.1路由器 設置無線路由器并連接兩臺計算機/機器人。為這兩臺計算機設置靜態IP地址。相互測試ping命令和ssh。 1.2主機 …

Docker入門

1. Docker簡介: docker是一個基于LXC的高級容器引擎。簡單地說&#xff0c;docker是一個輕量級的虛擬解決方案&#xff0c;或者說它是一個超輕量級的虛擬機&#xff08;容器&#xff09;。 Docker是一個開源的引擎&#xff0c;可以輕松的為任何應用創建一個輕量級的、可移植的、…

樂器庫的混合

每臺微機一個聲卡&#xff0c;也就是一片D/A&#xff0c;驅動按波特率、采樣位數、采樣通道傳輸給D/A&#xff0c;輸出模擬音頻。播放時僅一種與硬件支持格式對應&#xff0c;其他需驅動&#xff08;有損&#xff09;變換到硬件支持格式。每個應用都可單獨播放聲音&#xff0c;…

kafka認知--(1)

文檔參考&#xff1a;http://kafka.apache.org/documentation.html 下載代碼&#xff1a; tar -xzf kafka_2.11-0.11.0.0.tgz cd kafka_2.11-0.11.0.0 啟動 bin/zookeeper-server-start.sh config/zookeeper.properties 創建topic&#xff08;主題為test&#xff0c;只有一個分…

帶頭尾指針的list的C實現

一、緣起 很早寫了一個帶頭尾指針的list&#xff0c;該list支持從尾部插入元素&#xff0c;在任意位置刪除元素&#xff0c;最近用這個list時發現一個bug&#xff0c;修正了&#xff0c;并加了幾個接口函數。貼出來&#xff0c;希望對C的初學者有用。 二、基本說明 2.1、數據結…

Gmapping——從原理到實踐

概述 在SLAM中&#xff0c;機器人位姿和地圖都是狀態變量&#xff0c;我們需要同時對這兩個狀態變量進行估計&#xff0c;即機器人獲得一張環境地圖的同時確定自己相對于該地圖的位置。我們用x表示機器人狀態&#xff0c;m表示環境地圖&#xff0c;z表示傳感器觀測情況&#xf…

關于git分支

1.關于git分支 git的“分支”乍一聽是一個特別容易讓人產生錯覺的概念&#xff0c;以為它和樹枝一樣是分叉的枝節&#xff0c;其實Git中的分支本質上是個指向commit對象的指針,每次commit&#xff0c;git都把它們串成一條時間線&#xff0c;這條時間線就是一個分支。 2.直接切換…

【機器學習經典算法源碼分析系列】-- 邏輯回歸

1.邏輯回歸&#xff08;Logistic Regression&#xff09;又常被成為“邏輯斯蒂回歸”&#xff0c;實質上是一個二元分類問題。 邏輯回歸代價函數&#xff1a; 代價函數導數&#xff1a; Matlab實現&#xff1a; 采用matlab中自帶的無約束最小化函數fminunc來代替梯度下降法&…

求特殊自然數

總時間限制: 1000ms 內存限制: 65536kB 描述一個十進制自然數,它的七進制與九進制表示都是三位數&#xff0c;且七進制與九進制的三位數碼表示順序正好相反。編程求此自然數,并輸出顯示。 輸入無。輸出三行&#xff1a;第一行是此自然數的十進制表示&#xff1b;第一行是此自然…

ROS——不同版本間ROS進行通信

在相同版本間的ROS進行通信不在贅述了&#xff0c;修改/etc/hosts文件即可。 最近項目遇到在Ubuntu16.04 與Ubuntu18.04兩個系統間進行ROS通信&#xff0c;ROS版本分別為Kinetic和Melodic。配置網絡后&#xff0c;兩邊都能夠ping通&#xff0c;但是在獲取ros數據是&#xff0c…

大數據開發實戰:數據流圖及相關數據技術

1、大數據流程圖 2、大數據各個環節主要技術 2.1、數據處理主要技術 Sqoop&#xff1a;&#xff08;發音&#xff1a;skup&#xff09;作為一款開源的離線數據傳輸工具&#xff0c;主要用于Hadoop(Hive) 與傳統數據庫&#xff08;MySql,PostgreSQL&#xff09;間的數據傳遞。它…

oracle 中時間類型 date 與 long 互轉

我們在保存時間到數據庫時&#xff0c;有時候會保存long型的數據&#xff0c;固定長度是13位&#xff0c;是用當前時間減去1970-01-01&#xff0c;再換算成毫秒得到的結果。 但是要考慮到時區問題中國的時區時8區所以時間要加上8小時 oracle中的實現方式&#xff1a; ---------…

Linux對包管理闡述

Centos/Redhat/Fedora的軟件包&#xff0c;都是rpm后綴的文件。包管理器rpm(Redhat packages manager) linux的哲學思想是簡單命令解決復雜任務&#xff0c;因此每個軟件的功能較單一&#xff0c;所以各種包之間有著復雜的依賴關系&#xff0c;為了解決這種可以使用前端工具&am…