Redis簡介
Redis是基于記憶體,也可以基于磁盤持久化nosql資料庫,使用c語言開發。
資料存儲結構:key-value
安裝環境準備
Redis使用c語言開發,需要使用gcc編譯程式進行編譯。
1) 安裝gcc
a) 從磁盤鏡像中進行安裝:(重新開機Linux伺服器需要重新挂載磁盤鏡像)
b) 使用yum指令直接從mine.repo檔案中本地URL下載下傳
c) 挂載指令:mount /dev/cdrom /mnt
d) 安裝指令:yum -y install gcc
2) 安裝上傳檔案插件
a) 工具上傳檔案:(隻能上傳root目錄)
b) Alt+P上傳檔案預設隻能上傳root目錄
c) 安裝插件:(可以把檔案上傳任意目錄)
- Rz(lrzsz)
- 安裝指令:yum –y install lrzsz (磁盤鏡像中直接安裝)
安裝redis
上傳安裝包
使用rz指令上傳redis安裝包,到/usr/local/hadoop目錄下:
[root@localhost hadoop]# ll
total 144964
drwxr-xr-x. 9 root root 4096 Jul 13 01:37 apache-tomcat-7.0.61
-rw-r--r--. 1 root root 8816567 May 5 2015 apache-tomcat-7.0.61.tar.gz
drwxr-xr-x. 8 uucp 143 4096 Oct 8 2013 jdk1.7.0_45
-rw-r--r--. 1 root root 138094686 Jul 13 01:28 jdk-7u45-linux-x64.tar.gz
-rw-r--r--. 1 root root 1358081 May 14 2015 redis-3.0.0.tar.gz
解壓
解壓指令:tar -zxvf redis-3.0.0.tar.gz
1) 編譯
a) 指令:make
b) 進入redis解壓目錄:執行編譯指令。
c) 執行編譯程式:生成編譯檔案在src目錄下
2) 安裝
a) 指令:make install PREFIX=/usr/local/hadoop/redis
b) 進入redis解壓目錄:執行安裝指令
[root@localhost redis-3.0.0]# make install PREFIX=/usr/local/hadoop/redis
cd src && make install
make[1]: Entering directory `/usr/local/hadoop/redis-3.0.0/src'
Hint: It's a good idea to run 'make test' ;)
INSTALL install
make[1]: Leaving directory `/usr/local/hadoop/redis-3.0.0/src'
啟動redis服務
前台啟動
啟動指令:./redis-server
特點:預設啟動前台服務,程序一種阻塞,不能直接退出,使用用戶端進行登入。

