1. 程式人生 > >Redis(三)進階操作

Redis(三)進階操作

Redis進階操作

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

1.開啟事務:multi
2.取消事務:discard
3.提交事務:exec

範例:觀察Redis中的事務:
設定一個數據:set age 30
開啟事務支援:multi 執行完畢提示OK
(QUEUED)進行資料操作:set age 300
(QUEUED)進行資料操作:set age 3000
關閉事務:discard
操作完畢,age值仍然是30
一旦我們開啟了Redis事務控制,則表示所有的更新操作都要追加到一個更新佇列之中。
由於現在執行完更新之後,發現數據本身出現有問題了,所以選擇關閉事務,一旦事務關閉之後那麼該操作將會回滾到最初的狀態。

執行事務的提交:
設定一個數據:set age 30
開啟事務支援:multi 執行完畢提示OK
(QUEUED)進行資料操作:set age 50
提交事務:exec

如果在事務開啟狀態下進行了更新處理,隨後只有執行了exec指令後才表示事務真正提交,才會真正影響到原始資料(有bug)

但是需要提醒的是,Redis設計之初就是不考慮事務的,所以以上的事務只能夠說是Redis的一個玩笑。因為這種事務設計的並不完善
比如:
設定一個數據:set id mldn
開啟事務支援:multi 執行完畢提示OK
(QUEUED)進行資料操作:incr id
(QUEUED

)進行資料操作:set age 500
提交事務:exec

提交事務時會報錯:
1)ERR value is not an integer or out of range
2)Ok
這個時候事務一旦提交會出現錯誤資訊,因為id的資料不是數字,所以無法進行數字的增長,但是set age 500執行了,而且一旦出現了錯誤之後,其他的更新操作依然可以正常完成。

NoSql一般都不考慮事務的處理

  • 樂觀鎖
    在資料庫執行操作的時候,為了保證資料的一致性,即A使用者更新資料的時候B使用者不能夠更新。所謂的鎖在資料庫的設計上分為兩種,一種叫悲觀鎖,一種叫樂觀鎖,

悲觀鎖:基於資料庫的操作實現
select * from member where mid=1 for update;
一旦加上for update 該條資料無法更新

樂觀鎖:基於演算法的實現,在我們的資料表上追加一個鎖的處理列,
這裡寫圖片描述
在每次提交前,都會進行鎖編號的判斷,一致則可以提交,不一致說明其他使用者修改了此值,需要再次取值提交。

在Redis裡邊是直接支援樂觀鎖的,如果想要觀察樂觀鎖的處理,則可以開啟兩個不同的session

1.【第一個session】執行如下的操作:
設定一個數據:set age 30
進行該資料的監聽:watch age
啟用事務:multi
這個時候並沒有對age資料做任何修改;
2.【第二個session】執行如下的操作–對資料進行修改操作:
覆蓋age資料:set age 500
取得age資料:get age
3.【第一個session】對資料進行修改
修改資料:set age 60
提交事務:exec
此時由於第二個session已經更新了原始的資料,那麼就表示該原始資料上的一個標記列更新,這樣當第一個session更新的時候會發現返回了‘nil’,意味著本次更新失敗。

Redis最大的特徵就是把標誌位給隱含掉了,如果是關係型資料庫則需要手動標記,然後再進行處理操作

  • Redis密碼配置
    如果說你現在的redis沒有進行認證的處理操作,那麼所有的程式都可以進行連線,直接使用redis-cli命令只需要設定上主機名稱和埠號就可以進行連線處理,那麼為了安全必須要設定密碼

在redis資料庫設計的時候並沒有像其他資料庫那樣準備了一堆複雜的密碼或者許可權的概念,在Redis裡面只需要設定一個認證密碼就可以解決問題了,沒有所謂的使用者名稱等問題

1.修改redis.conf配置檔案
找到reuqirepass foobared
追加以下內容:
requirepass wanghaoxin
2.隨後關閉redis服務並且重新啟動:
關閉redis服務:killall redis-server
重新啟動redis服務:/usr/local/redis/conf# /usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf

3.登陸Redis伺服器
/usr/local/redis/conf# /usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 6379

