17、第十七階段redis1天redis筆記_第1頁
17、第十七階段redis1天redis筆記_第2頁
17、第十七階段redis1天redis筆記_第3頁
17、第十七階段redis1天redis筆記_第4頁
17、第十七階段redis1天redis筆記_第5頁
已閱讀5頁,還剩45頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、RedisNoSql 數(shù)據(jù)庫1 課程計(jì)劃1、 redis 介紹a)NoSqlNoSql 的分類redis Redis 應(yīng)用場景b)c)d)2、 redis 安裝(重點(diǎn))3、 redis 客戶端redis 自帶客戶端圖形界面的客戶端(了解)Java 客戶端 jedis(重點(diǎn))4、 Redis 數(shù)據(jù)類型(重點(diǎn))String 類型 Map 類型 List 類型 Set 類型 SortedSeta)b)c)d)e)5、 Keys 命令(了解)6、 Redis 的持久化方案Rbd 方式Aof 方式7、 Redis 的主從8、 Redis 的集群(重點(diǎn))9、 Jedis 連接 redis 集群2 Redi

2、s 介紹NoSql為了解決高并發(fā)、就是 NoSql。用、擴(kuò)展,大數(shù)據(jù)等一系列問題而產(chǎn)生的數(shù)據(jù)庫解決方案,NoSql,叫非關(guān)系型數(shù)據(jù)庫,它的全名 Not only sql。它不能替代關(guān)系型數(shù)據(jù)庫,只能作為關(guān)系型數(shù)據(jù)庫的一個(gè)良好補(bǔ)充。NoSql 的分類鍵值(Key-Value)數(shù)據(jù)庫相關(guān)產(chǎn)品:典型應(yīng)用:數(shù)據(jù)模型:Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB內(nèi)容緩存,主要用于處理大量數(shù)據(jù)的高一系列鍵值對負(fù)載。優(yōu)勢:劣勢:快速查詢的數(shù)據(jù)缺少結(jié)構(gòu)化列數(shù)據(jù)庫相關(guān)產(chǎn)品:Cassandra, HBase, Riak典型應(yīng)用:分布式的文件系統(tǒng)數(shù)據(jù)模型:以列簇式

3、,將同一列數(shù)據(jù)存在一起優(yōu)勢:查找速度快,可擴(kuò)展性強(qiáng),更容易進(jìn)行分布式擴(kuò)展劣勢:功能相對局限文檔型數(shù)據(jù)庫相關(guān)產(chǎn)品:CouchDB、MongoDB典型應(yīng)用:Web 應(yīng)用(與 Key-Value 類似,Value 是結(jié)構(gòu)化的)數(shù)據(jù)模型: 一系列鍵值對優(yōu)勢:數(shù)據(jù)結(jié)構(gòu)要求不嚴(yán)格劣勢: 查詢性能不高,而且缺乏的查詢語法圖形(Graph)數(shù)據(jù)庫相關(guān)數(shù)據(jù)庫:Neo4J、InfoGrid、Infinite Graph典型應(yīng)用:社交網(wǎng)絡(luò)數(shù)據(jù)模型:圖結(jié)構(gòu)優(yōu)勢:利用圖結(jié)構(gòu)相關(guān)算法。劣勢:需要對整個(gè)圖做計(jì)算才能得出結(jié)果,不容易做分布式的集群方案。redisRedis 是使用 c 語言開發(fā)的一個(gè)高性能鍵值數(shù)據(jù)庫。Redi

4、s 可以通過一些鍵值類型來據(jù)。鍵值類型: String 字符類型 map 散列類型 list 列表類型 set 集合類型sortedset 有序集合類型數(shù)redis 歷史發(fā)展2008 年,意大利的一家Merzia 推出了一款基于的實(shí)時(shí)統(tǒng)計(jì)系統(tǒng)的性能感到失望,LLOOGG,然而沒過多久該公司的創(chuàng)始人 Salvatore Sanfilippo 便 對于是他決定親自為 LLOOGG 量身定做一個(gè)數(shù)據(jù)庫,并于 2009 年開發(fā)完成,這個(gè)數(shù)據(jù)庫就是 Redis。 不過 Salvatore Sanfilippo 并不滿足只將 Redis 用于 LLOOGG 這一款產(chǎn)品,而是希望更多的人使用它,于是在同一年

5、 Salvatore Sanfilippo 將 Redis 開源發(fā)布,并開始和 Redis 的另一名主要的代碼貢獻(xiàn)者Pieter Noordhuis 一起繼續(xù)著 Redis 的開發(fā),直到今天。Salvatore Sanfilippo 自己也沒有想到,短短的幾年時(shí)間,Redis 就擁有了龐大的用戶群體。Hacker News 在 2012 年發(fā)布了一份數(shù)據(jù)庫的使用情況,結(jié)果顯示有近 12%的公司在使、Stack Overflow、Flickr 等都是用 Redis。國內(nèi)如 Redis 的用戶。、街旁網(wǎng)、知乎網(wǎng),國外如VMware 公司從 2010 年開始贊助 Redis 的開發(fā), Salvato

