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