Redis-cluster集群【第一篇】:redis安裝及redis數據類型


Redis介紹:

一、介紹
redis 是一個開源的、使用C語言編寫的、支持網絡交互的、可以基於內存也可以持久化的Key-Value數據庫。
redis的源碼非常簡單,只要有時間看看譚浩強的C語言,在去看redis的源碼能看懂50-60%。
redis目前最大的集群應該是新浪的應該。
redis目前是vmvaer來支持的,很多的開源軟件都需要某些組織來支持的。如果一個開源軟件沒有金錢來支持的話很難走的持久
 
二、Redis和Memcache對比

持久化:以電商舉例,session用memcache來做的,購物車用redis來做的,當你退出的時候會提示你購物車里的物品會在你退出后繼續保存。相對來說memcache存儲更單一化!
主從復制:redis的主從復制類似mysql的主從復制但是原理是不同的!
虛擬內存:說白了就是把內存里一些不用的東西放在硬盤上,最好不要用,降低效率,現在內存來說比較便宜。

 Redis安裝&基本操作:

一、Redis安裝

 

1、檢查配置環境
檢查gcc是否安裝,如果沒有安裝:yum -y install gcc

2、下載安裝Redis
cd /opt/
wget http://download.redis.io/releases/redis-3.0.4.tar.gz
#這里下載可以登錄官網查看最新的Redis
tar -xvf redis-3.0.4.tar.gz
make
make install
cd /opt/redis-3.0.4/src/
make test


安裝中可能遇到的問題:
zmalloc.h:50:31: error: jemalloc/jemalloc.h: No such file or directory
zmalloc.h:55:2: error: #error "Newer version of jemalloc required"

Allocator
---------------------------------------------------------------------------------------------------------
Selecting a non-default memory allocator when building Redis is done by setting
the `MALLOC` environment variable. Redis is compiled and linked against libc
malloc by default, with the exception of jemalloc being the default on Linux
systems. This default was picked because jemalloc has proven to have fewer
fragmentation problems than libc malloc.
To force compiling against libc malloc, use:
% make MALLOC=libc
To compile against jemalloc on Mac OS X systems, use:
% make MALLOC=jemalloc

allocator(分配算符),如果有MALLOC這個環境變量,會有用這個環境變量的 去建立Redis。
而且libc 並不是默認的分配器,默認的是jemalloc!
因為jemalloc被證明有更少的fragmentation problems比libc。

但是如果你又沒有jemalloc 而只有 libc 當然 make 出錯。 所以加這么一個參數。
make MALLOC=libc
---------------------------------------------------------------------------------------------------------

3、配置redis
cp /opt/redis-3.0.4/utils/redis_init_script /etc/init.d/redis    #復制管理腳本
chmod +x /etc/init.d/redis
mkdir /etc/redis
cp /opt/redis-3.0.4/redis.conf /etc/redis/6379.conf

4、修改redis啟動模式
默認Redis啟動的時候是啟動在前台的,把他改為啟動在后台
vim /etc/redis/6379.conf
daemonize no  改為 daemonize yes

5、Redis加入到系統服務並設置為開機啟動
首先修改Redis啟動腳本:
vim /etc/init.d/redis
#chkconfig: 35 95 95  在第三行加上即可

添加系統服務:chkconfig --add redis
設置開機啟動:chkconfig redis on
檢查服務狀態:chkconfig --list redis

6、指定日志存放位置&PID文件&數據庫文件存放位置(下一邊寫持久化)
vim /etc/redis/6379.conf

logfile "/var/log/redis.log"  指定日志文件如果不指定就會在控制台輸出
pidfile /var/run/redis_6379.pid 
dir ./   這個是指默認的持久化配置文件放在那里!建議修改下!

