1. 程式人生 > >Redis深入操作(redis事務控制,樂觀鎖,密碼配置,效能監控)

Redis深入操作(redis事務控制,樂觀鎖,密碼配置,效能監控)

一、redis事務控制

1.1redis本身支援事務處理,但是這種支援的事務處理本身是存在有設計缺陷的,而且與傳統資料庫的事務控制不同,首先來看一下redis中事務支援命令:

                        .開啟事務:multi

                        .取消事務:discard

                        .提交事務:exec

1.2範例:觀察redis中的事務:

先初始化一個數據

#設定一個數據 
set age 30

現在對這個資料進行更新

#開啟事務支援
multi
#進行資料操作
set age 300
set age 3000
#這裡我們會發現一個很熟悉的單詞提示,佇列;因為我們一旦開啟了事務支援,所有的更新操作都要追加到這個更新佇列中
#y由於我們發現 300,3000對人的年齡不適合,所以我這裡關閉事務,所以資料並沒有提交,所以資料將會恢復到更新之前的狀態
discard


上面的例子給我們一種錯覺,好像確實符合事務控制的流程。

如果更新處理,執行了exec提交後,事務才會真正的執行。

看上去上面的事務控制似乎理所應當

但是這種事務本身是有bug的,因為redis的設計之初就是不要事務的。這裡的事務就是一個玩笑。

為什麼說redis事務是一個笑話呢,下面一個例子來驗證

set id huting    #設定一個數據
multi            #開啟事務支援
incr id           #【queued】進行資料操作
set age 500 #【queued】進行資料操作
exec   #提交事務
#這個時候恭喜你 ,報錯了。哈哈哈哈哈。。

原因分析:因為id的資料不是一個數字,所以不能進行自增更新,所以報錯了,但是這個不是重點,重點的是,set age 500這句命令還是被執行了,

那麼問題來了,部分提交成功,部分報錯,這叫事務嗎?現在我想你應該明白redis的事務控制是一個玩笑了。

所以nosql在應用上都是考慮不處理事務的情況居多。

二、樂觀鎖

在資料庫執行操作,為了保證資料庫的一致性,A更新 B不能更新。
所謂的鎖,在資料庫上我們分為兩種鎖
              *悲觀鎖  *樂觀鎖

悲觀鎖:基於資料庫操作實現

樂觀鎖:基於演算法的實現,在資料表上追加一個鎖的而處理列。

這裡我補充一下樂觀鎖和悲觀鎖的概念:

               悲觀鎖:SELECT * FROM table_test WHERE min = 1 FOR UPDATE
               當A在執行這條操作的時候,B只能等待。

       樂觀鎖:當A執行更新的同時 把Min的值改成了2,那麼B再執行語句的時候會更新失敗,但是不會影響其他的訪問

1.在Redis裡面 ,有直接支援樂觀鎖的。要觀察樂觀鎖的處理,則可以開啟兩個不同的session來進行處理

開啟兩個控制視窗,進行操作我這裡定義第一個為session1 第二個為session 2


我們按照下面的順序開始操作開始操作

在session1中,我們進行如下的操作

#設定一個數據:
	set age 30
	#進行這個資料的監聽
	watch age
	#啟用事務
	multi
	#這個時候我們並沒有對age做任何修改
在session 2對資料進行修改操作
	set age 500
	get age

回到session1

set age 60
#提交事務
exec

這個時候我們會發現session中的顯示內容如下:


而且我們發現session1中的資料並沒有更新成功:

原因分析:由於session2已經更新了原始資料,所以原始資料的標記列發生了變化,所以本次session1的更新就失敗了,這就是所謂的樂觀鎖。

三、redis密碼配置

因為我們現在的Redis都沒有進行認證的處理操作,那麼所有的程式都可以進行連線,為了安全我們必須設定密碼

1.在redis設計的時候並沒有像其他的資料庫那樣準備了複雜的許可權,唯一在redis裡只需要設定驗證密碼就行

#第一步 修改redis.conf檔案
vim /usr/local/src/redis/conf/redis.conf
#進入檔案找到
#requirepass footbared
#在下面追加
requirepass huting666
#儲存退出這樣子密碼就設定好了
#但是需要重新啟動一下服務
#關閉服務
killall redis-server
#重新啟動服務
/usr/local/src/redis/bin/redis-server /usr/local/src/redis/conf/redis.conf

2.進行redis登陸:

登陸redis伺服器

注意注意了,登陸我們有兩種方法

1.進入追加

/usr/local/src/redis/bin/redis-cli -h 127.0.0.1 -p 6379
#進入後追加命令
auth huting666
2.一步到位
/usr/local/src/redis/bin/redis-cli -h 127.0.0.1 -p 6379 -a huting666


!!!redis一定要設定密碼,而且在叢集開發的時候一定要將密碼進行統一

四、redis效能監控

我們要明白在一個應用中一旦使用了redis,那麼表示我們可能會大面積的使用redis
如果想知道當前的執行狀態,那麼我需要對其進行監控處理,redis本身沒有這個功能,所以我們需要採用工具實現redis的監控操作,

