Redis學習(2)Redis 基礎知識和數據類型

1.【redis是什麼】
Redis 全程:REmote DIctionary Server(遠程字典服務器)
Redis 是完全開源免費的,用C語言編寫的,遵守BSD協議,是一個高性能的(key/value)分佈式內存數據庫,基於內存運行
並支持持久化的NoSQL數據庫,是當前最熱門的NoSql數據庫之一,也被人們稱爲數據結構服務器。
目前,Vmware在資助着redis項目的開發和維護。

Redis從它的許多競爭繼承來的三個主要特點:
1).Redis數據庫完全在內存中,使用磁盤僅用於持久性。
2).相比許多鍵值數據存儲,Redis擁有一套較爲豐富的數據類型。
3).Redis可以將數據複製到任意數量的從服務器。

Redis 優勢
1).異常快速:Redis的速度非常快,每秒能執行約11萬集合,每秒約81000+條記錄。
2).支持豐富的數據類型:Redis支持最大多數開發人員已經知道像列表,集合,有序集合,散列數據類型。這使得它非常容3).易解決各種各樣的問題,因爲我們知道哪些問題是可以處理通過它的數據類型更好。
4).操作都是原子性:所有Redis操作是原子的,這保證瞭如果兩個客戶端同時訪問的Redis服務器將獲得更新後的值。
5).多功能實用工具:Redis是一個多實用的工具,可以在多個用例如緩存,消息,隊列使用(Redis原生支持發佈/訂閱),任何短暫的數據,應用程序,如Web應用程序會話,網頁命中計數等。

Redis 網站
1). http://redis.io/ (官網)
2). http://redis.cn/

2.【Redis啓動後雜項基礎知識講解】
1).Redis是一個單進程服務器:單進程模型來處理客戶端的請求。對讀寫等事件的響應是通過對epoll函數的包裝來做到的。Redis的實際處理速度完全依靠主進程的執行效率。epoll是Linux內核爲處理大批量文件描述符而作了改進的epoll,是Linux下多路複用IO接口select/poll的增強版本,它能顯著提高程序在大量併發連接中只有少量活躍的情況下的系統CPU利用率。
2).默認16個數據庫,類似數組下表從零開始,初始默認使用零號庫
3).select 命令切換數據庫
4).dbsize 查看當前數據庫的key的數量
5).flushdb 清空當前庫
6).Flushall 清空全部庫
這裏寫圖片描述
7).統一密碼管理,16個庫都是同樣密碼,要麼都OK要麼一個也連接不上

8).Redis索引都是從零開始
9).默認端口是6379

3.【Redis 數據類型】
redis是一種高級的key:value存儲系統,其中value支持五種數據類型:
1.字符串(strings)
2.字符串列表(lists)
3.字符串集合(sets)
4.有序字符串集合(sorted sets)
5.哈希(hashes)

而關於key,有幾個點要提醒大家:
1).key不要太長,儘量不要超過1024字節,這不僅消耗內存,而且會降低查找的效率;
2).key也不要太短,太短的話,key的可讀性會降低;
3).在一個項目中,key最好使用統一的命名模式,例如user:10000:passwd。

Redis key 常用方法
1).keys *
查看數據庫中所有的可以list,通常不建議使用,如果key有成千上萬會很痛苦。
2).exists key的名字
判斷某個key是否存在
3).move key db
移動key到其他數據中,當前庫就沒有了,被移除了
4). expire key 秒鐘
爲給定的key設置過期時間,過期後key從數據庫中被刪除
5).ttl key
查看還有多少秒過期,-1表示永不過期,-2表示已過期
6). type key
查看key是什麼類型
這裏寫圖片描述

