總結了好久,終於到了我最喜歡的redis部分,在這個階段就讓我們好好的瞭解一下這個強大的工具~
一、redis介紹
redis是一個開源的,基於內存存儲的數據結構服務器,可以被用作數據庫,高速緩存和消息隊列。它可以支持衆多的數據類型,如字符串、哈希、列表、集合、有序集合等數據類型。它內置了複製、Lua腳本、LRU收回、事務以及不同級別磁盤持久化功能,高可用也可以進行自動分區等。簡而言之,redis是一種面向“鍵/值”對數據類型的內存數據庫,它可以滿足我們對海量數據快速讀寫的需求。
(1)redis的特點
①redis支持數據的持久化,可以將內存中的數據保存在磁盤中,重啓的時候可以再次加載進行使用。
②redis不僅僅支持簡單的k-v類型的數據,同時還提供list、set、zset、hash等數據結構的存儲。
③redis支持數據的備份,及master-slave主從模式的數據備份。
(2)redis的優勢
①性能極高---redis讀的速度可達11w/s,寫的速度可達8.1w/s。
②豐富的數據類型---redis支持二進制的string、list、hash、set及order set數據類型操作。
③原子性---redis所有的操作都是原子性的,同時redis還支持對幾個集合合併後的原子性執行。
④豐富的特性---redis還支持發佈/訂閱,通知,key過期等特性。
二、redis的單機安裝
1.下載解壓
下載地址:http://download.redis.io/releases/,我使用的版本是redis-3.2.0
也可以直接在服務器上使用wget進行下載:wget http://download.redis.io/releases/redis-3.2.0.tar.gz
下載完成後解壓:tar -zxvf redis-3.2.0.tar.gz -C /opt/
2.編譯
首先進入到redis的安裝目錄:cd /opt/redis-3.2.0
然後使用make命令進行編譯,在編譯完成後,就會在src目錄下產生redis的相關命令。(如果是在windows下,解壓完成後即可使用)。
3.初始配置
①修改redis.conf中的配置項
添加:daemonize yes(後臺運行)
logfile /opt/redis-3.2.0/logs/redis.log(日誌文件,目錄必須存在)
②啓動redis
服務端:src/redis-server redis.conf
查看服務端是否啓動成功:
netstat-tunlp | grep 6379 --->查看6379端口是否被佔用
在客服端鏈接:src/redis-cli -d master -p 6379
③關閉redis服務
src/redis-cli shutdown
4.配置信息的查看
redis的配置文件位於redis的安裝目錄之下,文件名爲redis.conf。可以通過config命令來查看或設置配置項。
在命令行中查看:
redis localost:6379> config get config_set_name(要查看的配置name)
例如: redis localost:6379> config get loglevel
1) "loglevel"
2) "notice"使用*號獲取所有配置項:redis localost:6379> config get *
在命令行中編輯:
redis localost:6379> config set conf_setting_name new_value(要設置的屬性)
例如:redis localost:6379> config get loglevel
1) "loglevel"
2) "warning" -->對當前服務有效,之後當服務重啓之後,纔會失效
5.Redis的安全設置
設置redis密碼,修改redis.conf
requirepass root --->將redis密碼修改成爲root
啓動客戶端:src/redis-cli -h master -p 6379 -a root
至此,redis的單機安裝已經完成~是不是很簡單呢
三、redis主從
由於redis搭建集羣太過麻煩,我在這裏就先不多說了,只是簡單介紹一下一下主從是怎麼實現的,等以後有機會在把redis的分佈式安裝進行一個詳細的介紹。
1.Redis集羣是一個分佈式存儲架構,可以在多個節點之間進行數據共享,解決redis高可用、可擴展等問題。redis集羣提供了兩個好處:
(1)將數據自動切分(split)到多個節點
(2)當集羣中的某一個節點故障時,redis還可以繼續處理客戶端的請求
2.集羣中的主從複製
集羣中的每個節點都有1到N個複製品,其中一個爲主節點,其餘爲從節點,如果主節點下線了,集羣就會把這個主節點的一個節點設置爲新的主節點,繼續工作。這樣,集羣就不會因爲一個主節點的下線而無法正常工作。如果某一個主節點和它所有的從節點都下線的話,redis集羣就停止工作了。
redis集羣不保證數據的強一致性,在特定的情況下,redis集羣會丟失已經執行過得命令。
使用異步複製是redis集羣可能會丟失寫命令的其中一個原因,有時候由於網絡原因,如果網絡斷開時間太長,redis集羣就會啓用新的主節點,之前發給主節點的數據就會丟失。
配置:
配置Master-Slave,只需要在slave上配置master節點的ip和port就可以。
修改redis.conf,在最後一行添加
slaveof master 6379(代表了主從)
另外需要注意一下slave-read-only 必須要設置爲yes,這表示slave只讀不寫。
四、常用命令
redis的常用命令主要分爲兩個方面:鍵值相關命令,服務器相關命令
1.鍵值相關命令(常用的)
keys * 取出當前所有的key
exisits name 查看redis是否有name這個key
del name 刪除key及對應的value
expire confirm 100 設置confirm這個key100s後過期
ttl confirm 查看confirm這個key還可以存活多久
select 0 選擇0號數據庫,redis中默認有16個庫,0~15
move confirm 1 將當前數據庫中的confirm 移動到其他的數據庫中,
persist confirm 移除confirm這個key的過期時間
rename key2 key3 重命名key2 爲key3
type key2 返回key的數據類型
2.服務器相關命令(常用的)
flushdb 刪除當前選擇數據庫中的所有key
flushall 刪除所有數據庫中的數據庫
dbsize 返回當前數據庫中所有key的數量
select 0~15 編號的數據庫
五、redis支持的五種數據類型
1.string
①設置一個值:set命令:set name hadoop
在設置的時候可以指定當前key的過期時間
②set key value EX seconds ---->指定key之後seconds的存活時間,seconds之後消失
set name hadoop expire 30
③獲取一個值:get命令 get name
④getrange key start end 返回key中字符串值的子字符[start, end],字符串索引從0開始
getrange hadoop 0 2 ==》had
⑤getset key value 將給定key的值設爲value,並返回key的舊值(old value)
getset name hive ==》 hadoop
⑥mget key [key1 ...] 一次性獲得多個key所對應的值
⑦ setnx key value 只有在key不存在時設置key的值
⑧ append key value 如果key已經存在並且是一個字符串,APPEND命令將value追加到key原來的值的末尾
2.hash(哈希)
Redis hash 是一個鍵值對集合。Redis hash是一個string類型的field和value的映射表,hash特別適合用於存儲對象。
redis 127.0.0.1:6379> HMSET w3ckey name "redis tutorial" description "redis basic commands for caching" likes 20 visitors 23000
OK
redis 127.0.0.1:6379> HGETALL w3ckey
1) "name"
2) "redis tutorial"
3) "description"
4) "redis basic commands for caching"
5) "likes"
6) "20"
7) "visitors"
8) "23000"
常用命令:
命令 描述
HDEL key field2 [field2] 刪除一個或多個哈希表字段
HEXISTS key field 查看hash表key中,指定字段是否存在,如果存在返回爲1,反之返回爲0
HGET key field 獲取hash表中指定字段的值
HGETALL key 獲取所有的字段和值
HINCRBY key field increment 爲指定字段的整數值加上增量increment
HINCRBYFLOAT key field increment 爲指定字段的浮點值加上增量increment,只有增的api不能減的api,但是可通過increment爲負數達到減的效果HKEYS key 查看key中的所有字段,相當於java中的map.keySet()
HLEN key 就相當於java中的map的size,map的容量
HMGET key field1 [field2] 獲取所有給定字段的值
HMSET key f1 v1 [f2 v2] 同時將多個file-value設置到key中
HSET key field value 將哈希表key的field設置爲value
HSETNX key field value 當在field不存在時,設置相關字段的值.如果存在,設置失敗,返回值爲0,成功設置返回值爲1
3.list(列表)
Redis列表是簡單的字符串列表,按照插入順序排序;你可以添加一個元素到列表的頭部(左邊)或者尾部(右邊)。
命令 描述
BLPOP key1 [key2 ] timeout 移除並獲取列表中的第一個元素,如果沒有該值,會阻塞列表直到超時【單位是秒s】或發現可彈出元素爲止
BRPOP key1 [key2 ] timeout 移除並獲取列表中的最後一個元素,如果沒有該值,會阻塞列表直到超市或發現可彈出元素爲止
LINDEX key index 通過索引獲取列表中的元素
LINSERT key BEFORE|AFTER pivot value 在列表的元素前或後插入元素
LLEN key 獲取列表長度
LPOP key 移出並獲取列表的第一個元素
LPUSH key value1 [value2] 將一個或多個值插入到列表頭部
LRANGE key start stop 獲取列表指定返回內的元素
LREM key count value 移出列表元素(count表示刪除多個該value元素)
LSET key index value 通過索引設置列表元素的值
LTRIM key start stop 對一個列表進行修剪(trim),也就是說,讓列表只保留指定區間內的元素,刪除其它 [start, stop]
RPOP key 移出並獲取列表最後一個元素
RPUSH key value1 [value2] 在列表尾部中添加一個或多個值
4.set(集合)
Redis的Set是string類型的無序集合,集合是通過哈希表實現的,所以添加,刪除,查找的複雜度都是O(1)。
命令 描述
SADD key member1 [member2] 向集合添加一個或多個成員
SCARD key 獲取集合的成員數(size)
SDIFF key1 [key2] 返回給定所有集合的差集(差集就是key1 - (key1 交 key2))
SINTER key1 [key2] 返回給定集合的交集
SISMEMBER key member 判斷member元素是否是集合key的成員,相當於java中的
key.contains(member)
SMEMBERS key 返回集合中所有成員
SREM key member1 [member2] 移除集合中一個或多個成員
SUNION key1 [key2] 返回所有給定集合的並集
SSCAN key cursor [match pattern] [count count] 迭代集合中的元素
5.zset(sorted set:有序集合)
命令 描述
zadd key score1 member1 [score2 member2] 向有序集合添加一個或多個成員,或是更新已經存在成員的分數zcard key 獲取有序集合的成員數
zcount key min max 計算在有序集合中指定區間分數的成員數,其中min和max的寫法,
必須要以[開頭
zrange key start stop [withscores] 通過索引區間返回有序集合成指定區間內的成員
zrank key member 返回有序集合中指定成員的索引
zrem key member [member ...] 移除有序集合中的一個或多個成員
zremrangebylex key min max 移除有序集合中給定的字典區間的所有成員
zremrangebyscore key start stop 移除key中給定的分數區間的所有成員
zrevrange key start stop [withscores] 返回有序key中指定區間內的成員,通過索引,分數從高到低
zrevrank key memeber 返回key中指定成員的排名,key成員按分數值遞減排序
zscore key member 返回key中member的分數
zscan key cursor [match pattern] [COUNT count] 迭代有序集合中的元素(包括元素成員和元素分值)
關於redis的介紹就先進行到這裏吧,其中關於redis中五種數據類型的命令列舉的並不全,只是列舉了其中比較常用的一些,而且關於redis分佈式集羣的搭建也沒有進行說明,這個在我以後的文章中應該會進行一個補充~