摘要:區別的是會周期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,并且在此基礎上實現了主從同步。存盤可以有意無意的對數據進行寫操作。二的應用場景緩存常常作為數據緩存。如果只用類型,就可以被看作加上持久化特性的。
一、Redis基本概念介紹和特性 1.1 Redis基本概念介紹
????
1.Redis是遠程的,有客戶端和服務端,我們一般說的是服務端;1.2 Redis 和 Memcached比較2.Redis是基于內存的,所以比基于硬盤的MySQL要快很多,但非常吃內存
3.Redis是非關系型數據庫。本質上也是數據庫,但MySQL關系型數據庫存儲時必須定義數據詞典,而Redis則不需要。
????
????Redis數據類型都支持push/pop、add/remove及取交集并集和差集及更豐富的操作,而且這些操作都是原子性的。
????與Memcached一樣,為了保證效率,數據都是緩存在內存中。區別的是Redis會周期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,并且在此基礎上實現了master-slave(主從)同步。
1.3 Redis支持主從同步。????數據可以從主服務器向任意數量的從服務器上同步,從服務器可以是關聯其他從服務器的主服務器。這使得Redis可執行單層樹復制。存盤可以有意無意的對數據進行寫操作。由于完全實現了發布/訂閱機制,使得從數據庫在任何地方同步樹時,可訂閱一個頻道并接收主服務器完整的消息發布記錄。同步對讀取操作的可擴展性和數據冗余很有幫助。
二、Redis的應用場景 2.1 緩存????
Redis常常作為數據緩存。
????當某些系統接口比較慢的時候,我們可以把一些數據放在Redis中緩存起來,下次取數據就不進行非常耗時的SQL操作了,直接從緩存中取數據,提升系統性能最常用的方法之一;
2.2 隊列????push和pop操作保證了原子性的實現;
2.3 數據存儲????所有的增刪改查都是在Redis中進行,Redis有硬盤的持久化機制,定期進行存儲,保證了數據的完整性和安全性。
????查看redis客戶端: which redis-cli
????登錄:redis-cli(默認登錄本機6379端口)
????info命令查看redis信息
????在redis里邊,除了 和空格 不能作為名字的組成內容外,其他內容都可以作為key的名字部分。名字長度不做要求。
*exists key #測試指定key是否存在 del key1 key2 key3 #刪除給定的key *type key #返回給定的value的類型 keys pattern #返回匹配指定模式的所有key rename oldkey newkey#改名字 *dbsize #返回當前數據庫的key數量 expire key seconds #為key指定過期時間 *ttl key #返回key的剩余過期秒數 *select db-index #選擇數據庫,一共16個 move key db-index #將key從當前數據庫移動到指定數據庫 *flushdb #刪除當前數據庫中所有key flushall #刪除所有數據庫中的所有key
????
3.1 String字符串類型的操作????
功能:提供字符串或者整型操作。
set key value(string/int/float) get key incr string [value]//自增 decrby string [value] //自減
string是redis最基本的類型
????redis的string可以包含任何數據。包括jpg圖片(二進制)或者序列化的對象。
????單個value值最大上限是1G字節。
????如果只用string類型,redis就可以被看作加上持久化特性的memcache。
set key value #設置key對應的值為string類型的value *mset key1 value1 key2 value2 #一次設置多個key的值 *mget key1 key2 #一次獲取多個key的值 *incr key #對key的值做加加操作,并返回新的值 decr key #對key的值做漸減操作,并返回新的值 incrby key integer #同incr,加指定的值 decrby key integer #同decr,減指定的值 *append key value #給指定key的字符串值追加value *substr key start end #返回截取過的key的字符串值3.2 List鏈表類型
????
功能:存儲序列集合,可用于隊列,push和pop操作
lpush 左進 rpop 右出 llen key 查看list有幾個元素
????List類型是先進先出,適合隊列;List不要求里面的元素是唯一的
(一)介紹
????獲得最新的10個登錄用戶信息: select * from user order by logintime desc limit 10;
以上sql語句可以實現用戶需求,但是數據多的時候,全部數據都要受到影響,對數據庫的負載比較高。必要情況還需要給關鍵字段(id或logintime)設置索引,索引也比較耗費系統資源。
????如果通過list鏈表實現以上功能,可以在list鏈表中只保留最新的10個數據,每進來一個新數據就刪除一個舊數據。每次就可以從鏈表中直接獲得需要的數據。極大節省各方面資源消耗
(二)應用
????list類型其實就是一個雙向鏈表。通過push,pop操作從鏈表的頭部或者尾部添加刪除元素。
這使得list既可以用作棧,也可以用作隊列。
上進上出 :棧
上進下出 :隊列
????
lpush key string #在key對應list的頭部添加字符串元素 rpop key #在list的尾部刪除元素,并返回刪除元素 llen key 返回key #對應list的長度,key不存在返回0,如果key對應類型不是list返回錯誤 lrange key start end #返回指定區間內的元素,下標從0開始 rpush key string #同上,在尾部添加 lpop key #從list的頭部刪除元素,并返回刪除元素 ltrim key start end #截取list,保留指定區間內元素
1.lrange key 0 -1 取出所有元素。
2.lrem key n/-n X 刪除指定元素n次。
3.linsert key after/before key1 key2 在key1后/前插入key2。
4.rpoplpush key1 key2 將key1右邊key左入key2鏈表,原子性。
的操作使用
????
功能:無序集合,每個元素都不一樣。
添加元素:sadd key value 判斷有多少個元素:scard key 判斷某個元素是否在set里面:sismember key value 刪除某個元素:srem key value 獲取全部值,并以數組方式返回:$redis->sMembers("dst")); int(2) array(2) { [0]=> string(1) "4" [1]=> string(1) "2" }3.3 Set類型
??set類型,無序的方式存儲多個不同的元素,對元素可以進行快速的添加、查找和刪除;相同的元素只算一個。
????redis的set是string類型的無序集合。
????set元素最大可以包含(2的32次方-1)個元素。
????關于set集合類型除了基本的添加刪除操作,
????其他有用的操作還包含集合的取并集(union),交集(intersection),????差集(difference)。通過這些操作可以很容易的實現sns中的好友推薦功能。
????注意:每個集合中的各個元素不能重復。
sadd key member #添加一個string元素到key對應的set集合中,成功返回1,如果元素已經在集合中,返回0,key對應的set不存在返回錯誤 srem key member [memeber] #從key對應set中移除給定元素,成功返回1 smove p1 p2 member #從p1 對應set中移除member并添加到p2對應set中 scard key #返回set的元素個數 sismember key member #判斷member是否在set中 sinter key1 key2...keyn #返回所有給定key的交集 sunion key1 key2...keyn #返回所有給定key的并集 sdiff key1 key2...keyn #返回所有給定key的差集 smembers key #返回key對應set的所有元素,結果是無序的
該類型應用場合:qq好友推薦。
tom朋友圈(與某某是好友):mary jack xiaoming wang5 wang6 linken朋友圈(與某某是好友):yuehan daxiong luce wang5 wang6
????
3.4 hash類型????
功能:存儲的是key-value結構,key必須是string
????經常用于存儲比較復雜的結構,Hash只要求鍵不一樣,比如姓名,年齡等等
插入/修改:hset hash1 key1 12 獲取:hget hash1 key1 查看hash長度:hlen key 一次性獲取:hmget hash1 key1 key2
????
????
3.5 Sort Set排序集合類型????
功能:存儲是帶分數的有序集合,經常用于排行榜。
????sort set 經常被用作排名例如 班級成績排名
????存儲和hash一樣,都是一個映射。存儲的是分數與元素的映射。可以看出是排行榜。
????value必須是全局唯一。
????score 是浮點型。
????sort set類型操作,如果兩個元素的score一樣,按照字節順序排列先后
增加/修改:zadd zset1 10.1 val1 查看個數:zcard zset1 查看排名:zrange zset1 0 2 withscores 查看某個value排名:zrank zset1 val2
和set一樣sorted set也是string類型元素的集合,不同的是每個元素都會關聯一個權。 通過權值可以有序的獲取集合中的元素。
????該Sort set類型適合場合:
????獲得熱門帖子(回復量)信息:select * from message order by backnum desc limit 5;
????(以上需求可以通過簡單sql語句實現,但是sql語句比較耗費mysql數據庫資源)
????案例:利用sort set實現獲取最熱門的前5帖子信息
????
????排序集合中的每個元素都是值、權的組合 (之前的set集合類型每個元素就只是一個 值)
????
我們只做一個sort set排序集合,里邊只保留5個元素信息,該5個元素是回復量最高的
每個帖子被回復的時候,都有機會進入該集合里邊,但是只有回復量最高的前5個帖子會存在于在集合,回復量低的就被刪除。
127.0.0.1:6379> select 2 OK 127.0.0.1:6379[2]> zadd hotmessage 102 11 //添加 (integer) 1 127.0.0.1:6379[2]> zadd hotmessage 141 12 (integer) 1 127.0.0.1:6379[2]> zadd hotmessage 159 13 (integer) 1 127.0.0.1:6379[2]> zadd hotmessage 72 14 (integer) 1 127.0.0.1:6379[2]> zadd hotmessage 203 15 (integer) 1 127.0.0.1:6379[2]> keys * 1) "hotmessage" 127.0.0.1:6379[2]> zrevrange hotmessage 0 100 //按照權由高到低的順序獲得具體元素值的信息 1) "15" 2) "13" 3) "12" 4) "11" 5) "14" 127.0.0.1:6379[2]> zadd hotmessage 189 16 (integer) 1 127.0.0.1:6379[2]> zrevrange hotmessage 0 100 1) "15" 2) "16" 3) "13" 4) "12" 5) "11" 6) "14" 127.0.0.1:6379[2]> zremrangebyrank hotmessage 0 0 (integer) 1 //把權最低的那個刪掉 0 0表示刪除第一個權;0 1表示刪除第一個,第二個權; 127.0.0.1:6379[2]> zrevrange hotmessage 0 100 1) "15" 2) "16" 3) "13" 4) "12" 5) "11" 127.0.0.1:6379[2]> zrank hotmessage 12 //權由低到高獲得元素排名 (integer) 1 127.0.0.1:6379[2]> zrank hotmessage 11 (integer) 0 127.0.0.1:6379[2]> zrevrank hotmessage 13 //權由高到低獲得元素排名 (integer) 2 127.0.0.1:6379[2]> zcard hotmessage //獲得集合中元素個數 (integer) 5 127.0.0.1:6379[2]> zscore hotmessage 16 //根據元素值獲得對應的權 "189" 127.0.0.1:6379[2]> zincrby hotmessage 100 12 //給指定的元素值增加一些權信息 "241" 127.0.0.1:6379[2]> zrevrange hotmessage 0 100 1) "12" 2) "15" 3) "16" 4) "13" 5) "11" 127.0.0.1:6379[2]>四、持久化操作
????Redis為了內部數據的安全考慮,會把本身的數據以文件形式保存到硬盤中一份,在服務器重啟之后會自動把硬 盤的數據恢復到內存(redis)的里邊。 數據保存到硬盤的過程就稱為持久化效果
????相關指令:
./redis-cli bgsave //異步保存數據到磁盤(快照保存) ./redis-cli 1h 127.0.0.1 -p 6379 bgsave ./redis-cli lastsave //返回上次成功保存到磁盤的unix時間戳 ./redis-cli shutdown //同步保存到服務器并關閉redis服務器 ./redis-cli bgrewriteaof //當日志文件過長時優化AOF日志文件存儲4.1 snap shotting快照持久化
該持久化默認開啟,一次性把redis中全部的數據保存一份存儲在硬盤中,如果數據非常多(10-20G)就不適合頻繁進行該持久化操作。
????1.快照持久化在本地硬盤保留的數據備份文件
????
????2.快照持久化的備份頻率:
????在redis.conf配置文件中
????
save 900 1 #900 秒內如果超過 1 個 key 被修改,則發起快照保存 save 300 10 #300秒超過10個key被修改,發起快照 save 60 10000 #60秒超過10000個key被修改,發起快照
????以上三個save的意思:
????數據修改的頻率非常高,備份的頻率也高
????數據修改的頻率低,備份的頻率也低
????3.快照持久化文件的命名和存儲位置:
????在redis.conf配置文件中
????
????4.手動發起快照持久化
./redis-cli -h 192.168.10.138 -p 6379 bgsave //給定ip地址發起快照持久化 ./redis-cli bgsave //本機發起快照持久化4.2 append only file (AOF持久化)
????本質:把用戶執行的每個“寫”指令(添加、修改、刪除)都備份到文件中,還原數據的時候就是執行具體寫指令而已。
????1.開啟AOF持久化(會清空redis內部的數據):
????(同時可以修改備份文件的名字,默認是appendonly.aof)
????在redis.conf配置文件中
????
????2.配置文件被修改,需要刪除舊進程,再根據新的配置文件啟動新進程:
????
????3.新進程啟動好后會看到對應的aof持久化備份文件appendonly.aof:
????
????4.aof追加持久化的備份頻率:
????在redis.conf配置文件中
????
????5.為aof備份文件做優化處理
????對appendonly.aof文件內容做優化壓縮處理。(例如:多個inr指令變為一個set指令)
????
????6.持久化相關指令
????
五、Redis的主從模式 5.1 使用背景????為了降低每個redis服務器的負載,可以多設置幾個服務器,并做主從模式 一個服務器負載“寫”(添加、修改、刪除)數據,其他服務器負載“讀”數據。主服務器數據會“自動”同步給從服務器。
????
5.2 設置主從模式????1.在從Redis服務器中,找到配置文件redis.conf
????
????默認是關閉主從模式的,修改后
????
????2.關閉從Redis服務器,重新加載配置文件
./redis-cli shutdown ./redis-server redis.conf
????3.從服務器默認禁止寫入操作(可以修改如下圖參數使得其可以寫入數據):
????
Redis主從復制哨兵模式
windows下安裝redis 以及phpredis的擴展 (windows redis php&php7)
六、創建連接redis的客戶端????連接redis:
????創建connect.php文件
connect("127.0.0.1",6379); //string操作 $redis->delete("string1"); $redis->set("string1","val1"); $val = $redis->get("string1"); var_dump($val); //val1 $redis->set("string1",4); $redis->incr("string1",2); $val = $redis->get("string1"); var_dump($val); //6 # 字符串(string) 存儲key/value,相當于設一個變量。例如對一個key值執行INCR操作,統計實時點擊量。set/get # 哈希(hash) 用于存儲對象信息,一個key就是一個對象。field/value構成鍵值對。hset key field value # 列表(list) lpush/lrange/lpop # 集合(set) 用于交集并集,例如新浪微博的共同關注 sadd/smembers/sunion/sinter # 有序集合(zset) 用于排序,例如top N的獲取 zadd/zrangebyscore
????命令記憶總結:
字符串和哈希,是key/value相關,用set創建。 set/hset/hmset 集合和有序集合,是集合相關,用add創建。sadd/zadd 列表用push創建。lpush
完
參考資料如下:
1. 傳智播客redis基礎視頻教程
2. Redis-傳智播客-學習筆記
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/61835.html
摘要:持久化到中反向代理的負載均衡基于的集群搭建如何實現從中訂閱消息轉發到客戶端的擴展是阻塞式,使用訂閱發布模式時,會導致整個進程進入阻塞。緩存是用于解決高并發場景下系統的性能及穩定性問題的銀彈。 showImg(https://segmentfault.com/img/bVYE6k?w=900&h=385); Redis 是由意大利程序員 Salvatore Sanfilippo(昵稱:a...
摘要:數據結構和算法樹快速排序,堆排序,插入排序其實八大排序算法都應該了解一致性算法,一致性算法的應用的內存結構。如何存儲一個的。八大排序算法一定要手敲一遍快排,堆排尤其重要。面試是一個雙向選擇的過程,不要抱著畏懼的心態去面試,不利于自己的發揮。 前言 16年畢業到現在也近兩年了,最近面試了阿里集團(菜鳥網絡,螞蟻金服),網易,滴滴,點我達,最終收到點我達,網易offer,螞蟻金服二面掛掉,...
閱讀 1080·2021-11-24 09:39
閱讀 1314·2021-11-18 13:18
閱讀 2443·2021-11-15 11:38
閱讀 1832·2021-09-26 09:47
閱讀 1632·2021-09-22 15:09
閱讀 1630·2021-09-03 10:29
閱讀 1515·2019-08-29 17:28
閱讀 2956·2019-08-29 16:30