6、re Sanfilippo 和 Pieter Noordhuis也分別在 3 月和 5 月加入 VMware,全職開發(fā) Redis。redis 的應(yīng)用場景緩存(數(shù)據(jù)查詢、短連接、分布式集群架構(gòu)中的 ses內(nèi)容、商品內(nèi)容等等)。(最多使用)分離。聊天室的好友列表。任務(wù)隊(duì)列。(秒殺、搶購、12306 等等)應(yīng)用榜。統(tǒng)計(jì)。數(shù)據(jù)過期處理(可以精確到毫秒)3 redis 安裝redis官網(wǎng)地址:地址:redis 的安裝redis 的安裝環(huán)境會安裝到 linux 系統(tǒng)中。第一步:安裝 VMware,并且在 VMware 中安裝 centos 系統(tǒng)(參考 linux第二步:將redis 的壓縮包,上傳到 l

7、inux 系統(tǒng)第三步:對redis 的壓縮包進(jìn)行解壓縮Redis 解壓縮之后的文件是用 c 語言寫的源碼文件rootitheima # tar -zxf redis-3.0.0.tar.gz)。第四步:安裝 c 語言環(huán)境(安裝 centos 之后,自帶c 語言環(huán)境)rootitheima # yum install gcc-c+第五步:編譯 redis 源碼rootitheima # cd redis-3.0.0 rootitheima redis-3.0.0# make第六步:安裝 redisrootitheima redis-3.0.0# make install PREFIX=/usr/

8、local/redis19第七步:查看是否安裝成功redis 啟動(dòng)前端啟動(dòng)前端啟動(dòng)令:rootitheima bin# ./redis-server前端啟動(dòng)的關(guān)閉: 強(qiáng)制關(guān)閉:Ctrl+c正常關(guān)閉:rootitheima bin# ./redis-cli shutdown啟動(dòng)界面:前端啟動(dòng):一旦客戶端關(guān)閉,則redis 服務(wù)也停掉。后端啟動(dòng)第一步:需要將 redis 解壓之后的源碼包中的 redis.conf 文件拷貝到 bin 目錄下rootitheima bin# cp /root/redis-3.0.0/redis.conf ./第二步:修改 redis.conf 文件,將 daemon

9、ize 改為 yes先要使用 vim redis.conf第三步:使用命令后端啟動(dòng) redisrootitheima bin# ./redis-server redis.conf第四步:查看是否啟動(dòng)成功關(guān)閉后端啟動(dòng)的方式:強(qiáng)制關(guān)閉:rootitheima bin# kill -9 5071正常關(guān)閉:rootitheima bin# ./redis-cli shutdown在項(xiàng)目中,建議使用正常關(guān)閉。因?yàn)?redis 作為緩存來使用的話,將數(shù)據(jù)據(jù)持久化到本地之后,再關(guān)閉。到內(nèi)存中,如果使用正常關(guān)閉,則會將內(nèi)存數(shù)如果是強(qiáng)制關(guān)閉,則不會進(jìn)行持久化操作,可能會造成部分?jǐn)?shù)據(jù)的丟失。4 Redis 客戶端

10、Redis 自帶的客戶端啟動(dòng)啟動(dòng)客戶端命令:rootitheima bin# ./redis-cli -h -p 6379-h:指定-p:指定的redis 服務(wù)器的 ip 地址的redis 服務(wù)器的 port 端口還可以寫成:rootitheima bin# ./redis-cli使用默認(rèn)配置:默認(rèn)的 ip【】,默認(rèn)的 port【6379】關(guān)閉Ctrl+c :6379 quit圖形界面客戶端安裝文件位置:安裝之后,打開如下:設(shè)置:rootitheima redis-3.0.0# vim /etc/sysconfig/iptables# Firewall configuration writte

11、n by system-config-firewall# Manual customization of this file is notmended.*filter:INPUT ACCEPT 0:0:FORWARD ACCEPT 0:0:OUTPUT ACCEPT 0:0-A INPUT -m se -se ESTABLISHED,RELATED -j ACCEPT-A INPUT -p icmp -j ACCEPT-A INPUT -i lo -j ACCEPT-A INPUT -m se -se NEW -m tcp -p tcp -dport 22 -j ACCEPT-A INPUT

12、-m se -se NEW -m tcp -p tcp -dport 3306 -j ACCEPT-A INPUT -m se -se NEW -m tcp -p tcp -dport 8080 -j ACCEPT-A INPUT -m se -se NEW -m tcp -p tcp -dport 6379 -j ACCEPT-A INPUT -j REJECT -reject-with icmp-host-prohibited-A FORWARD -j REJECT -reject-with icmp-host-prohibited COMMIT/etc/sysconfig/iptable

13、s 16L, 677C 已寫入rootitheima redis-3.0.0# service iptables restartiptables:清除規(guī)則:確定iptables:將鏈設(shè)置為政策 ACCEPT:filter確定iptables:正在卸載模塊:確定iptables:應(yīng)用規(guī)則:確定rootitheima redis-3.0.0#Redis.conf 中的數(shù)據(jù)庫數(shù)量的設(shè)置:選擇數(shù)據(jù)庫的方式:使用 select 加上數(shù)據(jù)庫的下標(biāo) 就可以選擇指定的數(shù)據(jù)庫來使用,下標(biāo)從 0 開始:6379 select 15 OK:637915Jedis 客戶端jedis 介紹Redis 不僅是使用命令來操

14、作,現(xiàn)在基本上主流的語言都有客戶端支持,比如 java、C、C#、C+、在、Node.js、Go 等。一些 Java 的客戶端,有 Jedis、Redisson、Jredis、JDBC-Redis、等其中官方使用Jedis 和Redisson。在企業(yè)中用的最多的就是 Jedis,下面就重點(diǎn)學(xué)習(xí)下Jedis。Jedis 同樣也是托管在上,地址:/xetorthio/jedis工程搭建添加 jar 包單實(shí)例連接 redis使用 jedis 連接池連接 redis 服務(wù)器Spring 整合 jedisPool()添加 spring 的jar 包配置 spring 配置文件 applicationCo

15、ntext.xml測試代碼Testpublic void testJedisPool() JedisPool pool = (JedisPool) applicationContext.getBean(jedisPool); Jedis jedis = null;try jedis = pool.getResource();jedis.set(name, lisi); String name = jedis.get(name); System.out.prln(name);該值 且 空閑連接最大空閑連接數(shù) 時(shí)直接-5 Redis 數(shù)據(jù)類型String命令 賦值語法:SET key value

16、取值語法:GET key 取值并賦值語法:GETSET key value:6379 getset s2 222111:6379 get s2:6379 get test123“:6379 set test 123 OK catch (Exception ex) ex.prStackTrace(); finally if (jedis != null) / 關(guān)閉連接jedis.close(); 設(shè)置/獲取多個(gè)鍵值語法:MSET key value key value MGET key key 刪除語法:DEL key 數(shù)值增減遞增數(shù)字當(dāng)?shù)淖址钦麛?shù)時(shí),Redis 提供了一個(gè)實(shí)用令 INCR,