背景啟動
修改redis配置檔案,redis.conf配置檔案,此時bin安裝目錄沒有配置檔案,需要從解壓目錄中拷貝一份配置檔案即可。
1) 拷貝redis.conf配置檔案
a) redis.conf在redis解壓目錄中
b) 拷貝:cp redis.conf ../redis/bin/
[root@localhost bin]# ll
total 15520
-rw-r--r--. 1 root root 18 Jul 26 17:14 dump.rdb
-rwxr-xr-x. 1 root root 4587078 Jul 26 17:09 redis-benchmark
-rwxr-xr-x. 1 root root 22185 Jul 26 17:09 redis-check-aof
-rwxr-xr-x. 1 root root 45403 Jul 26 17:09 redis-check-dump
-rwxr-xr-x. 1 root root 4689993 Jul 26 17:09 redis-cli
-rw-r--r--. 1 root root 41403 Jul 26 17:16 redis.conf
lrwxrwxrwx. 1 root root 12 Jul 26 17:09 redis-sentinel -> redis-server
-rwxr-xr-x. 1 root root 6448257 Jul 26 17:09 redis-server
2) 修改redis配置檔案
a) daemonize no==daemonize yes
3) 啟動redis,加載配置檔案
a) 指令:./redis-server redis.conf
4) 登入redis
a) 登入指令:./redis-cli –h ip –p port
b) 登入:./redis-cli (預設登入6379端口redis服務)
Redis指令
redis是一種進階的key:value存儲系統,其中value支援五種資料類型:
1.字元串(strings)
2.字元串清單(lists)
3.字元串集合(sets)
4.有序字元串集合(sorted sets)
5.哈希(hashes)
而關于key,有幾個點要提醒大家:
1.key不要太長,盡量不要超過1024位元組,這不僅消耗記憶體,而且會降低查找的效率;
2.key也不要太短,太短的話,key的可讀性會降低;
3.在一個項目中,key最好使用統一的命名模式,例如user:10000:passwd。
Strings
Redis存儲結構是key:value,value是 strings資料類型。
指令:
文法:set key value
1) set name zhangsanfeng
a) 給Strings類型key是name 添加一個值。
2) get name
a) 擷取key是name屬性的值。
3) incr age
a) 給數字字元類型自動加1
b) 把數字字元類型自動轉換成integer類型,然後執行再加上1
4) decr age
a) 給數字字元類型自動減1
b) 把數字字元類型自動轉換成integer類型,然後執行減去1
5) incrby age 10
a) 給指定鍵值加速10
6) decrby age 10
a) 給指定鍵值減去10
Hash
Hash是集合類型,适合于用來存儲對象。Java集合類型是用來存儲對象。
存儲資料結構分析:
第一種資料結構:
存取對象,使用一個key,使用一個key擷取一個對象,必須使用反序列化。
缺點:
占用IO資源。
第二種資料結構:
使用者ID被多次使用,資料備援。資源浪費。
第三種資料結構:
Redis存儲結構:key是使用者ID value:就是hash類型資料。
1) hset user username zhaowuji
a) 給user中Username屬性設定一個值
2) hget user username
a) 擷取User中Username屬性的值
3) hdel user password …..
a) 删除User中屬性
4) hsetnx user email [email protected]
a) 如果user中email屬性值已經存在,不會覆寫
b) 如果不存在,設定值。
5) hmset user password 123 age 11
a) 同時設定多個值
6) Hmget user username age password
Lists
List集合資料結構:類似數組,資料是順序存儲。
List集合連結清單結構:通過指針從頭指針查詢到尾指針查找元素。
1) lpush mylist a b c d
a) 給list類型資料結構設定多個值
2) lrange mylist 0 -1
a) 擷取mylist集合中所有值
b) 0:值連結清單開始位置
c) -1:連結清單的結束位置
3) lpop mylist
a) 出棧集合mylist:出棧連結清單頭指針元素。
4) lrem mylist 3 a
a) 删除連結清單mylist中前3個等于a的值。
5) lset mylist 2 s
a) 給連結清單mylist集合中2角标位置設定一個值,覆寫原值。
6) linsert mylist after s b
a) 在集合連結清單mylsit中s元素後面插入一個b
Set
1) sadd myset a b c
a) 給set集合myset設定值:a b c
b) Set集合元素值不允許重複
2) smembers myset
a) 擷取集合myset中值
3) srem myset a b
a) 删除集合myset中元素
4) smove myset myset1 c
a) 把集合myset中的元素c移動到集合myset1中
Sorted set
Set集合:有序集合。
給set集合中每一進制素都設定一個得分,根據得分排序。
Set集合元素不允許重複,得分可以重複。
設定得分文法:ZADD key score member [score] [member]
1) zadd mysset 1 one 2 two 12 three 9 four 10 five
a) 給集合mysset集合添加5個元素,每一個元素都設定一個得分。
2) zcount mysset 1 10
a) 擷取分數1到10的元素個數,預設是閉區間。
3) zcount mysset (1 10
a) 擷取分數1到10的元素個數,左邊是開區間(不包含1元素)
4) zcount mysset -inf +inf
a) 擷取所有元素
b) –inf:最低值
c) +inf:最高值
5) zrange mysset 0 -1 withscores
a) 擷取集合mysset中所有元素
b) 0:頭部元素
c) -1表示尾部元素
d) Withscores:查詢元素時候,把分數查詢出來
6) zrangebyscore mysset 1 10 withscores limit 2 2
a) 根據分數大小來擷取元素:
b) Limit分頁擷取值。
多資料庫執行個體
Redis支援16個資料庫執行個體,資料庫執行個體角标從0—15,使用redis用戶端登入redis伺服器,預設登入0号資料庫。
登入其他資料庫執行個體:
登入文法:select 資料庫執行個體ID(角标)
登入1号資料庫:
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]>
需求:把0号資料庫資料移動1号資料庫
指令:move user 1 //移動user到1号資料庫
事務
事務指令:
開啟事務:multi
送出事務:exec
復原事務:discard
監聽事務:watch(樂觀鎖)
使用者A,使用者B 同時讀取商品數量itemNum=1,使用者A,使用者B都需要購買商品,商品數量需要減去1,使用樂觀鎖解決問題:
事務一緻性
設計:商品數量添加,在添加過程中出一個錯誤,檢視程式執行一緻性。
127.0.0.1:6379> multi//開啟事務
127.0.0.1:6379> incr itemNum
QUEUED
127.0.0.1:6379> incrby itemNum 10
127.0.0.1:6379> lpop itemNum//使用操作list資料結構指令操作String類型,出現錯誤
127.0.0.1:6379> decr itemNum
127.0.0.1:6379> decrby itemNum 10
127.0.0.1:6379> exec//送出事務
1) (integer) 2
2) (integer) 3
3) (integer) 13
4) (error) WRONGTYPE Operation against a key holding the wrong kind of value
5) (integer) 12
6) (integer) 2
特點:redis事務不遵循ACID大一統理論,即使中間執行出現錯誤,後面不影響執行。
12.2 事務復原
127.0.0.1:6379> mult//開啟事務
127.0.0.1:6379> discard//事務復原
127.0.0.1:6379> get itemNum
"2"
12.3 Watch
Watch監聽事務:樂觀鎖
樂觀鎖:一旦發現被監聽事務變量發生了變化,事務復原。
127.0.0.1:6379> watch itemNum
127.0.0.1:6379> multi
127.0.0.1:6379> decr itemNum //當檢測到itemNum發生變化時,此指令不執行。
127.0.0.1:6379> exec
(nil)
"0"
Redis持久化
Rdb(redis系統預設持久化政策)
Rdb持久化優點
1) 持久化檔案将隻包含一個檔案
2) 對災難恢複,主從複制 效率比較高。
3) 持久化工作:子程序
Rdb缺點
1) 資料安全性不是很好
Rdb資料持久化同步政策
預設情況下,Redis會将資料集的快照dump到dump.rdb檔案中。此外,我們也可以通過配置檔案來修改Redis伺服器dump快照的頻率,在打開redis.conf檔案之後,我們搜尋save,可以看到下面的配置資訊:
save 900 1 #在900秒(15分鐘)之後,如果至少有1個key發生變化,則dump記憶體快照。
save 300 10 #在300秒(5分鐘)之後,如果至少有10個key發生變化,則dump記憶體快照。
save 60 10000 #在60秒(1分鐘)之後,如果至少有10000個key發生變化,則dump記憶體快照。
Aof
Aof持久化優點
1) 根據redis aof同步政策,資料有更高安全性
Aof缺點
1) 性能比rdb低