Redis叢集介紹及五大資料類型-1

來源:互聯網
上載者:User

標籤:cluster   redis   

Redis介紹:

redis 是一個開源的、使用C語言編寫的、支援網路互動的、可以基於記憶體也可以持久化的Key-Value資料庫。

redis的源碼非常簡單,只要有時間看看譚浩強的C語言,在去看redis的源碼能看懂50-60%。

redis目前最大的叢集應該是新浪的應該。

redis目前是vmvaer來支援的,很多的開源軟體都需要某些組織來支援的。如果一個開源軟體沒有金錢來支援的話很難走的持久

Redis和Memcached對比:

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/75/18/wKioL1Yy0AjDD0zqAAHJ1UsUaF8076.jpg" title="123.png" alt="wKioL1Yy0AjDD0zqAAHJ1UsUaF8076.jpg" />

名詞解釋:

持久化:以電商舉例,session用memcache來做的,購物車用redis來做的,當你退出的時候會提示你購物車裡的物品會在你退出後繼續儲存。相對來說memcache儲存更單一化!

主從複製:redis的主從複製類似mysql的主從複製但是原理是不同的

虛擬記憶體:說白了就是把記憶體裡一些不用的東西放在硬碟上,最好不要用,降低效率,現在記憶體來說比較便宜。

一、安裝:

1、檢查配置環境

檢查gcc是否安裝,如果沒有安裝:yum -y install gcc 

2、下載安裝Redis

cd /opt/wget http://download.redis.io/releases/redis-3.0.4.tar.gztar -xvf redis-3.0.4.tar.gzmake make install cd /opt/redis-3.0.4/src/ make test

3、配置redis

cp /opt/redis-3.0.4/utils/redis_init_script /etc/init.d/redis      #複製管理指令碼chmod +x /etc/init.d/redismkdir /etc/rediscp /opt/redis-3.0.4/redis.conf /etc/redis/6379.conf這樣是啟動的時候是啟動在前台的,把他改為啟動在後台vim /etc/redis/6379.confdaemonize no  改為 daemonize yes添加至系統服務vim /etc/init.d/redis#chkconfig: 3595 95  #添加至檔案推出執行命令:Chkconfig –add redischkconfigredis on

二、redis基礎操作

set 設定Key

get 判斷Key的值

exists 判斷Key是否存在

keys 顯示所有的Key

del 刪除指定Key

type 擷取Key類型

註:redis是不區分大小寫,命令最好使用大寫這樣能區分是命令還是參數!!!!

例子:

1、set的例子:

192.168.0.201:6379> SET hello heheOK192.168.0.201:6379> GET hello"hehe"

2、設定多個key value 然後使用使用keys * 去查看所有

192.168.0.201:6379> SET hello1 hehe1OK192.168.0.201:6379> SET hello2 hehe2OK192.168.0.201:6379> KEYS  *1) "hello1"2) "hello"3) "hello

KEY匹配方式:

?匹配單個

 *匹配所有


3、判斷key是否存在

判斷Key是否存在使用:EXISTS   他返回的是整形:0不存在,1存在

192.168.0.201:6379> EXISTS hello(integer) 1192.168.0.201:6379> EXISTS hehe(integer) 0

4、刪除KEY

192.168.0.201:6379> DEL hello(integer) 1   #這裡的1是數量刪除多個測試下:192.168.0.201:6379> DEL hello1 hello2(integer) 2

5、查看類型TYPE

只要用set類型就是字串。查看類型命令用TYPE

192.168.0.201:6379> TYPE hellostring

6、Keyspace

redis是支援多個執行個體的預設最多16個,可以修改設定檔來支援更多!

使用INFO命令查看!

# Keyspacedb0:keys=1,expires=0,avg_ttl=0db0 :這個可以理解為命名空間。最多支援16個,使用SELECT 去切換192.168.0.201:6379> SELECT 1OK嘗試添加一個key-valueSET db1 hehe然後在使用INFO看下# Keyspacedb0:keys=1,expires=0,avg_ttl=0db1:keys=1,expires=0,avg_ttl=0

