爲了解決高併發、高可擴展、高可用、大數據存儲問題而產生的數據庫解決方案,就是NoSql數據庫。前端
NoSQL,泛指非關係型的數據庫,NoSQL即Not-Only SQL,它能夠做爲關係型數據庫的良好補充。linux
Redis是用C語言開發的一個開源的高性能鍵值對(key-value)數據庫。它經過提供多種鍵值數據類型來適應不一樣場景下的存儲需求,redis
目前爲止Redis支持的鍵值數據類型以下:數據庫
字符串類型、散列類型、列表類型、集合類型、有序集合類型。json
緩存(數據查詢、短鏈接、新聞內容、商品內容等等)。(最多使用)vim
分佈式集羣架構中的session分離。後端
聊天室的在線好友列表。緩存
消息隊列。(秒殺、搶購、12306等等)服務器
應用排行榜。session
網站訪問統計。
數據過時處理(能夠精確到毫秒)
官網地址:http://redis.io/
下載地址:http://download.redis.io/releases/redis-3.2.11.tar.gz
Redis是C語言開發,建議在linux上運行,本教程使用Centos6.5做爲安裝環境。
第一步:在VMware中安裝CentOS
第二步:在Linux下安裝gcc環境
[root@hadoop ~]#yum install gcc-c++
第四步:解壓縮Redis源碼包第三步:將下載的Redis源碼包上傳到Linux服務器中
[root@hadoop ~]# tar -zxvf redis-3.2.11.tar.gz -C /usr/local/src
第五步:編譯redis源碼
[root@hadoop src]# cd /usr/local/src/redis-3.2.11/ [root@hadoop redis-3.0.7]# make
第六步:安裝redis
[root@hadoop redis-3.0.7]# make install PREFIX=/usr/local/redis-3.2.11
直接運行bin/redis-server將之前端模式啓動。
[root@hadoop redis-3.0.7]# cd /usr/local/redis-3.0.7/bin [root@hadoop bin]# ./redis-server
ssh命令窗口關閉則redis-server程序結束,不推薦使用此方法
第一步:將redis源碼包/usr/local/src/redis-3.0.7中的redis.conf配置文件複製到/usr/local/redis-3.0.7/bin/下
[root@hadoop bin]# cd /usr/local/src/redis-3.0.7/ [root@hadoop redis-3.0.7]# cp redis.conf /usr/local/redis-3.0.7/bin
第二步:修改/usr/local/redis-3.0.7/bin 下的redis.conf,將daemonize由no改成yes
[root@hadoop redis-3.0.7]# cd /usr/local/redis-3.0.7/bin [root@hadoop bin]# vim redis.conf
第三步:執行命令
[root@hadoop bin]# ./redis-server redis.conf
關閉:
[root@hadoop bin]# ./redis-cli shutdown
3、Redis客戶端
[root@hadoop bin]# ./redis-cli -h 127.0.0.1 -p 6379
-p:redis實例的端口號 -h:redis服務器的ip地址
[root@hadoop bin]# ./redis-cli
Redis中存儲數據是經過key-value存儲的,對於value的類型有如下幾種:
PS:在redis中的命令語句中,命令是忽略大小寫的,而key是不忽略大小寫的。
賦值:SET key value
127.0.0.1:6379> set test 123 OK
取值:GET key
127.0.0.1:6379> get test "123「
設置/獲取多個鍵值:
MSET key value [key value …]
MGET key [key …]
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 OK 127.0.0.1:6379> get k1 "v1" 127.0.0.1:6379> mget k1 k3 1) "v1" 2) "v3"
取值並賦值: GETSET key value
127.0.0.1:6379> getset s2 222 "111" 127.0.0.1:6379> get s2 "222"
127.0.0.1:6379>del test (integer) 1
當存儲的字符串是整數時,Redis提供了一個實用的命令INCR,其做用是讓當前鍵值遞增,並返回遞增後的值。
語法:INCR key
127.0.0.1:6379> incr num (integer) 1 127.0.0.1:6379> incr num (integer) 2 127.0.0.1:6379> incr num (integer) 3
127.0.0.1:6379> incrby num 2 (integer) 5 127.0.0.1:6379> incrby num 2 (integer) 7 127.0.0.1:6379> incrby num 2 (integer) 9
127.0.0.1:6379>decr num (integer) 9 127.0.0.1:6379>decr num (integer) 8
127.0.0.1:6379> decr num (integer) 6 127.0.0.1:6379> decr num (integer) 5 127.0.0.1:6379> decrby num 3 (integer) 2 127.0.0.1:6379> decrby num 3 (integer) -1
語法:APPEND key value
127.0.0.1:6379> set str hello OK 127.0.0.1:6379> append str " world!" (integer) 12 127.0.0.1:6379> get str "hello world!"
STRLEN命令返回鍵值的長度,若是鍵不存在則返回0。
語法:STRLEN key
127.0.0.1:6379> strlen str (integer) 0 127.0.0.1:6379> set str hello OK 127.0.0.1:6379> strlen str (integer) 5
商品編號、訂單號採用string的遞增數字特性生成。201703240000000
Key value
定義商品編號key:items:id key value
192.168.101.3:7003> INCR items:id (integer) 2 192.168.101.3:7003> INCR items:id (integer) 3
假設有User對象以JSON序列化的形式存儲到Redis中,User對象有id,username、password、age、name等屬性,存儲的過程以下:
{ Id : 1, Username: zhangsan } set user { Id : 1,username: zhangsan}
保存、更新:
User對象à json(string) à redis
若是在業務上只是更新age屬性,其餘的屬性並不作更新我應該怎麼作呢?若是仍然採用上邊的方法在傳輸、處理時會形成資源浪費,下邊講的hash能夠很好的解決這個問題。
hash叫散列類型,它提供了字段和字段值的映射。字段值只能是字符串類型,不支持散列類型、集合類型等其它類型。
HSET命令不區分插入和更新操做,當執行插入操做時HSET命令返回1,當執行更新操做時返回0。
語法:HSET key field value
127.0.0.1:6379> hset user username zhangsan (integer) 1
一次能夠設置多個字段值
語法:HMSET key field value [field value ...]
127.0.0.1:6379> hmset user age 20 username lisi OK
當字段不存在時賦值,相似HSET,區別在於若是字段存在,該命令不執行任何操做
語法:HSETNX key field value
--若是user中沒有age字段則設置age值爲30,不然不作任何操做 127.0.0.1:6379> hsetnx user age 30 (integer) 0
取值
語法:HGET key field
127.0.0.1:6379> hget user username "zhangsan「
一次能夠獲取多個字段值
語法:HMGET key field [field ...]
127.0.0.1:6379> hmget user age username 1) "20" 2) "lisi"
獲取全部字段值
語法:HGETALL key
127.0.0.1:6379> hgetall user 1) "age" 2) "20" 3) "username" 4) "lisi"
語法:HDEL key field [field ...]
127.0.0.1:6379> hdel user age (integer) 1 127.0.0.1:6379> hdel user age name (integer) 0 127.0.0.1:6379> hdel user age username (integer) 1
增長數字:HINCRBY key field increment
127.0.0.1:6379> hincrby user age 2 //將用戶的年齡加2 (integer) 22 127.0.0.1:6379> hget user age //獲取用戶的年齡 "22「
判斷字段是否存在:HEXISTS key field
127.0.0.1:6379> hexists user age //查看user中是否有age字段 (integer) 1 127.0.0.1:6379> hexists user name //查看user中是否有name字段 (integer) 0
只獲取字段名或字段值
HKEYS key
HVALS key
127.0.0.1:6379> hmset user age 20 name lisi OK 127.0.0.1:6379> hkeys user 1) "age" 2) "name" 127.0.0.1:6379> hvals user 1) "20" 2) "lisi"
127.0.0.1:6379> hlen user (integer) 2
【商品id、商品名稱、商品描述、商品庫存、商品好評數量】
商品1001的信息在Redis中的key爲:[items:1001]
192.168.101.3:7003> HMSET items:1001 id 3 name apple price 999.9 OK
獲取商品信息
192.168.101.3:7003> HGET items:1001 id "3" 192.168.101.3:7003> HGETALL items:1001 1) "id" 2) "3" 3) "name" 4) "apple" 5) "price" 6) "999.9"