1. string(字符串)
string是redis最基本的類型,你可以理解成與Memcached一模一樣的類型,一個key對應一個value。
string類型是二進制安全的。意思是redisd string可以包含任何數據,比如:jpg圖片或者序列化的對象。
一個redis中的字符串value最多可以存儲512M。
常用方法
1)set/get/del/append/strlen
這裏寫圖片描述
2)Incr/decr/incrby/decrby,一定要是數字才能進行加減
由於INCR等指令本身就具有原子操作的特性,所以我們完全可以利用redis的INCR、INCRBY、DECR、DECRBY等指令來實現原子計數的效果,假如,在某種場景下有3個客戶端同時讀取了mynum的值(值爲2),然後對其同時進行了加1的操作,那麼,最後mynum的值一定是5。不少網站都利用redis的這個特性來實現業務上的統計計數需求。
這裏寫圖片描述
另外,如果是數字字符串類型進行數值操作時,redis會將字符串類型轉換成數值。
這裏寫圖片描述

3)getrange/setrange
getrange:獲取指定區間範圍內的值,類似between……and的關係,從零到負一表示全部
setrange:設置指定區間範圍內的值,格式是setrange key值 具體值
這裏寫圖片描述

4) setex(set with expire)鍵秒值/setnx(set if not exist)
setex:設置帶過期時間的key,動態設置。
setex 鍵 秒值 真實值
setnx:只有在 key 不存在時設置 key 的值。
這裏寫圖片描述

6)mset/mget/msetnx
mset:同時設置一個或多個 key-value 對
mget:獲取所有(一個或多個)給定 key 的值。
msetnx:同時設置一個或多個 key-value 對,當且僅當所有給定 key 都不存在。這裏寫圖片描述

2.Hash(哈希)
Redis hash 是一個鍵值對集合,是一個string類型的field和value的映射表,hash特別適合用於存儲對象,類似Java裏面的Map。hashes存的是字符串和字符串值之間的映射,比如一個用戶要存儲其全名、姓氏、年齡等等,就很適合使用哈希
我們來看一個例子:
3.list(列表)
Redis 列表是簡單的字符串列表,按照插入順序排序。你可以添加一個元素導列表的頭部(左邊)或者尾部(右邊)。
它的底層實際是個鏈表,也就是說對於一個具有上百萬個元素的lists來說,在頭部和尾部插入一個新元素,其時間複雜度是常數級別的,比如用LPUSH在10個元素的lists頭部插入新元素,和在上千萬元素的lists頭部插入新元素的速度應該是相同的
雖然lists有這樣的優勢,但同樣有其弊端,那就是,鏈表型lists的元素定位會比較慢,而數組型lists的元素定位就會快得多。
lists的常用操作包括LPUSH、RPUSH、LRANGE等。我們可以用LPUSH在lists的左側插入一個新元素,用RPUSH在lists的右側插入一個新元素,用LRANGE命令從lists中指定一個範圍來提取元素。我們來看幾個例子:

lists的應用相當廣泛,隨便舉幾個例子
1.我們可以利用lists來實現一個消息隊列,而且可以確保先後順序,不必像MySQL那樣還需要通過ORDER BY來進行排序。
2.利用LRANGE還可以很方便的實現分頁的功能。
3.在博客系統中,每片博文的評論也可以存入一個單獨的list中。

4.Set(集合)
Redis的Set是string類型的無序集合。它是通過HashTable實現實現的。
集合相關的操作也很豐富,如添加新元素、刪除已有元素、取交集、取並集、取差集等。我們來看例子:

對於集合的使用,也有一些常見的方式,比如,QQ有一個社交功能叫做“好友標籤”,大家可以給你的好友貼標籤,比如“大美女”、“土豪”、“歐巴”等等,這時就可以使用redis的集合來實現,把每一個用戶的標籤都存儲在一個集合之中。
5.zset(sorted set:有序集合)
Redis zset 和 set 一樣也是string類型元素的集合,且不允許重複的成員。不同的是每個元素都會關聯一個double類型的分數。redis正是通過分數來爲集合中的成員進行從小到大的排序。zset的成員是唯一的,但分數(score)卻可以重複。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章