7、配置redis設定檔

logfile "/var/log/redis.log"  指定記錄檔如果不指定就會在控制台輸出

port 6379     

databases 16  預設支援的最多16個database可以修改

dir ./   這個是指預設的持久化設定檔放在那裡!建議修改下!

pidfile /var/run/redis_6379.pid     #如果起多個執行個體的話上面的都需要改


儲存退出停止服務

 [[email protected]]$ /etc/init.d/redis stop

/var/run/redis_6379.pid does not exist, process is not running

這個是應為6379.conf的設定檔裡指定的設定檔是不對,和/etc/init.d/redis不同修需要修改下!

pidfile /var/run/redis_6379.pid

vim /etc/redis/6379.conf

然後kill掉redis進程測試下!start | stop

三、redis的5大資料類型

他用不同的命令來區分你要操作什麼資料類型

類型不能嵌套,不能混! 但是有個王炸:set能把所有的類型都改為字串類型

1、字串類型 

SET

GET

DEL

APPEND  在值的後面追加

set能重新設定但是要追加的話使用APPEND最好比如:

192.168.0.201:6379> SET hehe helloOK192.168.0.201:6379> GET hehe"hello"192.168.0.201:6379> APPEND hehe ,world(integer) 11192.168.0.201:6379> GET hehe"hello,world"

可以同時設定多個值和查詢值用MSET 和MSET

192.168.0.201:6379> MSET key1 v1 key2 v2 key3 v3OK192.168.0.201:6379> MGET key1 key2 key31) "v1"2) "v2"3) "v3"

擷取字串長度

192.168.0.201:6379> STRLEN hehe(integer) 11

如果字串是中文的他會按照UTF-8格式的來輸出1個字等3個字串來算的

192.168.0.201:6379> SET key "呵呵"OK192.168.0.201:6379> GET key"\xe5\x91\xb5\xe5\x91\xb5"

2、自增類型

比如說投票點下+1 ,如果說用set每點一次修改set下那就不太現實。所有redis有個自增類型:INCR

192.168.0.201:6379> INCR num           #預設如果沒有這個值的話,INCR就會自動建立一個值預設為零,當你沒執行一次他就會+1(integer) 1192.168.0.201:6379> INCR num(integer) 2192.168.0.201:6379> INCR num(integer) 3192.168.0.201:6379> INCR num(integer) 4192.168.0.201:6379> INCR num(integer) 5192.168.0.201:6379> INCR num(integer) 6

如果想加多個呢:INCRBY 

192.168.0.201:6379> INCRBY num 10(integer) 57192.168.0.201:6379> INCRBY num 10(integer) 67192.168.0.201:6379> INCRBY num 10(integer) 77192.168.0.201:6379> INCRBY num 10(integer) 87192.168.0.201:6379> INCRBY num 10(integer) 97192.168.0.201:6379> INCRBY num 10(integer) 107

減呢? DECR 

192.168.0.201:6379> DECR num(integer) 106192.168.0.201:6379> DECR num(integer) 105192.168.0.201:6379> DECR num(integer) 104

如果要是減多個呢:DECRBY

192.168.0.201:6379> DECRBY num 5(integer) 97192.168.0.201:6379> DECRBY num 5(integer) 92192.168.0.201:6379> DECRBY num 5(integer) 87192.168.0.201:6379> DECRBY num 5(integer) 82

想支援小數點:

INCRBYFLOAT key 0.1192.168.0.201:6379> INCRBYFLOAT key 0.1"0.1"192.168.0.201:6379> INCRBYFLOAT key 0.1"0.2"192.168.0.201:6379> INCRBYFLOAT key 0.1"0.3"192.168.0.201:6379> INCRBYFLOAT key 0.1"0.4"

3、散列類型

雜湊

和資料庫存的表似的,表不是的有欄位吧,可以給每個欄位設定個值