我們這裡採用“redis-stat”工具實現監控操作

1.為了體現redis的特點,下面建立三個redis執行程序,模擬的方式很簡單,配置不同的redis埠就行,需要準備不同的redis.conf檔案

 首先幹掉之前的redis目錄

  cd /usr/data/
  rm -r redis

我們這裡建立三個redis目錄

mkdir -p /usr/data/redis/{redis-6379,redis-6380,redis-6381}/{run,logs,dbcache}
#將之前的redis的配置檔案拷貝6379的一份
cp /usr/local/src/redis/conf/redis.conf /usr/local/src/redis/conf/redis-6379.conf

編輯每一個配置檔案修改各自的內容

 #以redis-6379為例子
 vim /usr/local/redis/conf/redis-6379.conf
修改內容:
註釋調:#bind 127.0.0.1    #取消外網訪問
設定埠
pidfile /usr/data/redis/redis-6379/run/redis-6379.pid
logfile  "路徑";
dir  路徑
完成  #這裡的具體配置可以參考我之前redis安裝教程來,由於已經寫過一次,這裡不必羅嗦了

將上面改好的檔案複製兩份:

cp /usr/local/src/redis/conf/redis-6379.conf /usr/local/src/redis/conf/redis-6380.conf
cp /usr/local/src/redis/conf/redis-6379.conf /usr/local/src/redis/conf/redis-6381.conf

使用vim命令分別先後開啟上面複製的兩份檔案

 vim /usr/local/src/redis/conf/redis-6380.conf
 #輸入面的命令進行全域性修改
 1,$s/6379/6380/
  vim /usr/local/src/redis/conf/redis-6381.conf
#輸入面的命令進行全域性修改
1,$s/6379/6381/

重啟redis服務

#重新啟動redis的服務
/usr/local/src/redis/bin/redis-server   /usr/local/src/redis/conf/redis-6379.conf
/usr/local/src/redis/bin/redis-server   /usr/local/src/redis/conf/redis-6380.conf
/usr/local/src/redis/bin/redis-server   /usr/local/src/redis/conf/redis-6381.conf

驗證redis是否ok

ps -ef | grep redis
netstat -nptl

當你輸入上面的命令出現下圖的結果,那麼恭喜你,到這裡redis的模擬叢集搭建好了

2.本機redis程序有了 

  下一步通過GITHUB下載redis-stat開發包

首先你要想使用redis-stat檢測包必須下載ruby相關的環境:

注意這裡一定要安裝新版本的2.0.0以上的版本,不然後面你就等著報錯吧!

然後git上的redis-stat工具下載到/usr/local/目錄中

cd /usr/local
git clone https://github.com/junegunn/redis-stat.git

注意假如你的機器沒有安裝git,這裡會提示你的命令無效,這個時候需要你進一步安裝git

sudo yum install git
對不起,到這一步還不能使用,下載的redis-state裡實際上只有一個執行命令,如果要使用這個命令,則
進入到bin目錄下
cd /usr/local/redis-stat/bin
#執行如下執行進行安裝
gem install redis-stat

最後一步:啟動redis-stat工具進行監聽

#首先這裡檢視一下自己的ip
ifconfg
/usr/local/redis-stat/bin/redis-stat 162.38.134.37:6379 162.38.134.37:6380 162.38.134.37:6381 -a huting666

當你輸入最後這條指令是,就會出現下圖所以的效能檢查表,恭喜你!


但是到這裡我們還沒有完,我們總部能每次檢視redis效能都去後臺檢視。(另外值得注意的是這裡的ruby最好使用2.3.0版本,不然太新和太久都會報錯,不要為我為什麼,因為我經歷過!哈哈)

/usr/local/redis-stat/bin/redis-stat 阿里雲ip:6379 阿里雲ip:6380 阿里雲ip:6381 -a huting666 --server=80 --daemon --verbose

執行完之後到你的window瀏覽器中輸入你的ip地址即可,因為這裡使用的是80埠,所以不需要新增埠號。


到這裡效能監控就全做完了。

相關推薦

Redis深入操作redis事務控制樂觀密碼配置效能監控

一、redis事務控制1.1redis本身支援事務處理,但是這種支援的事務處理本身是存在有設計缺陷的,而且與傳統資料庫的事務控制不同,首先來看一下redis中事務支援命令:                        .開啟事務:multi                 

1101-(JS)Redis list操作新增獲取,返回json資料轉成list

Redis list操作(新增,獲取),返回json資料轉成list 2018年03月16日 10:14:11 lxslxslxs123 閱讀數:1083 標籤: Redis C# JSON List 更多 個人分類: C# 版權宣告:本文為博主原創文章,未經博主允許不得轉載。 ht

5種redis常用操作數據類型+鍵值+服務+安全