17、其作用是讓當(dāng)前鍵值遞增,并返回遞增后的值。語法:INCR key增加指定的整數(shù):6379 incr num(eger) 1:6379 incr num(eger) 2:6379 incr num(eger) 3:6379 del test(eger) 1:6379 mset k1 v1 k2 v2 k3 v3 OK:6379 get k1 v1:6379 mget k1 k31) v12) v3222語法:INCRBY key increment遞減數(shù)值語法:DECR key減少指定的整數(shù)語法:DECRBY key decrement 其它命令().1向尾部追加值A(chǔ)PPEND 的作用是向鍵值的

18、末尾追加 value。如果鍵不存在則將該鍵的值設(shè)置為 value,即相當(dāng)于 SET key value。返回值是追加后字符串的總長度。語法:APPEND key value:6379 set stro OK:6379 append str world! (eger) 12:6379 get stro world!:6379 decr num(eger) 6:6379 decr num(eger) 5:6379 decrby num 3(eger) 2:6379 decrby num 3(eger) -1:6379 decr num(eger) 9:6379 decr num(eger) 8:6

19、379 incrby num 2(eger) 5:6379 incrby num 2(eger) 7:6379 incrby num 2(eger) 9.2獲取字符串長度STRLEN 命令返回鍵值的長度,如果鍵不存在則返回 0。語法:STRLEN key應(yīng)用 自增主鍵商品、訂單號采用 string 的遞增數(shù)字特性生成。定義商品key:items:id:7003 INCR items:id(eger) 2:7003 INCR items:id(eger) 3Hash散列類型使用 string假設(shè)有 User 對象以 JSON 序列化的形式到 Redis 中,User 對象有 id,usernam

20、e、password、age、name 等屬性,保存、更新:的過程如下::6379 strlen str(eger) 0:6379 set stro OK:6379 strlen str(eger) 5User 對象 json(string) redis如果在業(yè)務(wù)上只是更新 age 屬性,其他的屬性并不做更新我應(yīng)該怎么做呢? 如果仍然采用上邊的方法在傳輸、處理時(shí)會造成資源浪費(fèi),下邊講的 hash 可以很好的解決這個(gè)問題。redis hash 介紹hash 叫散列類型,它提供了字段和字列類型、集合類型等其它類型。如下:的。字只能是字符串類型,不支持散命令 賦值HSET 命令不區(qū)分作時(shí)返回 0。和

