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
安裝redis
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
INSTALL install
INSTALL install
INSTALL install
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 123@qq.com
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//開啟事務
OK
127.0.0.1:6379> incr itemNum
QUEUED
127.0.0.1:6379> incr itemNum
QUEUED
127.0.0.1:6379> incrby itemNum 10
QUEUED
127.0.0.1:6379> lpop itemNum//使用操作list數據結構命令操作String類型,出現錯誤
QUEUED
127.0.0.1:6379> decr itemNum
QUEUED
127.0.0.1:6379> decrby itemNum 10
QUEUED
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//開啟事務
OK
127.0.0.1:6379> incr itemNum
QUEUED
127.0.0.1:6379> incr itemNum
QUEUED
127.0.0.1:6379> discard//事務回滾
OK
127.0.0.1:6379> get itemNum
"2"
12.3 Watch
Watch監聽事務:樂觀鎖
樂觀鎖:一旦發現被監聽事務變量發生了變化,事務回滾。
127.0.0.1:6379> watch itemNum
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> decr itemNum //當檢測到itemNum發生變化時,此命令不執行。
QUEUED
127.0.0.1:6379> exec
(nil)
127.0.0.1:6379> get itemNum
"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低