–這個時候發現可以正常登陸Redis資料庫,但是一旦執行資料操作,key * 等操作,就會出現(error) NOAUTH Authentication required錯誤資訊。
–此時需要執行如下命令進行認證處理:
auth wanghaoxin
–或者直接在登陸的時候使用密碼引數
/usr/local/redis/conf# /usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 6379 -a wanghaoxin

所有的Redis服務一定要有認證密碼,而且作為Redis叢集開發設計的時候一定要將所有密碼統一

  • *Redis效能監控
    Redis作為快取資料庫使用,那麼一旦在開發之中使用了Redis資料庫,就表示有可能會大面積的去向Redis裡面儲存資料(快取的目的:不斷的快速讀取和寫入)
    那麼現在如果要想知道當前的執行狀態,那麼就需要對其進行監控處理,如果要進行Redis監控,Redis本身沒有提供,必須通過其他元件完成,本次使用一個”redis-stat”工具實現Redis監控操作,這個工具可以直接通過GitHub找到
    redis-stat下載地址:
    https://github.com/junegunn/redis-stat
    1.為了更加清楚的發現redis-stat的特點,建立三個redis執行進行程序,模擬方法很簡單,配置不同的redis埠即可,也就是說你需要準備出不同的redis.conf配置檔案:
    2.建立redis資料的儲存目錄,要求可以同時儲存三個redis程序
    進入到/usr/data目錄下,
    刪除redis目錄:rm -r redis/
    執行:mkdir -p /usr/data/redis/{redis-6379,redis-6380,redis-6381}/{run,logs,dbcache}
    3.將之前的redis.conf檔案拷貝三份
    cp /usr/local/redis/conf/redis.conf /usr/local/redis/conf/redis-6379.conf
    cp /usr/local/redis/conf/redis.conf /usr/local/redis/conf/redis-6380.conf
    cp /usr/local/redis/conf/redis.conf /usr/local/redis/conf/redis-6381.conf
    4.編輯每一個配置檔案,修改各自的內容,以redis-6379為例

取消外網訪問的限制:#bind 127.0.0.1(不寫意味著redis無法被外部java程式訪問使用)
設定埠:port 6379
修改pid儲存路徑:pidfile /usr/data/redis/redis-6379/run/redis_6379.pid
修改log日誌檔案路徑:logfile “/usr/data/redis/redis-6379/logs/redis.log”
修改資料檔案日誌目錄:
dir /usr/data/redis/redis-6379/dbcache

同理:修改其它檔案
或者可以採用複製替換:
1,$s/6379/6381/g
代表從第一行到最後 全域性替換
6.啟動所有的redis服務
/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis-6379.conf
/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis-6380.conf
/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis-6381.conf
ps -ef|grep redis
netstat -nptl檢視
本機redis三個程序全部有了

7.通過GitHub下載redis-stat開發包
如果要想使用redis-stat,必須下載ruby相關環境;
apt-get install ruby-dev rubygems;
將該工具下載到“/usr/local”目錄之中:cd /usr/local/;
進行redis-stat的下載
git clone https://github.com/junegunn/redis-stat.git

8.下載下來的redis-stat裡面實際只有一個執行命令
/usr/local/redis-stat/bin/redis-stat
必須進入到redis-stat所在的目錄:
cd /usr/local/redis-stat/bin
如果要想使用這個命令,則必須使用ruby進行該命令的處理(否則不能使用):
gem install redis-stat
9.啟動redis-stat工具進行監聽控制:(-a wanghaoxin 為許可權認證)

/usr/local/redis-stat/bin/redis-stat 192.168.231.128:6379 192.168.231.128:6380 192.168.231.128:6381 -a wanghaoxin

10.該工具還支援Web啟動檢視,也就是它內部自動提供有一個HttpServer:

/usr/local/redis-stat/bin# /usr/local/redis-stat/bin/redis-stat 192.168.231.128:6379 192.168.231.128:6380 192.168.231.128:6381 -a wanghaoxin –server –daemon –verbose

此時預設埠為63790
也可以:
/usr/local/redis-stat/bin# /usr/local/redis-stat/bin/redis-stat 192.168.231.128:6379 192.168.231.128:6380 192.168.231.128:6381 -a wanghaoxin –server=80 –daemon –verbose
表示80埠

( –verbose :表示展示更多資訊,–server :Launch redis-stat web server (default port: 63790) –daemon :後臺執行)