pidfile如果不修改使用默認的話就會報錯:
原因是在/etc/init.d/redis里指定的默認PID是:PIDFILE=/var/run/redis_${REDISPORT}.pid  
但是默認配置文件:/etc/redis/6379.conf(咱們自己從解壓包里復制的里的默認是:pidfile /var/run/redis.pid) 

 

 二、Redis基本操作

SET 設置Key
GET 判斷Key的值
EXISTS 判斷Key是否存在
KEYS * 顯示所有的Key
DEL 刪除指定Key
TYPE 獲取Key類型

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

 

1、set的例子:
192.168.0.201:6379> SET hello hehe
OK
192.168.0.201:6379> GET hello
"hehe"

2、設置多個key value 然后使用使用keys * 去查看所有
192.168.0.201:6379> SET hello1 hehe1
OK
192.168.0.201:6379> SET hello2 hehe2
OK

192.168.0.201:6379> KEYS  *
1) "hello1"
2) "hello"
3) "hello2"

KEY匹配方式:
?匹配單個
 *匹配所有

3、判斷key是否存在
判斷Key是否存在使用:EXISTS   他返回的是整形:0不存在,1存在
192.168.0.201:6379> EXISTS hello
(integer) 1
192.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 hello
string

6、Keyspace
redis是支持多個實例的默認最多16個,可以修改配置文件來支持更多!
使用INFO命令查看!
# Keyspace
db0:keys=1,expires=0,avg_ttl=0

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

 Redis數據類型:

他用不同的命令來區分你要操作什么數據類型
類型不能嵌套,不能混! 但是有個王炸:set能把所有的類型都改為字符串類型!

1、字符串類型:

SET
GET
DEL
APPEND  在值的后面追加
set能重新設置但是要追加的話使用APPEND最好比如
192.168.0.201:6379> SET hehe hello
OK
192.168.0.201:6379> GET hehe
"hello"
192.168.0.201:6379> APPEND hehe ,world
(integer) 11
192.168.0.201:6379> GET hehe
"hello,world"

可以同時設置多個值和查詢值用MSET 和MSET
192.168.0.201:6379> MSET key1 v1 key2 v2 key3 v3
OK
192.168.0.201:6379> MGET key1 key2 key3
1) "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 "呵呵"
OK
192.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) 1
192.168.0.201:6379> INCR num
(integer) 2
192.168.0.201:6379> INCR num
(integer) 3
192.168.0.201:6379> INCR num
(integer) 4


如果想加多個呢:INCRBY 
192.168.0.201:6379> INCRBY num 10
(integer) 57
192.168.0.201:6379> INCRBY num 10
(integer) 67
192.168.0.201:6379> INCRBY num 10
(integer) 77


減呢? DECR 
192.168.0.201:6379> DECR num
(integer) 106
192.168.0.201:6379> DECR num
(integer) 105
192.168.0.201:6379> DECR num
(integer) 104

如果要是減多個呢:DECRBY
192.168.0.201:6379> DECRBY num 5
(integer) 97
192.168.0.201:6379> DECRBY num 5
(integer) 92
192.168.0.201:6379> DECRBY num 5
(integer) 87

想支持小數點:
INCRBYFLOAT key 0.1
192.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、散列類型(hash)

和數據庫存的表似的,表不是的有字段吧,可以給每個字段設置個值
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) 1
192.168.0.201:6379> HSET shouji co red
(integer) 1
192.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 shouji
1) "name"
2) "iphone"
3) "co"
4) "red"
5) "price"
6) "8888"

其實現在看着不是好看的但是他通過一些API調用到網頁上,通過排版取出來的值就好看了
192.168.0.201:6379> HMSET diannao name thinkpad co black price 30
OK
192.168.0.201:6379> HMGET diannao name co price
1) "thinkpad"
2) "black"
3) "30"

 4、列表類型

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


列表你向左邊添加和右邊添加他的時間復雜度是一樣的!O1(時間復雜度)
可以理解為:我這個速度不隨着數量的增加而增加!比如1000行和1萬行他的時間開銷是一樣的!    大學數據結構里學的