21、更新操作,當(dāng)執(zhí)行操作時(shí) HSET 命令返回 1,當(dāng)執(zhí)行更新操一次只能設(shè)置一個(gè)字語法:HSET key field value一次可以設(shè)置多個(gè)字語法:HMSET key field value field value .當(dāng)字段不存在時(shí)賦值,類似 HSET,區(qū)別在于如果字段存在,該命令不執(zhí)行任何操作:6379 hmset user age 20 username lisi OK:6379 hset user username zhangsan (eger) 1語法:HSETNX key field value 取值一次只能獲取一個(gè)字語法:HGET key field一次可以獲取多個(gè)字語法:HMGE

22、T key field field .獲取所有字語法:HGETALL key 刪除字段可以刪除一個(gè)或多個(gè)字段,返回值是被刪除的字段個(gè)數(shù)語法:HDEL key field field .:6379 hdel user age (eger) 1:6379 hdel user age name (eger) 0:6379 hdel user age username (eger) 1:6379 hgetall user1) age 2) 20usernamelisi:6379 hmget user age username 1) 202) lisi:6379 hget user username z

23、hangsan“:6379 hsetnx user age 30如果 user 中沒有 age 字段則設(shè)置 age 值為 30,否則不做任何操作(eger) 0 增加數(shù)字語法:HINCRBY key field increment 其它命令().1判斷字段是否存在語法:HEXISTS key field.2只獲取字段名或字語法:HKEYS key HVALS key:6379 hmset user age 20 name lisi OK:6379 hkeys useragename :6379 hvals user 1) 202) lisi:6379 hexists user age查看 us

24、er 中是否有 age 字段(eger) 1:6379 hexists user name查看 user 中是否有 name 字段(eger) 0:6379 hincrby user age 2將用戶的加 2(eger) 22:6379 hget user age獲取用戶的22“.3獲取字段數(shù)量語法:HLEN key應(yīng)用商品信息商品字段【商品 id、商品名稱、商品描述、商品庫存、商品好評】定義商品信息的 key商品 1001 的信息在Redis 中的 key 為:items:1001商品信息獲取商品信息ListArraylist 和 linkedlist 的區(qū)別Arraylist 是使用數(shù)組來

25、數(shù)據(jù),特點(diǎn):查詢快、增刪慢Linkedlist 是使向鏈表數(shù)據(jù),特點(diǎn):增刪快、查詢慢,但是查詢鏈表兩端的數(shù)據(jù)也很:7003 HGET items:1001 id 3:7003 HGETALL items:10011) id 2) 3nameappleprice 6) 999.9:7003 HMSET items:1001 id 3 name apple price 999.9 OK:6379 hlen user(eger) 2快。Redis 的 list 是采用來鏈表來端數(shù)據(jù)來操作的。的,所以對于 redis 的 list 數(shù)據(jù)類型的操作,是操作 list 的兩命令 向列表兩端增加元素語向列表

26、左邊增加元素PUSH key value value .向列表右邊增加元素語法:RPUSH key value value . 查看列表LRANGE 命令是列表類型最常用令之一,獲取列表中的某一片段,將返回 start、stop 之間的所有元素(包含兩端的元素),索引從 0 開始。索引可以是負(fù)數(shù),如:“-1”代表最后邊的一個(gè)元素。語RANGE key start stop 從列表兩端彈出元素LPOP 命令從列表左邊彈出一個(gè)元素,會分兩步完成:第一步是將列表左邊的元素從列表中移除:6379 lrange list:1 0 21) 22) 13) 4:6379 lrange list1 0 -1:

27、6379 rpush list:1 4 5 6(eger) 3:6379 lpush list:1 1 2 3(eger) 3第二步是返回被移除的元素值。語法:LPOP key RPOP key 獲取列表中元素的個(gè)數(shù)語LEN key 其它命令().1刪除列表中指定的值LREM 命令會刪除列表中前count 個(gè)值為value 的元素,返回實(shí)際刪除的元素個(gè)數(shù)。根據(jù) count值的不同,該命令的執(zhí)行方式會有所不同:當(dāng) count0 時(shí),當(dāng) count lset l:list 2 2:6379 lindex l:list 21:6379 llen list:1(eger) 2:6379 lpop li

28、st:13“:6379 rpop list:16“.3只保留列表指定片段指定范圍和 LRANGE 一致語TRIM key start stop.4向列表中元素該命令首先會在列表中從左到右查找值為 pivot 的元素,然后根據(jù)第二個(gè)參數(shù)是 BEFORE 還是 AFTER 來決定將 value到該元素的前面還是后面。語INSERT key BEFORE|AFTivot value:6379 lrange list 0 -11) 32) 23) 1:6379 linsert list after 3 4(eger) 4:6379 lrange list 0 -11) 3:6379 lrange l:

29、list 0 -11) 62) 53) 04) 2:6379 ltrim l:list 0 2 OK:6379 lrange l:list 0 -11) 62) 53) 0OK:6379 lrange l:list 0 -11) 62) 53) 24) 2.5將元素從一個(gè)列表轉(zhuǎn)移到另一個(gè)列表中語法:RPOPLPUSH source destination應(yīng)用 商品評論列表思路:在 Redis 中創(chuàng)建商品評論列表用戶發(fā)布商品評論,將評論信息轉(zhuǎn)成json到 list 中。用戶在頁面查詢評論列表,從redis 中取出 json 數(shù)據(jù)展示到頁面。定義商品評論列表 key:商品為 1001 的商品評論

30、key【items: comment:1001】Set集合類型集合類型:無序、不可重復(fù)列表類型:有序、可重復(fù):7001 LPUSHment:1001 id:1,name: 商品不錯(cuò),很好 !,date:1430295077289:6379 rpoplpush list newlist 1:6379 lrange newlist 0 -11) 1:6379 lrange list 0 -11) 32) 43) 22) 43) 24) 1命令 增加/刪除元素語法:SADD key member member .語法:SREM key member member . 獲得集合中的所有元素語法:SME

31、MBERS key 判斷元素是否在集合中語法:SISMEMBER key member運(yùn)算命令 集合的差集運(yùn)算 A-B屬于 A 并且不屬于 B 的元素的集合。:6379 sismember set a (eger) 1:6379 sismember set h (eger) 0:6379 smembers set1) b2) a”:6379 srem set c d (eger) 1:6379 sadd set a b c (eger) 3:6379 sadd set a (eger) 0語法:SDIFF key key . 集合的交集運(yùn)算 A B屬于 A 且屬于 B 的元素的集合。語法:SE

32、R key key . 集合的并集運(yùn)算 A B屬于 A 或者屬于B 的元素的集合:6379 ser setA setB 1) 22) 3:6379 sadd setA 1 2 3(eger) 3:6379 sadd setB 2 3 4(eger) 3:6379 sdiff setA setB 1) 1:6379 sdiff setB setA 1) 4語法:SUNION key key .其它命令() 獲得集合中元素的個(gè)數(shù)語法:SCARD key 從集合出一個(gè)元素注意:由于集合是無序的,所有 SPOP 命令會從集合中隨機(jī)選擇一個(gè)元素彈出語法:SPOP key:6379 spop setA1“

33、:6379 smembers setA1) 12) 23) 3:6379 scard setA(eger) 3:6379 sunion setA setB 1) 12) 23) 34) 4SortedsetSortedset 又叫 zsetSortedset 是有序集合,可排序的,但是唯一。Sortedset 和 set 的不同之處,是會給 set 中的元素添加一個(gè)分?jǐn)?shù),然后通過這個(gè)分?jǐn)?shù)進(jìn)行排序。命令 增加元素向有序集合中加入一個(gè)元素和該元素的分?jǐn)?shù),如果該元素已經(jīng)存在則會用新的分?jǐn)?shù)替換原有的分?jǐn)?shù)。返回值是新加入到集合中的元素個(gè)數(shù),不包含之前已經(jīng)存在的元素。語法:ZADD key score m

34、ember score member . 獲取元素的分?jǐn)?shù)語法:ZSCORE key member 刪除元素移除有序集 key 中的一個(gè)或多個(gè)成員,不存在的成員將被忽略。當(dāng) key 存在但不是有序集類型時(shí),返回一個(gè)錯(cuò)誤。語法:ZREM key member member .:6379 zrem scorlisi (eger) 1:6379 zscore scorlisi 97:6379 zadd scor80 zhangsan 89 lisi 94 wangwu(eger) 3:6379 zadd scor97 lisi(eger) 0 獲得在某個(gè)范圍的元素列表獲得在某個(gè)范圍的元素列表按照元素分

35、數(shù)從小到大的順序返回索引從 start 到 stop 之間的所有元素(包含兩端的元素)語法:ZRANGE key start stop WITHSCORES按照元素分?jǐn)?shù)從大到小的順序返回索引從 start 到 stop 之間的所有元素(包含兩端的元素)語法:ZREVRANGE key start stop WITHSCORES如果需要獲得元素的分?jǐn)?shù)的可以在命令尾部加上 WITHSCORES 參數(shù) 獲取元素的從小到大語法:ZRkey member從大到小語法:ZREVRkey member:6379 ZREVRscorzhangsan (eger) 1:6379 ZRscorlisi (eger

36、) 0:6379 zrange scor0 1 WITHSCORES1) zhangsan 2) 803) wangwu 4) 94:6379 zrevrange scor0 2 lisi wangwu zhangsan “:6379 zrange scor0 2zhangsanwangwulisi“ 其它命令().1獲得指定分?jǐn)?shù)范圍的元素語法:ZRANGEBYSCORE key max WITHSCORES LIMIT offset count.2增加某個(gè)元素的分?jǐn)?shù)返回值是更改后的分?jǐn)?shù)語法:ZINCRBYkey increment member.3獲得集合中元素的數(shù)量語法:ZCARD key