11.使用redis提供的測試工具來做測試:
/usr/local/redis/bin/redis-benchmark -h 192.168.231.128 -p 6379 -a wanghaoxin -c 100 -d 10 -n 100
/usr/local/redis/bin/redis-benchmark -h 192.168.231.128 -p 6380 -a wanghaoxin -c 100 -d 10 -n 100
/usr/local/redis/bin/redis-benchmark -h 192.168.231.128 -p 6381 -a wanghaoxin -c 100 -d 10 -n 100

這樣可以在瀏覽器中監控情況
這裡寫圖片描述

可以根據監控情況可以及時調整伺服器的硬體設施,也可以推算出使用者的訪問情況

  • 使用java操作redis資料庫
    1.java連線redis資料庫

Redis本身提供有一個java語言支援,(不僅僅支援java,各個語言都支援),這個元件為jedis元件,也就是說如果你要進行Redis的程式設計開發,就需要通過maven獲取該元件:

開啟mavenrepository:
http://mvnrepository.com/
查詢jedis:
獲取最新版本(最好匹配最新版本因為redis是最新版本)

1.新建一個jedis的Maven專案:
2.修改pom.xml配置檔案,追加相應的開發包以及外掛
3.如果要進行redis資料庫的連線,千萬不要做地址的繫結(鬥則會不能使用 即把bind 127.0.0.1註釋掉)

這裡寫圖片描述

正常返回:PONG

如果此時伺服器返回的內容為”PONG”,就表示連線成功

  • Jedis資料操作
    Jedis如果要進行資料操作實際上與Redis使用的命令是相同的,也就是說整體的Jedis處理的時候所使用的方法名稱就是命令名稱
    1.設定字串資料

這裡寫圖片描述

2.設定有效時間的資料
這裡寫圖片描述

3.操作Hash資料 hset、hget
這裡寫圖片描述

4.操作List資料 lpush

這裡寫圖片描述

5.操作set資料 sadd
這裡寫圖片描述

6.操作SortedSet集合 zadd
這裡寫圖片描述

7.取得對應的成績資料:
這裡寫圖片描述

返回Tuple,進行迭代遍歷:

這裡寫圖片描述

這裡寫圖片描述

8.keys處理操作,使用keys可以獲得全部的key的資訊

這裡寫圖片描述

取得user-*的key值

從Jedis整體的設計風格來看,不會讓使用者覺得其特別複雜,相反可以會覺得容易輕鬆上手

  • Jedis連線池
    如果直接使用Jedis可以直接進行資料庫的操作,但是每一次的開啟和關閉實在太浪費效能了,所以為了提升操作效能,一定要使用資料庫連線池的模式來進行處理,幸運的是Jedis開發包直接提供了資料庫連線池的操作支援。

範例:實現資料庫連線池
首先,如果想要使用Jedis連線池,則必須有一個類可以儲存所有連線池相關屬性的配置項,

JedisPoolConfig poolconfig = new JedisPoolConfig();
poolconfig.setMaxTotal(MAX_TOTAL);//設定最大連線數
poolconfig.setMaxIdle(MAX_IDLE);//設定空閒的連線數
poolconfig.setMaxWaitMillis(MAX_WAIT_MILLIS);//設定最大等待時間
poolconfig.setTestOnBorrow(TEST_ON_BORROW );//是否要進行連線測試,以保證返回的連線為可用連線

設定常量

public static final int MAX_TOTAL = 1000;//最大連線數
public static final int MAX_IDLE = 200;//設定最大等待時間
public static final int MAX_WAIT_MILLIS = 1000;//設定最大等待時間
public static final boolean TEST_ON_BORROW =true;//是否進行可用測試
public static final int TIMEOUT = 2000;//連線超時時間
JedisPool pool = new JedisPool(poolconfig ,reids_Host ,redis_Port,TIMEOUT,redis_Auth);
//現在所有連線被pool所管理
Jedis jedis = pool.getResource();//通過連線池獲取連線物件
jedis.set("mldn","www.mldn.cn")
jedis.close();
pool.close();//關閉連線池

這裡寫圖片描述

專案執行結束才關閉連線池(容器關閉)

以後的所有資料庫操作都必須使用連線池技術完成