Redis學習筆記(1)

Redis筆記

NoSQL

爲何要使用NoSQL

單個數據庫架構下,數據存儲的瓶頸是什麼?redis

  1. 數據量過大,一個機器放不下
  2. 數據索引過大,一個機器的內存放不下
  3. 讀寫混合狀況下的訪問量一個實例沒法承受

Web數據庫架構的發展sql

  1. 優化數據庫的結構和索引,使用緩存技術緩解數據庫的壓力(Memcached+MySQL+垂直拆分)shell

  2. MySQL主從複製和讀寫分離數據庫

  3. 分庫分表+水平拆分+MySQL集羣緩存

  4. MySQL的擴展性瓶頸:擴展性差、大數據下IO壓力大、表結構更改困難安全

  5. 現在:負載均衡等一系列架構數據結構

爲何使用NoSQL?架構

傳統數據庫難以處理網狀數據或大量無固定結構的數據app

NoSQL的特色

易擴展:數據之間無關係負載均衡

大數據量高性能:NoSQL的Cache是記錄級,MySQL的Cache是QueryCache,粒度不一樣

靈活的數據類型:隨時能夠存儲自定義的數據格式

RDBMS vs NoSQL

RDBMS(Relational Database Management System):

  • ACID
  • 高度組織化結構化數據
  • 結構化查詢語言
  • 數據和關係都存儲在單獨的表中
  • 事務

NoSQL:

  • Not Only SQL
  • 沒有聲明性查詢語言
  • 沒有預約義的模式
  • K-V存儲、列存儲、文檔存儲、圖形數據庫等
  • 最終一致性,而非ACID
  • 非結構化和不可預知的數據
  • CAP定理
  • 高性能、高可用性和可伸縮性

K-V、Cache和Persistence

Redis一個高性能的K-V分佈式內存數據庫

Redis支持數據的持久化,能夠將內存中的數據保存在磁盤中,重啓時能夠再次加載進行使用

Redis不只支持簡單的K-V(string)型數據,還支持list、set、zset、hash等數據結構的存儲

Redis支持數據的備份,即master-slave模式的數據備份

NoSQL經典應用:淘寶網商品的相關數據

  1. 商品基本信息: MySQL/Oracle
  2. 商品描述、詳情、評價信息(多文字類):文檔數據庫MongDB
  3. 商品圖片:分佈式文件系統(淘寶的TFS、Google的GFS、Hadoop的HDFS)
  4. 商品關鍵字:ISearch
  5. 商品的波段性的熱點高頻信息:Tair、Redis、Memcached
  6. 商品的交易、價格計算、積分累計:支付寶和第三方支付接口

難點:數據類型多樣化、數據源多樣化和變化重構、數據源和數據服務的耦合

解決方案:統一數據平臺服務層(UDSL)

NoSQL數據模型

K-V、BSon(Binary Json)、列族、圖形

CAP+BASE

傳統ACID:Atomicity、Consistency、Isolation、Durability

CAP(只能3選2):Consistency(強一致性)、Availability(可用性)、Partition tolerance(分區容錯性)

BASE:Basically Available(基本可用)、Soft state(軟狀態)、Eventually consistent(最終一致)

Redis(Remote Dictionary Server)

特色

  1. 內存存儲和持久化

  2. 取最新n個數據的操做

  3. 設定過時時間

  4. 發佈、訂閱消息系統

  5. 定時器、計數器

5大數據類型

string:二進制安全,能夠存儲jpg圖片或序列化對象。一個redis字符串value最大能夠是512M

hash:一個string類型的field和value的映射表,適合用於存儲對象,相似於Map<String,Object>

list:底層是經過鏈表實現的。能夠添加元素至頭部或尾部

set:集合,底層基於hashtable

zset:sorted set,每一個元素都會關聯一個double類型的分數,經過分數來進行排序

經常使用命令

key:keys * exsits [key] move [key] [db] expire [key] [seconds] ttl [key] type [key] del[key]

string:set/get/del/append/strlen incr/decr/incrby/decrby(僅對數字有效) getrange/setrange setex(set with expire) setnx(set if not exist) mset/mget/msetnx get/set

list:lpush/rpush/lrange(l/r表明left/right) lpop/rpop lindex llen lrem ltrim rpoplpush lset linsert...before/after

set:sadd/smembers/sismember scard srem srandmember spop smove sdiff sinter sunion

hash:hset/hget/hmset/hmget/hgetakk/hdel hlen hexists hkeys/hvals hincrby/hincrbyfloat hsetnx

zset:zadd zrange/zrevrange(withscores) zrangebyscore/zrevrangebyscore(使用'('表示開區間,使用limit對結果進行截取) zrem zcard/zcount zrank zscore zrevrank

Redis的配置文件:redis.conf

GENERAL(通用):

  1. daemonize(是否後臺運行)、pidfile(pid寫入的文件路徑)

On Windows, daemonize and pidfile are not supported.

  1. port:6379
  2. tcp-backlog:511(bachlog是一個隊列,等於tcp未完成三次握手隊列+已完成三次握手隊列)
  3. bind:(綁定的主機地址)
  4. timeout:0(超時將關閉client鏈接,0表明不關閉)
  5. tcp-keepalive:0(進行keepalive檢測的時間,0表明不關閉,建議設置爲60)
  6. loglevel:notice(警報級別,可取debug、verbose、notice、warning)
  7. databases:16(數據庫數量)

SECURITY(安全):Redis認證默認關閉

開啓認證:

config set requirepass "[password]"

而後操做前使用下列語句進行權限認證:

auth [password]

LIMITS(限制)

maxclients:10000(最大鏈接數)

maxmemory:(最大內存,到達最大內存後沒法進行寫入操做,但能夠繼續讀取)

maxmemory-policy:noeviction(過時策略,可選項以下)

volatile-lru -> remove the key with an expire set using an LRU algorithm
allkeys-lru -> remove any key according to the LRU algorithm
volatile-random -> remove a random key with an expire set
allkeys-random -> remove a random key, any key
volatile-ttl -> remove the key with the nearest expire time (minor TTL)
noeviction -> don't expire at all, just return an error on write operations

maxmemory-sample:5(樣本數量,越高可使LRU或TTL越精確,但會增長CPU功耗)

待續~

相關文章
相關標籤/搜索