37、.4獲得指定分?jǐn)?shù)范圍內(nèi)的元素個(gè)數(shù)語法:ZCOUNT key max:6379 ZCOUNT scor80 90(eger) 1:6379 ZCARD scor(eger) 3:6379 ZINCRBY scor4 lisi101“:6379 ZRANGEBYSCORE scor90 97 WITHSCORES1) wangwu 2) 943) lisi 4) 97:6379 ZRANGEBYSCORE scor70 100 limit 1 2wangwulisi.5按照范圍刪除元素語法:ZREMRANGEBYRkey start stop.6按照分?jǐn)?shù)范圍刪除元素語法:ZREMRANGEBYSC

38、ORE key max應(yīng)用 商品銷售榜需求:根據(jù)商品銷售量對商品進(jìn)行顯示思路:定義商品銷售榜(sorted set 集合),Key 為 itemlsort,分?jǐn)?shù)為商品銷售量。寫入商品銷售量:商品1001 的銷量是 9,商品1002 的銷量是 10商品1001 的銷量加 1商品銷量前 10 名::7001 ZRANGE itemlsort 0 9 withscores:7001 ZINCRBY itemlsort 1 1001:7007 ZADD itemlsort 9 1001 10 1002:6379 zadd scor84 zhangsan(eger) 1:6379 ZREMRANGEBY

39、SCORE scor80 100(eger) 1:6379 ZREMRANGEBYRscor0 1(eger) 2:6379 ZRANGE scor0 -11) lisi6 Keys 命令常用命令keys返回滿足給定 pattern的所有 keyexists確認(rèn)一個(gè) key 是否存在示例:從結(jié)果來看,數(shù)據(jù)庫中不存在 HongWan這個(gè) key,但是 age 這個(gè) key 是存在的del刪除一個(gè) keyredis :6379 del age (eger) 1redis :6379 exists age (eger) 0redis :6379 exists HongWan (eger) 0redi

40、s :6379 exists age (eger) 1redis :6379redis :6379 keys mylist*mylistmylist5mylist6mylist7mylist8rename重命名 key示例:age 成功的被改名為 age_new 了type返回值的類型示例:這個(gè)方法可以非常簡單的判斷出值的類型設(shè)置 key 的生存時(shí)間Redis 在實(shí)際使用過程中即:到期后數(shù)據(jù)銷毀。的用作緩存,然而緩存的數(shù)據(jù)一般都是需要設(shè)置生存時(shí)間的,例子::7002 set test 1設(shè)置 test 的值為 1 OK:7002 get test獲取 test 的值EXPIRE key sec

41、onds設(shè)置 key 的生存時(shí)間(:秒)key 在多少秒后會自動(dòng)刪除TTL key查看 key 生于的生存時(shí)間PERSIST key清除生存時(shí)間PEXPIRE key milliseconds生存時(shí)間設(shè)置為:毫秒redis :6379 type addr stringredis :6379 type myzset2 zsetredis :6379 type mylist listredis :6379redis :63791 keys *1) ageredis :63791 rename age age_new OKredis :63791 keys *1) age_newredis :637

42、917 Redis 持久化方案Rdb 方式Redis 默認(rèn)的方式,redis 通過快照來將數(shù)據(jù)持久化到磁盤中。設(shè)置持久化快照的條件在 redis.conf 中修改持久化快照的條件,如下:持久化文件的目錄在 redis.conf 中可以指定持久化文件的目錄1:7002 EXPIRE test 5設(shè)置 test 的生存時(shí)間為 5 秒(eger) 1:7002 TTL test查看 test 的生于生成時(shí)間還有 1 秒刪除(eger) 1:7002 TTL test(eger) -2:7002 get test獲取 test 的值,已經(jīng)刪除(nil)Rdb 問題一旦 redis關(guān)閉,那么會丟失最后一

43、次持久化之后的數(shù)據(jù)。如果數(shù)據(jù)不重要,則不必要關(guān)心。如果數(shù)據(jù)不能允許丟失,那么要使用 aof 方式。Aof 方式Redis 默認(rèn)是不使用該方式持久化的。Aof 方式的持久化,是操作一次 redis 數(shù)據(jù)庫,則將操作的到 aof 持久化文件中。第一步:開啟 aof 方式的持久化方案將 redis.conf 中的 appendonly 改為 yes,即開啟 aof 方式的持久化方案。Aof 文件的目錄和 rdb 方式的一樣。Aof 文件的名稱結(jié)論在使用 aof 和 rdb 方式時(shí),如果 redis 重啟,則數(shù)據(jù)從 aof 文件加載。8 Redis 的主從主從持久化保證了即使 redis 服務(wù)重啟也不

