標籤: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
現在是從左邊加
從右邊開始加
192.168.0.201:6379> RPUSH num 3(integer) 4
192.168.0.201:6379> RPUSH num 5(integer) 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就變成
從右邊拿key,從右邊拿右邊第一個 (這個5就被拿出來了)
192.168.0.201:6379> RPOP num"5"
現在在看下這個key的長度
192.168.0.201:6379> LLEN num(integer) 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 減去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