非關係型數據庫 -- redis

1、Redis介紹

  (一)NoSql介紹

  爲了解決高併發、高可擴展、高可用、大數據存儲問題而產生的數據庫解決方案,就是NoSql數據庫。前端

NoSQL,泛指非關係型的數據庫NoSQL即Not-Only SQL,它能夠做爲關係型數據庫的良好補充。linux

  (二)Redis

  Redis是用C語言開發的一個開源的高性能鍵值對(key-value)數據庫。它經過提供多種鍵值數據類型來適應不一樣場景下的存儲需求,redis

目前爲止Redis支持的鍵值數據類型以下:數據庫

字符串類型、散列類型、列表類型、集合類型、有序集合類型json

  (三)Redis應用場景

  緩存(數據查詢、短鏈接、新聞內容、商品內容等等)。(最多使用vim

  分佈式集羣架構中的session分離。後端

  聊天室的在線好友列表。緩存

  消息隊列。(秒殺、搶購、12306等等)服務器

  應用排行榜。session

  網站訪問統計。

  數據過時處理(能夠精確到毫秒)

2、Redis安裝配置

  (一)redis下載

官網地址:http://redis.io/

下載地址:http://download.redis.io/releases/redis-3.2.11.tar.gz

  (二)redis安裝

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

  (三)redis啓動

前端啓動   

  • 啓動方式:

直接運行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程序結束,不推薦使用此方法

  • 前端啓動的關閉:ctrl+c

後端啓動

第一步: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

4、Redis數據類型

Redis中存儲數據是經過key-value存儲的,對於value的類型有如下幾種:

  • 字符串
  • Hash類型
  • List
  • Set
  • SortedSet(zset)

PS:redis中的命令語句中,命令是忽略大小寫的,而key是不忽略大小寫的。

  (一)String類型

命令

賦值: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"

刪除:DEL key

127.0.0.1:6379>del test
(integer) 1

數值增減 

n 遞增數字

當存儲的字符串是整數時,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

n 增長指定的整數: INCRBY key increment

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

n 遞減數值:DECR key

127.0.0.1:6379>decr num
(integer) 9
127.0.0.1:6379>decr num
(integer) 8

n 減小指定的整數DECRBY key decrement

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的做用是向鍵值的末尾追加value。若是鍵不存在則將該鍵的值設置爲value,即至關於SET key value。返回值是追加後字符串的總長度。向尾部追加值

語法: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

  (二)Hash類型

使用string的問題:

假設有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能夠很好的解決這個問題。

redis 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"

語法:HLEN key獲取屬性數量

127.0.0.1:6379> hlen user
(integer) 2

應用

存儲商品信息

  • 商品字段

【商品id、商品名稱、商品描述、商品庫存、商品好評數量】

  • 定義商品信息的key

商品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"
相關文章
相關標籤/搜索