44、會丟失數(shù)據(jù),因?yàn)?redis 服務(wù)重啟后會將硬盤上持久化的數(shù)據(jù)恢復(fù)到內(nèi)存中,但是當(dāng) redis 服務(wù)器的硬盤損壞了可能會導(dǎo)致數(shù)據(jù)丟失,如果通過 redis 的主從機(jī)制就可以避免這種單點(diǎn)故障,如下圖:主 Redis(master)從 Redis2(slave)從 Redis1(slave)說明:主 redis 中的數(shù)據(jù)有兩個(gè)副本(replication)即從 redis1 和從 redis2,即使一臺 redis 服務(wù)器宕機(jī)其它兩臺 redis 服務(wù)也可以繼續(xù)提供服務(wù)。主 redis 中的數(shù)據(jù)和從 redis 上的數(shù)據(jù)保持實(shí)時(shí)同步,當(dāng)主 redis 寫入數(shù)據(jù)時(shí)通過主從復(fù)制機(jī)制會到兩個(gè)從 redi

45、s 服務(wù)上。只有一個(gè)主redis,可以有多個(gè)從 redis。主從不會阻塞 master,在同步數(shù)據(jù)時(shí),master 可以繼續(xù)處理 c nt 請求一個(gè) redis 可以即是主又是從,如下圖:主 Redis(master)從 Redis2(slave)從 Redis1(slave)從 Redis4(slave)從 Redis3(slave)主從設(shè)置主機(jī)配置無需配置從機(jī)配置第一步:出一個(gè)從機(jī)rootitheima redis19# cp bin/ bin2 r第二步:修改從機(jī)的redis.conf語法:Slaveof masterip mastslaveof 37 6379ort第三步:修改從機(jī)的

46、port 地址為 6380在 redis.conf 中修改第四步:清除從機(jī)中的持久化文件rootitheima bin2# rm -rf appendonly.aof dump.rdb第五步:啟動(dòng)從機(jī)rootitheima bin2# ./redis-server redis.conf第六步:啟動(dòng) 6380 的客戶端rootitheima bin2# ./redis-cli -p 6380注意:主機(jī)一旦發(fā)生增刪改操作,那么從機(jī)會將數(shù)據(jù)同步到從機(jī)中從機(jī)不能執(zhí)行寫操作:6380 set s2 222(error) READONLY You cant write against a read onl

47、y slave.9 Redis 集群redis-cluster 架構(gòu)圖示例如下:Server3 10001-13000Server1 0-5000Server2 5001-100007000架構(gòu)細(xì)節(jié):所有的redis 節(jié)點(diǎn)彼此互聯(lián)(-PONG 機(jī)制),二進(jìn)制協(xié)議優(yōu)化傳輸速度和帶寬.節(jié)點(diǎn)的 fail 是通過集群中超過半數(shù)的節(jié)點(diǎn)檢測失效時(shí)才生效.客戶端與 redis 節(jié)點(diǎn)直連,不需要中間proxy 層.客戶端不需要連接集群所有節(jié)點(diǎn),連接集群中任何一個(gè)可用節(jié)點(diǎn)即可redis-cluster 把所有的物理節(jié)點(diǎn)到0-16383slot 上,cluster 負(fù)責(zé)nodeslotvalueRedis 集群中

48、內(nèi)置了 16384 個(gè)哈希槽,當(dāng)需要在 Redis 集群中放置一個(gè) key-value時(shí),redis 先對 key 使用 crc16 算法算出一個(gè)結(jié)果,然后把結(jié)果對 16384 求余數(shù),這樣每個(gè) key 都會對應(yīng)一個(gè)在 0-16383 之間的哈希槽,redis 會根據(jù)節(jié)點(diǎn)數(shù)量大致均等的將哈希槽到不同的節(jié)點(diǎn)redis-cluster 投票:容錯(cuò)安裝 ruby集群管理工具(redis-trib.rb)是使用 ruby語言編寫的。第一步:安裝 rubyrootitheima bin2# yum install ruby rootitheima bin2# yum install rubygems第二

49、步:將以下文件上傳到 linux 系統(tǒng)集群中所有 master 參與投票,如果半數(shù)以上 master 節(jié)點(diǎn)與其中一個(gè) master 節(jié)點(diǎn)通信超過(cluster-node-timeout),認(rèn)為該 master 節(jié)點(diǎn)掛掉.:什么時(shí)候整個(gè)集群不可用(cluster_se:fail)?如果集群任意 master 掛掉,且當(dāng)前master 沒有 slave,則集群進(jìn)入 fail 狀態(tài)。也可以理解成集群的0-16383slot不完全時(shí)進(jìn)入 fail 狀態(tài)。如果集群超過半數(shù)以上 master 掛掉,無論是否有 slave,集群進(jìn)入 fail 狀態(tài)。第三步:安裝 ruby 和redis 接口rootith

