Redis數據庫介紹(1)

1、 Redis概述

什麼是Nosql:Nosql叫做非關係型數據庫,爲了解決高併發、高可用、高可擴展,大數據存儲等一系列問題而產生的數據庫解決方案。

Redis是使用ANSI C語言開發的一個高性能Key-Value數據庫,是當今速度最快的內存型非關係型(NoSQL)數據庫,可以存儲鍵和五種不同類型的值之間的映射。鍵的類型只能爲字符串,值支持五種數據類型:字符串、列表、集合、散列表、有序集合。

Redis 支持很多特性,例如將內存中的數據持久化到硬盤中,使用複製來擴展讀性能,使用分片來擴展寫性能。

2、Redis數據類型

  • 2.1、 String 字符類型

String數據結構是簡單的Key-value類型,value可以是String也可以是數字。

常用命令
get:獲取key對應的vlaue
set:爲一個key設置value,可配合ex/px參數設置key的有效期
getset:爲一個Key設置value,並返回該key的原value
mget:獲取多個key對應的value
mset:爲多個key設置value
incr/incrby:將key對應的value自增1(或者指定的整型數值),並返回自增後的值。
decr/decrby:同上,自減。

應用場景:String是最常用的一種數據類型,普通的key/value存儲都可以化爲此類,即可以完全實現目前Memcached的功能,並且效率更高。還具有Redis的持久化,操作日誌以及Replication等功能。除了和Memcached一樣有get set incr decr等操作外,Redis還具有如下操作:

  • 獲取字符串長度
  • 對字符串append內容
  • 設置和獲取字符串的某一段內容
  • 設置和獲取字符串的某一位bit
  • 批量設置一系列字符串的內容

使用場景:常規key-value緩存應用。常規計數:微博數、粉絲數。

實現方式:String在redis內部存儲默認就是一個字符串,被redisObject所引用,當遇到incr ,decr等操作時會轉成數值型進行計算,此時redisObject的encoding字段爲int

  • 2.2、Hash 散列類型

key-value ,單點登錄時採用這種數據結構存儲用戶信息,key爲cookieId,value存放結構化對象。

常用命令
hset:將Key對應的hash中的field設置爲value。如果該hash不存在,會自動創建一個。
hget:返回指定hash中field字段的值。
hmset/hmget:同hset和hget,可以批量操作同一個key下的多個field。
hgetall:謹慎使用,爲完整遍歷,耗時!—以數組形式返回哈希表中,所有的字段和值。緊跟每個字段名(field name)之後是字段的值 (value),所以返 回值的長度是哈希表大小的兩倍。

應用場景:比如我們要存儲一個用戶信息對象數據,包含以下信息:

用戶ID爲查找的key,存儲的value用戶對象包含姓名、年齡、生日等信息,如果用普通的key/value結構來存儲,主要有兩種方式:
在這裏插入圖片描述
方法一缺點是增加了序列化和反序列化的開銷,並且在需要修改其中一項信息時,需要把整個對象取回,並且修改操作需要對併發進行保護,引入CAS等複雜問題。
在這裏插入圖片描述
方法二是將用戶ID+對應屬性整體作爲唯一表示來取得對應屬性的值,雖然省去序列化等操作,但是ID爲重複存儲,浪費內存。因此,引出Redis的Hash。
在這裏插入圖片描述
Redis的Hash實際是內部存儲的value是一個hashmap,並提供了直接存取這個map成員的接口。
key爲用戶ID,value是一個map,這個Map的key是成員的屬性名,value是其屬性值,這樣一來,對數據的修改可直接通過內部map的key(redis稱內部map的key爲field),即通過key(用戶ID)+field(屬性標籤)就可以操作對應屬性數據了,既不需要重複存儲數據,也不會帶來徐淚花和併發修改問題。

使用場景:存儲部分變更數據,如用戶信息。

實現方式:Redis的Hash數據類型對應的Value內部實際就是一個HashMap,有兩種不同實現:
當hash成員比較少時,Redis爲了節省內存會採用類似一維數組的方式來緊湊存儲,而不會採用真正的HashMap結構,此時對應的value redisObject的encoding爲zipmap。
當成員數量增大時,會自動轉成真正的HashMap,此時的encoding爲ht。

  • 2.3、List 列表類型

簡單的消息隊列;

  • 2.4、 Set 集合類型

集合不重複性,可做全局去重;
爲什麼不用JVM自帶的Set進行去重: 一般我們的系統都是集羣部署,那麼使用JVM自帶的set比較麻煩,需要再起一個公共服務。

  • 2.5、 Sorted set 有序集合類型

sorted set 多了一個權重參數score,集合中的元素可按照score排列。可做排行榜或者取TOPN等操作。

3、Redis應用場景

Redis是一個高性能的緩存,一般應用在以下幾個場景:

  • 緩存(數據查詢、短連接、新聞內容、商品內容等)
  • 分佈式集羣架構中的session分離
  • 任務隊列(秒殺、搶購、12306)
  • 排行榜
  • 計數器
  • 最新最熱文章、最近最熱評論
  • 發佈訂閱
  • 數據過期處理
  • 網站訪問統計

以上,Redis適用於數據實時性要求高、數據存儲有過期和淘汰特徵的、不需要持久化或者只需要保持一致性、邏輯簡單的場景。

4、Redis相對MySQL關係型數據庫優缺點

Redis主要用來做緩存,它有持久化,但也只是爲了緩存的可靠性。
Redis是一種內存數據庫,最大優點在於數據全放在內存,速度快,效率高。尤其是在某些特定場合,比如熱點數據量非常大,而數據在內存和磁盤之間切換代價比較高的場景下,適合應用Redis。但缺點是數據不能超過內存大小。

傳統關係型數據庫在於它對數據的一致性保障,它的數據模型範式是遵循嚴格事物規則的結構化數據,由於其數據的高度抽象化,它調度到內存的數據一般場合下不會佔用很大的內存空間。

Redis和MySQL各自有不同的業務場景,誰都無法取代誰。

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