管理 4.0 empty 目錄 打開 mman linux process tables [toc] 5種redis常用數據類型操作 一、Redis常用操作 (string, list) 1.1 如果一個key設置兩個不同的值,第二個值會覆蓋第一個值。 [root@xavi

redis深入瞭解

redis的常見問題:1.redis是記憶體版資料庫,如果記憶體滿了怎麼辦?方案一.. redis叢集1)一定程度可以解決記憶體不夠用的情況2)但是隨著網站使用者不斷增多,使用者所產生的資料將會愈來愈多

redis學習記錄redis的持久化操作、基於java的jedis操作

package redis;       import java.util.List;   import java.util.UUID;       import redis.clients.jedis.Jedis;   import redis.clients.jedis.ShardedJedis;  

SpringBoot中 整合 redisTemplate 對 Redis操作

SpringBoot中 整合 redisTemplate 對 Redis 的操作(二) List 型別的操作 1、 向列表左側新

SpringBoot中 整合 redisTemplate 對 Redis操作Set

SpringBoot中 整合 redisTemplate 對 Redis 的操作(三)Set 1、新增set型別,並且如果存在的

Python Redis常用操作持續更新

[TOC] # 1、Redis簡介 `redis`是業界主流的`key-value`,`nosql`資料庫之一。和Memcached類似,它支援儲存的value型別相對更多,包括`string`(字串)、`list`(列表)、`set`(集合)、`zset`(sorted set --有序集合)和`hash

04 -pandas索引的堆行列操作交換行列、聚合操作求和、最大值、最小值、平均值等

引入模組 import pandas as pd from pandas import Series,DataFrame import matplotlib.pyplot as plt 建立示例DataFrame # 用作案例 不要刪 !!! data=np.random.ra

redis常用操作redis操作鍵值、 redis安全設定

一:redis常用操作 Redis常用操作 (string, list)set key1 aminglinuxget key1set key1 aming//第二次賦值會覆蓋setnx key2 aaa //返回1 如果key2不存在直接建立keysetnx key2 bbb //返回0,如果ke

redis常用操作redis操作鍵值、 redis安全設置

批量 打印 1-1 sele 設置 glin 取消 and 第一個元素 一:redis常用操作 Redis常用操作?(string, list)set key1 aminglinuxget key1set key1 aming//第二次賦值會覆蓋setnx key2 aaa

redis 字串(String) redis學習三

字串命令 基本命令 SET 命令 Get 命令 Getrange 命令 Getset 命令 Mget 命令 Setex 命令 Setnx(SET i

redis -- python操作連線redis

1.先安裝 redis,pyredis sudo pip install redis   sudo pip install python-redis 2.示例: importredis >>>r=redis.Redis(host='localhos

redis鍵過期 redis 2.6及以上)

發現 ash name 副本 文件 unix 刪除 所有 second EXPIRE key seconds 用來對一個鍵設置一個過期時間,第二個參數表示經過多少秒後鍵過期。 一個鍵過期後, 這個鍵將會被自動刪除。 在Redis術語中,帶有過期時間的鍵經常被稱作vola

Redis學習五Redis 阻塞的原因及其排查方向.

## 一、慢查詢 因為 Redis 是單執行緒的,大量的慢查詢可能會導致 redis-server 阻塞,可以通過 slowlog get n 獲取慢日誌,檢視詳情情況。 ## 二、bigkey 大物件 bigkey 大物件可能會導致的問題包括: - 記憶體空間不均勻(平衡),例如在 Redis Clust

48次課Nginx防盜鏈、Nginx訪問控制、Nginx解析php相關配置、Nginx代理

curl urn real-ip connect referer ini adf accept txt Nginx防盜鏈 編輯虛擬配置文件 [root@100xuni1 ~]# vim /usr/local/nginx/conf/vhost/test.com.conf

SQLAlchemy會話與事務控制:互斥和共享

關於sqlalchemy,可以細度這個網址:http://www.codexiu.cn/python/SQLAlchemy%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/73/531/   5.2. for update SQLAlchemy 的 Query

多執行緒與高併發基礎一超發--悲觀樂觀

關鍵詞: 執行緒,同步,單例,高併發,高訪問,死鎖 一、大規模併發帶來的挑戰 在過去的工作中,我曾經面對過5w每秒的高併發秒殺功能,在這個過程中,整個Web系統遇到了很多的問題和挑戰。如果Web系統不做針對性的優化,會輕而易舉地陷入到異常狀態。我們現在一起來討論下

NSDate 的一些操作比較、建立、在現有date加減一定時間等

建立當前時間 NSDate *date = [NSDate date]; 從現在開始的24小時         NSTimeInterval a_day = 24*60*60;      

R語言-向量化操作apply、tapply、lapply、sapply、mapply、table等

一、apply函式(對一個數組按行或者按列進行計算):  使用格式為: apply(X, MARGIN, FUN, ...)其中X為一個數組;MARGIN為一個向量(表示要將函式FUN應用到X的行還是列),若為1表示取行,為2表示取列,為c(1,2)表示行、列都計算。app