50、eima # gem install redis-3.0.0.gem第四步:將redis-3.0.0 包下 src 目錄中的以下文件拷貝到 redis19/redis-cluster/rootitheima src# cd /usr/local/redis19/rootitheima redis19# mkdir redis-cluster rootitheima redis19# cd /root/redis-3.0.0/src/rootitheima src# cp redis-trib.rb/usr/local/redis19/redis-cluster第五步:查看是否拷貝成功搭建集群搭

51、建集群最少也得需要 3 臺主機(jī),如果每臺主機(jī)再配置一臺從機(jī)的話,則最少需要 6 臺機(jī)器。端口設(shè)計(jì)如下:7001-7006第一步:出一個(gè) 7001 機(jī)器rootitheima redis19# cp bin ./redis-cluster/7001 r第二步:如果存在持久化文件,則刪除rootitheima 7001# rm -rf appendonly.aof dump.rdb第三步:設(shè)置集群參數(shù)第四步:修改端口第五步:出 7002-7006 機(jī)器rootitheima redis-cluster# cp 7001/ 7002 -rrootitheima redis-cluster# cp 7

52、001/ 7003 -r rootitheima redis-cluster# cp 7001/ 7004 -r rootitheima redis-cluster# cp 7001/ 7005 -rrootitheima redis-cluster# cp 7001/ 7006 r第六步:修改 7002-7006 機(jī)器的端口第七步:啟動(dòng) 7001-7006 這六臺機(jī)器第八步:修改 start-all.sh 文件的權(quán)限r(nóng)ootitheima redis-cluster#od u+x start-all.shrootitheima redis-cluster# ./start-all.sh第九步

53、:創(chuàng)建集群rootitheima redis-cluster# ./redis-trib.rb create -replicas 1 37:7001 37:7002 37:7003 37:7004 37:700537:7006 Creating clusterConnecting to node 37:7001: OK Connecting to node 37:7002: OK Connecting to node 37:7003: OK Connecting to node 37:7004: OK Connecting to node 37:7005: OK Connecting to n

54、ode 37:7006: OK Performing hash slots allocation on 6 nodes. Using 3 masters:37:700137:700237:7003Adding replica 37:7004 to 37:7001Adding replica 37:7005 to 37:7002Adding replica 37:7006 to 37:7003M: 8240cd0fe6d6f842faa42b0174fe7c5ddcf7ae24 37:7001 slots:0-5460 (5461 slots) masterM: 4f52a974f64343fd

55、9f1ee0388490b3c0647a4db7 37:7002slots:5461-10922 (5462 slots) masterM: cb7c5def8f61df2016b38972396a8d1f349208c2 37:7003slots:10923-16383 (5461 slots) masterS: 66adf006fed43b3b5e499ce2ff1949a756504a16 37:7004replicates 8240cd0fe6d6f842faa42b0174fe7c5ddcf7ae24S: cbb0c9bc4b27dd85511a7ef2d01bec90e692793

56、b 37:7005replicates 4f52a974f64343fd9f1ee0388490b3c0647a4db7S: a908736eadd1cd06e86fdff8b2749a6f46b38c00 37:7006replicates cb7c5def8f61df2016b38972396a8d1f349208c2 Can I set the above configuration? (type yes to accept): yes Nodes configuration updated Assign a different config epoch to each node Sen

57、ding CLUSTER MEET messages to johe cluster Waiting for the cluster to join. Performing Cluster Check (using node 37:7001)M: 8240cd0fe6d6f842faa42b0174fe7c5ddcf7ae24 37:7001 slots:0-5460 (5461 slots) masterM: 4f52a974f64343fd9f1ee0388490b3c0647a4db7 37:7002slots:5461-10922 (5462 slots) master連接集群root

58、itheima 7001# ./redis-cli -h 37 -p 7001 c-c:指定是集群連接查看集群信息查看集群信息37:7002 cluster infocluster_se:okcluster_slots_assigned:16384cluster_slots_ok:16384cluster_slots_pfail:0M: cb7c5def8f61df2016b38972396a8d1f349208c2 37:7003slots:10923-16383 (5461 slots) masterM: 66adf006fed43b3b5e499ce2ff1949a756504a16 3

59、7:7004slots: (0 slots) masterreplicates 8240cd0fe6d6f842faa42b0174fe7c5ddcf7ae24M: cbb0c9bc4b27dd85511a7ef2d01bec90e692793b 37:7005slots: (0 slots) masterreplicates 4f52a974f64343fd9f1ee0388490b3c0647a4db7M: a908736eadd1cd06e86fdff8b2749a6f46b38c00 37:7006slots: (0 slots) masterreplicates cb7c5def8f

60、61df2016b38972396a8d1f349208c2 OK All nodes agree about slots configuration. Check for open slots. Check slots coverage. OK All 16384 slots covered. rootitheima redis-cluster#查看集群節(jié)點(diǎn)10jedis 連接集群設(shè)置rootitheima redis-cluster# vim /etc/sysconfig/iptables-A INPUT -m se -se NEW -m tcp -p tcp -dport 6379 -j

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論