HSET Key field value

HGET Key field

HMSET Key field value [field value....]

HMGET Key field [field ...]

HGETALL Key

HDEL

設定散列類型:

192.168.0.201:6379> HSET shouji name iphone(integer) 1192.168.0.201:6379> HSET shouji co red(integer) 1192.168.0.201:6379> HSET shouji price 8888(integer) 1

查詢:

192.168.0.201:6379> HGET shouji name"iphone"192.168.0.201:6379> HGET shouji co"red"192.168.0.201:6379> HGET shouji price"8888"192.168.0.201:6379> HGETALL shouji1) "name"2) "iphone"3) "co"4) "red"5) "price"6) "8888"

其實現在看著不是好看的但是他通過一些API調用到網頁上,通過排版取出來的值就好看了

192.168.0.201:6379> HMSET diannao name thinkpad co black price 30OK192.168.0.201:6379> HMGET diannao name co price1) "thinkpad"2) "black"3) "30"

4、清單類型

清單類型:他是儲存一個有序的字串列表   這個“有序”是什麼時候進來的!

列表你向左邊添加和右邊添加他的時間複雜度是一樣的!O1(時間複雜度)

可以理解為:我這個速度不隨著數量的增加而增加!比如1000行和1萬行他的時間開銷是一樣的!    大學資料結構裡學的


時間複雜度:

同一問題可用不同演算法解決,而一個演算法的品質優劣將影響到演算法乃至程式的效率。演算法分析的目的在於選擇合適演算法和改進演算法。

電腦科學中,演算法的時間複雜度是一個函數,它定量描述了該演算法的已耗用時間。


但是他有個缺點,比如說裡面有1萬個key你想找到第999個這就比較勁了他從1開始數數到999

                優點,你讀前100個,卡直接讀頭部就非常快了


LPUSH key value [value ...]

RPUSH key value [value ...]

               LPOP key

               RPOP key

     LRANGE key start stop

     LREM key count value


從左邊添加key

192.168.0.201:6379> LPUSH num 0(integer) 1192.168.0.201:6379> LPUSH num 1(integer) 2192.168.0.201:6379> LPUSH num 2(integer) 3

現在是從左邊加

2 1 0

從右邊開始加

192.168.0.201:6379> RPUSH num 3(integer) 4
2 1 0

3

192.168.0.201:6379> RPUSH num 5(integer) 5
2 1 0 3 5

如果想擷取長度就使用LNE 嗎!擷取清單類型長度就是:LLEN

192.168.0.201:6379> LLEN num(integer) 5

從左邊拿key

從清單類型裡拿出這個key來(拿出來就沒有了),從左邊拿左邊第一個

192.168.0.201:6379> LPOP num"2"

左邊第一個是2那麼拿出來之後這個key這個key就變成

1 0 3 5

從右邊拿key,從右邊拿右邊第一個   (這個5就被拿出來了)

192.168.0.201:6379> RPOP num"5"

現在在看下這個key的長度

192.168.0.201:6379> LLEN num(integer) 3

擷取列表的某一個範圍:

現在是這個值

1 0

3

192.168.0.201:6379> LRANGE num 0 1              #取0 - 1 的值1) "1"2) "0"

###這個值的輸出結果是這樣的:預設你是從左邊取值的,那麼0-1的值是這樣的,左邊的第一個元素是1(對應0這個標識位),左邊的第二個元素是0(對應1這個標識位)

這個不太好理解有點繞,那麼在添加兩個值來更詳細的說明

192.168.0.201:6379> LPUSH num 2(integer) 4192.168.0.201:6379> RPUSH num 4(integer) 5
192.168.0.201:6379> LRANGE num 0 -1     #這裡的(-1)表示左邊第一個1) "2"2) "1"3) "0"4) "3"5) "4"

擷取指定元素的值:

擷取右邊的第一個值:

192.168.0.201:6379> LINDEX num -1"4"

擷取左邊邊的第二個值:

192.168.0.201:6379> LINDEX num -2"3"

那-3呢?

192.168.0.201:6379> LINDEX num -3"0"

這個就是從右邊數的第3個值!!!!!


從左邊擷取值

192.168.0.201:6379> LINDEX num 0"2"192.168.0.201:6379> LINDEX num 1"1"

只保留指定資料


只保留0到2的資料

192.168.0.201:6379> LTRIM num 0 2OK看下結果:192.168.0.201:6379> LRANGE num 0 -11) "2"2) "1"3) "0"


這個有什麼用呢:

寫日誌的時候,我這個緩衝區,只保留最近100條日誌!

比如:

192.168.0.201:6379> LPUSH logs newloghehe(integer) 1192.168.0.201:6379> LTRIM num 0 99OK

這樣的話我的列表永遠只有100條,我只看最近100條的日誌!!

5、集合類型

集合是高一學的,第一個學期就是學的集合

交集∩、並集∪、合集、等 0 0 !


集合的元素是沒有類型的!

用到集合類型的應用有:(新浪微博分享了很多的redis應用)

比如:關注微博,比如咱倆是否共同關注了某一個人等。

添加集合

192.168.0.201:6379> SADD jihe1 a b c(integer) 3

查看集合內容

192.168.0.201:6379> SMEMBERS jihe11) "c"2) "a"3) "b"

判斷集合元素是否存在

192.168.0.201:6379> SISMEMBER jihe1 d(integer) 0192.168.0.201:6379> SISMEMBER jihe1 a(integer) 1返回0 說明不存在返回1說明存存在

集合間運算

支援:交集、差集、並集

差集運算:

192.168.0.201:6379> SDIFF jihe1 jihe21) "a"
jihe1 a b c
jihe2 c d

jihe1 減去jihe2 減去相同的b c  ,  jihe1 還剩下a

同理:

jihe2 減去jihe1

192.168.0.201:6379> SDIFF jihe2 jihe11) "d"

差集運算可以設定多個


交集運算:

 192.168.0.201:6379> SINTER jihe1 jihe21) "c"2) "b"
交集可以設定多個:在添加一個jihe3192.168.0.201:6379> SADD jihe3 d e f(integer) 3192.168.0.201:6379> SINTER jihe1 jihe2 jihe3(empty list or set)

#這個是因為他是jihe1和jihe2先做交集運算,然後在和jihe3做交集運算

並集運算

192.168.0.201:6379> SUNION jihe1 jihe21) "a"2) "c"3) "b"4) "d"

同樣也可以設定多個

以上的集合是無序的,redis支援有序的集合他的名如下

ZADD key score member 增加元素

ZSCORE key member 擷取元素的分數

ZRANGE key start stop [WITHSCORES]

ZRANGEBYSCORE key min max


添加有序集合

192.168.0.201:6379> ZSCORE youxu 80 a(nil)192.168.0.201:6379> ZADD youxu 81 b(integer) 1可以添加多個192.168.0.201:6379> ZADD youxu 82 c 83 d(integer) 2

擷取分數

192.168.0.201:6379> ZSCORE youxu a"80"192.168.0.201:6379> ZSCORE youxu b"81"192.168.0.201:6379> ZSCORE youxu c"82"192.168.0.201:6379> ZSCORE youxu d"83"

擷取有序集合範圍

192.168.0.201:6379> ZRANGE youxu 0 3   #參考列表集合的0 3  從0到3的元素1) "a"2) "b"3) "c"4) "d"

在舉個例子:

192.168.0.201:6379> ZADD youxu 79 e(integer) 1192.168.0.201:6379> ZRANGE youxu 0 41) "e"2) "a"3) "b"4) "c"5) "d

######e在前面因為他的score小!

熱門文章,可以用這個來排序,我可以給他設定一個分數!


本文出自 “震動心弦” 部落格,請務必保留此出處http://shuainotebook.blog.51cto.com/1271282/1707966

Redis叢集介紹及五大資料類型-1

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.