時間復雜度:
同一問題可用不同算法解決,而一個算法的質量優劣將影響到算法乃至程序的效率。算法分析的目的在於選擇合適算法和改進算法。
計算機科學中,算法的時間復雜度是一個函數,它定量描述了該算法的運行時間。

但是他有個缺點,比如說里面有1萬個key你想找到第98個這就費老勁了他從1開始數數到98
                優點,你讀前100個,卡直接讀頭部就非常快了


命令:
LPUSH key value [value ...]
RPUSH key value [value ...]
               LPOP key
               RPOP key
     LRANGE key start stop
     LREM key count value
4.1、
從左邊添加key
192.168.0.201:6379> LPUSH num 0
(integer) 1
192.168.0.201:6379> LPUSH num 1
(integer) 2
192.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  5


如果想獲取長度就使用LNE 嗎!獲取列表類型長度就是:LLEN
192.168.0.201:6379> LLEN num
(integer) 5

4.2、從左邊拿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

4.3、
獲取列表的某一個范圍:
現在是這個值
1  0  3

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

###這個列表和python中列表中差不多,0 -1 相當於列表中的下標。

192.168.0.201:6379> LPUSH num 2
(integer) 4
192.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"


4.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"

他是兩邊的第一次接觸有點亂!他是兩邊的需要注意!!!

4.5、只保留指定數據

只保留0到2的數據
192.168.0.201:6379> LTRIM num 0 2
OK
看下結果:
192.168.0.201:6379> LRANGE num 0 -1
1) "2"
2) "1"
3) "0"

這個有什么用呢:
寫日志的時候,我這個緩沖區,只保留最近100條日志!
比如:
192.168.0.201:6379> LPUSH logs newloghehe
(integer) 1

192.168.0.201:6379> LTRIM num 0 99
OK

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

 5、集合類型

集合是高一學的,第一個學期就是學的集合
交集∩、並集∪、合集、等 0 0 !

集合的元素是沒有類型的!
用到集合類型的應用有:(新浪微博分享了很多的redis應用)
比如:關注微博,比如咱倆是否共同關注了某一個人等。

5.1、
添加集合
192.168.0.201:6379> SADD jihe1 a b c
(integer) 3

5.2、
查看集合內容
192.168.0.201:6379> SMEMBERS jihe1
1) "c"
2) "a"
3) "b"
5.3、判斷集合元素是否存在
192.168.0.201:6379> SISMEMBER jihe1 d
(integer) 0
192.168.0.201:6379> SISMEMBER jihe1 a
(integer) 1
返回0 說明不存在返回1說明存存在

5.4、集合間運算
支持:交集、差集、並集

差集運算:
192.168.0.201:6379> SDIFF jihe1 jihe2
1) "a"
jihe1abcjihe2b cd

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

同理:
jihe2 減去jihe1
192.168.0.201:6379> SDIFF jihe2 jihe1
1) "d"

差集運算可以設置多個

交集運算:
 192.168.0.201:6379> SINTER jihe1 jihe2
1) "c"
2) "b"

交集可以設置多個:
在添加一個jihe3
192.168.0.201:6379> SADD jihe3 d e f
(integer) 3

192.168.0.201:6379> SINTER jihe1 jihe2 jihe3
(empty list or set)
#這個是因為他是jihe1和jihe2先做交集運算,然后在和jihe3做交集運算

並集運算
192.168.0.201:6379> SUNION jihe1 jihe2
1) "a"
2) "c"
3) "b"
4) "d"
同樣也可以設置多個


5.4、以上的集合是無序的,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) 1

192.168.0.201:6379> ZRANGE youxu 0 4
1) "e"
2) "a"
3) "b"
4) "c"
5) "d
######e在前面因為他的score小!
熱門文章,可以用這個來排序,我可以給他設置一個分數!!!!!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM