Redis(一)簡介及安裝、測試
一、Redis簡介:
關於關係型資料庫和nosql資料庫
關係型資料庫是基於關係表的資料庫,最終會將資料持久化到磁碟上,而nosql資料 庫是基於特殊的結構,並將資料儲存到記憶體的資料庫。從效能上而言,nosql資料庫 要優於關係型資料庫,從安全性上而言關係型資料庫要優於nosql資料庫,所以在實 際開發中一個專案中nosql和關係型資料庫會一起使用,達到效能和安全性的雙保證。
(1)、什麼是Redis?
redis是一個用C語言編寫的(C語言編寫,最貼近系統底層,速度快)、開源高效能的、支援網路互動的、基於記憶體、可持久化的Key-Value資料庫。
其中value支援五種資料型別:
1.字串(string)
2.字串列表(list)
3.字串集合(set)
4.有序字串集合(sorted set)
5.雜湊(hash)
而關於key,有幾個點要提醒大家:
1.key不要太長,儘量不要超過1024位元組,這不僅消耗記憶體,而且會降低查詢的效率;
2.key也不要太短,太短的話,key的可讀性會降低;
3.在一個專案中,key最好使用統一的命名模式,例如user:10000:passwd。
(2)、Redis能做什麼?
1、快取(最多使用),資料查詢、短連線、新聞內容、商品內容;
2、應用排行榜,如果使用傳統的關係型資料庫來做這個事兒,非常的麻煩,而利用Redis的SortSet資料結構能夠非常方便搞定;
3、簡單訊息佇列,除了Redis自身的釋出/訂閱模式,我們也可以利用List來實現一個佇列機制,秒殺、搶購、到貨通知、郵件傳送等,不需要高可用,但是會帶來非常大的DB壓力,完全可以用List來完成非同步解耦;
計算器/限速器,利用Redis中原子性的自增操作,我們可以統計類似使用者點贊數、使用者訪問數等,這類操作如果用MySQL,頻繁的讀寫會帶來相當大的壓力;限速器比較典型的使用場景是限制某個使用者訪問某個API的頻率,常用的有搶購時,防止使用者瘋狂點選帶來不必要的壓力;
注:限速器也是對請求限流的一種實現方式。
4、聊天室,線上好友列表。
好友關係,利用集合的一些命令,比如求交集、並集、差集等。可以方便搞定一些共同好友、共同愛好之類的功能;
5、網站訪問統計;
6、分散式叢集架構中的Session共享,預設Session是儲存在伺服器的檔案中,即當前伺服器,如果是叢集服務,同一個使用者過來可能落在不同機器上,這就會導致使用者頻繁登陸;採用Redis儲存Session後,無論使用者落在那臺機器上都能夠獲取到對應的Session資訊。
(3)、Memecache、Redis、MongoDB三者區別
Memecache、Redis、MongoDB三者都可用於資料庫的快取,但在業務上有所區分:
1、Memcached:記憶體型資料庫,無持久化功能,掉電即失,可靠性差,用於動態系統中減輕資料庫負載,提升效能;做快取,適合多讀少寫,大資料量的情況(如人人網大量查詢使用者資訊、好友資訊、文章資訊等)。
2、Redis:記憶體型資料庫,有持久化功能,具備分散式特性,可靠性高,適用於對讀寫效率要求都很高,資料處理業務複雜和對安全性要求較高的系統(如新浪微博的計數和微博釋出部分系統,對資料安全性、讀寫要求都很高)。
3、MongoDB: Mongodb是文件型的非關係型資料庫,其優勢在於查詢功能比較強大,能儲存海量資料,主要解決海量資料的訪問效率問題。
(4)、Redis資料淘汰策略
如果:“MySQL裡有2000w資料,redis中只存20w的資料,如何保證redis中的資料都是熱點資料?”
在 redis 中,允許使用者設定最大使用記憶體大小通過配置redis.conf中的maxmemory這個值來開啟記憶體淘汰功能,在記憶體限定的情況下是很有用的。設定最大記憶體大小可以保證redis對外提供穩健服務。
redis 記憶體資料集大小上升到一定大小的時候,就會施行資料淘汰策略。redis 提供 6種資料淘汰策略通過maxmemory-policy設定策略:
- volatile-lru:從已設定過期時間的資料集(server.db[i].expires)中挑選最近最少使用的資料淘汰
- volatile-ttl:從已設定過期時間的資料集(server.db[i].expires)中挑選將要過期的資料淘汰
- volatile-random:從已設定過期時間的資料集(server.db[i].expires)中任意選擇資料淘汰
- allkeys-lru:從資料集(server.db[i].dict)中挑選最近最少使用的資料淘汰
- allkeys-random:從資料集(server.db[i].dict)中任意選擇資料淘汰
- no-enviction(驅逐):禁止驅逐資料
redis 確定驅逐某個鍵值對後,會刪除這個資料並將這個資料變更訊息釋出到本地(AOF 持久化)和從機(主從連線)。
二、Redis的安裝
(1)、Windows上的安裝
下載地址:https://github.com/MSOpenTech/redis/releases。
下載之後直接解壓到你想要安裝的資料夾(不用安裝,解壓即可用)
解壓目錄:
1、點選redis-server.exe,開啟Redis服務端。
2、點選redis-cli.exe,開啟Redis客戶端,進行查詢……等功能。
(2)、Linux安裝Redis
檢視這個部落格,相當的詳細:https://www.cnblogs.com/wangchunniu1314/p/6339416.html
redis在Linux上的安裝
1)安裝redis編譯的c環境,yum install gcc-c++
2)將redis-2.6.16.tar.gz上傳到Linux系統中
3)解壓到/usr/local下 tar -xvf redis-2.6.16.tar.gz -C /usr/local
4)進入redis-2.6.16目錄 使用make命令編譯redis
5)在redis-2.6.16目錄中 使用make PREFIX=/usr/local/redis install命令安裝 redis到/usr/local/redis中
6)拷貝redis-2.6.16中的redis.conf到安裝目錄redis中
7)啟動redis 在bin下執行命令redis-server redis.conf
8)如需遠端連線redis,需配置redis埠6379在linux防火牆中開發
/sbin/iptables -I INPUT -p tcp --dport 6379 -j ACCEPT
/etc/rc.d/init.d/iptables save
啟動後看到如上歡迎頁面,但此視窗不能關閉,視窗關閉就認為redis也關閉了(類 似Tomcat通過bin下的startup.bat的方式)
解決方案:可以通過修改配置檔案 配置redis後臺啟動,即伺服器啟動了但不會 穿件控制檯視窗
將redis.conf檔案中的daemonize從false修改成true表示後臺啟動
使用命令檢視6379埠是否啟動ps -ef | grep redis
9)Linux停止
三、Redis的學習,主要是對資料的儲存,下面將來學習各種Redis的資料型別的儲存操作:
1.儲存字串string
字串型別是Redis中最為基礎的資料儲存型別,它在Redis中是二進位制安全的,這 便意味著該型別可以接受任何格式的資料,如JPEG影象資料或Json物件描述資訊等。 在Redis中字串型別的Value最多可以容納的資料長度是512M
1)set key value:設定key持有指定的字串value,如果該key存在則進行覆蓋 操作。總是返回”OK”
2)get key:獲取key的value。如果與該key關聯的value不是String型別,redis 將返回錯誤資訊,因為get命令只能用於獲取String value;如果該key不存在,返 回null。
3)getset key value:先獲取該key的值,然後在設定該key的值。
4)incr key:將指定的key的value原子性的遞增1.如果該key不存在,其初始值 為0,在incr之後其值為1。如果value的值不能轉成整型,如hello,該操作將執 行失敗並返回相應的錯誤資訊。
5)decr key:將指定的key的value原子性的遞減1.如果該key不存在,其初始值 為0,在incr之後其值為-1。如果value的值不能轉成整型,如hello,該操作將執 行失敗並返回相應的錯誤資訊。
6)incrby key increment:將指定的key的value原子性增加increment,如果該 key不存在,器初始值為0,在incrby之後,該值為increment。如果該值不能轉成 整型,如hello則失敗並返回錯誤資訊
7)decrby key decrement:將指定的key的value原子性減少decrement,如果 該key不存在,器初始值為0,在decrby之後,該值為decrement。如果該值不能 轉成整型,如hello則失敗並返回錯誤資訊
8)append key value:如果該key存在,則在原有的value後追加該值;如果該key 不存在,則重新建立一個key/value
2.儲存lists型別
在Redis中,List型別是按照插入順序排序的字串連結串列。和資料結構中的普通連結串列 一樣,我們可以在其頭部(left)和尾部(right)新增新的元素。在插入時,如果該鍵並不 存在,Redis將為該鍵建立一個新的連結串列。與此相反,如果連結串列中所有的元素均被移 除,那麼該鍵也將會被從資料庫中刪除。List中可以包含的最大元素數量是 4294967295。
從元素插入和刪除的效率視角來看,如果我們是在連結串列的兩頭插入或刪除元素,這將 會是非常高效的操作,即使連結串列中已經儲存了百萬條記錄,該操作也可以在常量時間 內完成。然而需要說明的是,如果元素插入或刪除操作是作用於連結串列中間,那將會是 非常低效的。相信對於有良好資料結構基礎的開發者而言,這一點並不難理解。
1)lpush key value1 value2...:在指定的key所關聯的list的頭部插入所有的 values,如果該key不存在,該命令在插入的之前建立一個與該key關聯的空鏈 表,之後再向該連結串列的頭部插入資料。插入成功,返回元素的個數。
2)rpush key value1、value2…:在該list的尾部新增元素
3)lrange key start end:獲取連結串列中從start到end的元素的值,start、end可 為負數,若為-1則表示連結串列尾部的元素,-2則表示倒數第二個,依次類推…
4)lpushx key value:僅當引數中指定的key存在時(如果與key管理的list中沒 有值時,則該key是不存在的)在指定的key所關聯的list的頭部插入value。
5)rpushx key value:在該list的尾部新增元素
6)lpop key:返回並彈出指定的key關聯的連結串列中的第一個元素,即頭部元素。
7)rpop key:從尾部彈出元素。
8)rpoplpush resource destination:將連結串列中的尾部元素彈出並新增到頭部
9)llen key:返回指定的key關聯的連結串列中的元素的數量。
10)lset key index value:設定連結串列中的index的腳標的元素值,0代表連結串列的頭元 素,-1代表連結串列的尾元素。
11)lrem key count value:刪除count個值為value的元素,如果count大於0,從頭向尾遍歷並刪除count個值為value的元素,如果count小於0,則從尾向頭遍歷並刪除。如果count等於0,則刪除連結串列中所有等於value的元素。
12)linsert key before|after pivot value:在pivot元素前或者後插入value這個 元素。
3.儲存sets型別
在Redis中,我們可以將Set型別看作為沒有排序的字元集合,和List型別一樣,我 們也可以在該型別的資料值上執行新增、刪除或判斷某一元素是否存在等操作。需要 說明的是,這些操作的時間是常量時間。Set可包含的最大元素數是4294967295。
和List型別不同的是,Set集合中不允許出現重複的元素。和List型別相比,Set類 型在功能上還存在著一個非常重要的特性,即在伺服器端完成多個Sets之間的聚合計 算操作,如unions、intersections和differences。由於這些操作均在服務端完成, 因此效率極高,而且也節省了大量的網路IO開銷
1)sadd key value1、value2…:向set中新增資料,如果該key的值已有則不會 重複新增
2)smembers key:獲取set中所有的成員
3)scard key:獲取set中成員的數量
4)sismember key member:判斷引數中指定的成員是否在該set中,1表示存 在,0表示不存在或者該key本身就不存在
5)srem key member1、member2…:刪除set中指定的成員
6)srandmember key:隨機返回set中的一個成員
7)sdiff sdiff key1 key2:返回key1與key2中相差的成員,而且與key的順序有 關。即返回差集。
8)sdiffstore destination key1 key2:將key1、key2相差的成員儲存在 destination上
9)sinter key[key1,key2…]:返回交集。
10)sinterstore destination key1 key2:將返回的交集儲存在destination上
11)sunion key1、key2:返回並集。
12)sunionstore destination key1 key2:將返回的並集儲存在destination上
4.儲存sortedset
Sorted-Sets和Sets型別極為相似,它們都是字串的集合,都不允許重複的成員出 現在一個Set中。它們之間的主要差別是Sorted-Sets中的每一個成員都會有一個分 數(score)與之關聯,Redis正是通過分數來為集合中的成員進行從小到大的排序。然 而需要額外指出的是,儘管Sorted-Sets中的成員必須是唯一的,但是分數(score) 卻是可以重複的。
在Sorted-Set中新增、刪除或更新一個成員都是非常快速的操作,其時間複雜度為 集合中成員數量的對數。由於Sorted-Sets中的成員在集合中的位置是有序的,因此, 即便是訪問位於集合中部的成員也仍然是非常高效的。事實上,Redis所具有的這一 特徵在很多其它型別的資料庫中是很難實現的,換句話說,在該點上要想達到和Redis 同樣的高效,在其它資料庫中進行建模是非常困難的。
例如:遊戲排名、微博熱點話題等使用場景。
1)zadd key score member score2 member2 … :將所有成員以及該成員的 分數存放到sorted-set中
2)zcard key:獲取集合中的成員數量
3)zcount key min max:獲取分數在[min,max]之間的成員
zincrby key increment member:設定指定成員的增加的分數。
zrange key start end [withscores]:獲取集合中腳標為start-end的成員,[withscores]引數表明返回的成員包含其分數。
zrangebyscore key min max [withscores] [limit offset count]:返回分數在[min,max]的成員並按照分數從低到高排序。[withscores]:顯示分數;[limit offset count]:offset,表明從腳標為offset的元素開始並返回count個成員。
zrank key member:返回成員在集合中的位置。
zrem key member[member…]:移除集合中指定的成員,可以指定多個成員。
zscore key member:返回指定成員的分數
5.儲存hash
Redis中的Hashes型別可以看成具有String Key和String Value的map容器。所 以該型別非常適合於儲存值物件的資訊。如Username、Password和Age等。如果 Hash中包含很少的欄位,那麼該型別的資料也將僅佔用很少的磁碟空間。每一個Hash 可以儲存4294967295個鍵值對。
1)hset key field value:為指定的key設定field/value對(鍵值對)。
2)hgetall key:獲取key中的所有filed-vaule
3)hget key field:返回指定的key中的field的值
4)hmset key fields:設定key中的多個filed/value
5)hmget key fileds:獲取key中的多個filed的值
6)hexists key field:判斷指定的key中的filed是否存在
7)hlen key:獲取key所包含的field的數量
8)hincrby key field increment:設定key中filed的值增加increment,如:age 增加20