Redis資料庫

NoSQL

1、概念

not only sql

其指的是非關係型資料庫,是對不同於傳統的關係型資料庫的資料庫管理的統稱,NoSQL是web2.0時代海量數據的產物

2、特點

不支援SQL語法

  • NoSQL的世界中沒有一種通用的語法,每種NoSQL資料庫都有自己的語法,以及擅長的業務場景

讀寫性能高

  • NoSQL資料庫存儲在於記憶體當中,都具有非常高的讀寫性能,尤其在海量數據下,它的表現非常優秀

靈活的數據模型

  • NoSQL的存儲方式十分靈活,存儲方式可以是JSON文檔、鍵值對或者其他方式

Redis

Redis,以字典結構存儲數據,並允許其他應用通過TCP協議讀寫字典中的內容。使用C語言編寫,並以記憶體作為數據存儲介質,所以讀寫效率極高

1、特點

  1. Redis支援數據持久化存儲,可以將記憶體中的數據保存在磁碟中,重啟的時候可以再次載入使用
  2. Redis不僅僅支援簡單的key-vlue類型的數據,同時把value分為list、set、zset、hash等數據結構
  3. 因為Redis交換數據塊,所以在伺服器中常用來存儲一些需要頻繁調取的數據,提高效率

2、啟動和關閉

查看Redis服務

redis-server

關閉Redis服務

redis-cli SHUTDOWN

這樣關閉可以保存數據,強行停止會丟失數據

命令行客戶端

  • 將命令作為redis-cli的參數執行

    • redis-cli -h 127.0.0.1 -p 6379
      
    • redis-cli PING
      

      -p 後面輸入的是埠號

      ping的作用的是檢查資料庫是否連接成功

  • 進入交互模式

    • redis-cli 
      

多資料庫

Redis默認支援16個資料庫,從0開始的遞增數字命名

SELECT 1

SELECT來選擇要存儲的資料庫

3、基礎命令

設置鍵和值

通過SET key value 來設置一個新的鍵值對

SET bar 1
MSET bar1 a bar2 b  # 同時設置多個

獲取符合規則的鍵名和列表

通過GET key來獲取key所對應的value

通過KEYS pattern來獲取數據中擁有的key

KEYS *
GET bar  # 存在返回對應的value值,沒有返回null表示空的意思
MGET bar1 bar2  # 同時獲得多個

其中的pattern可以是?、*、[]、\,用法符合正則的使用

判斷是否存在

EXISTS key如果鍵存在則返回整數類型1,否則返回0

EXISTS bar

對鍵重命名

RENAME key new_key對鍵值重新命名

RENAME bar bar1

設置key過期時間

通過EXPIRE key seconds來設置過期時間,-1表示刪除

SET bar abc
EXPIRE bar 100

TTL可以查看key剩餘的時間,-1表示永久,-2表示不存在

TTL bar

PERSIST讓鍵重新變成永久,成功返回1,否則返回0,表示鍵不存在或者本身就是永久的

PERSIST bar

同過SET key value EX seconds來設置過期時間

SET bar 123 EX 1000  # 也可以在設置key就順便設置時間

或者SETEX key seconds value來設置時間

SETEX bar 100 nihao

獲取鍵值的數據類型

使用TYPE key獲取鍵值的數據類型,Redis中有五種數據類型,因此返回也會有這五種數據類型

SET fool 1
TYPE fool

刪除鍵

DEL key[key1···]可以刪除一個或多個鍵,返回值是刪除鍵的個數

DEL bar
  • DEL命令的參數不支援通配符,但我們可以結合Linux的管道和xargs命令自己實現

比如我們要刪除以user開頭的鍵,就惡意執行

redis-cli KEYS 'user*' | xargs redis-cli DEL
  • 另外由於DEL命令支援多個鍵作為參數,所以還可以執行
redis-cli DEL redis-cli KEYS "user*"

這樣同樣的效果,但是性能更好

清空所有數據

Redis資料庫之間並不是完全隔離的,比如FLUSHALL命令可以清空一個Redis示例中所有資料庫中的數據

4、數據類型

字元串

字元串是Redis的基本數據類型,使用SET生成的鍵值對,其value就是字元串類型。字元串類型可以存儲任何形式的字元串

SET num 1
APPEND num2  # 添加字元——字元串的拼接
# 如果value值是數字,還可以進行加減
INCR num  # 加一
DECP num  # 減一
# + 整數
INCRBY num 10
# - 整數
DECRBY num 5

列表

添加元素

LPUSH 左邊添加(棧 先進後出)

LPUSH myli 3 4 5  

RPUSH 右邊添加(隊列 先進後出)

RPUSH myli 2 1

獲取列表的長度

LLEN myli

查看指定位置的元素

LINDEX myli 3

獲取列表片段

LRANGE myli 0 5
LRANGE myli 0 -1

-1表示最後一個

該切片是左閉右閉

彈出元素

LPOP myli  # 從左邊彈出元素
RPOP muli  # 從右邊彈出元素

多個刪除

LREM key count value

LREM myli 2 1  # 當count>0時LREM命令會從列表左邊開始刪除前count個值為value的元素
LREM myli -1 2 # 當count<0時LREM命令會從列表右邊開始刪除前|count|個值為value的元素
LREM myli 0 4  # 當count=0是LREM命令會刪除所有值為value的元素

hash類型

我們現在已經知道Redis是採用字典結構以鍵值對的形式存儲數據的,而散列類型(hash)的鍵值也是一種字典結構,其存儲了欄位(field)和欄位值的映射,但欄位值只能是字元串,不支援其他數據類型,換句話說,散列類型不能嵌套其他的數據類型。一個散列類型鍵可以包含至多232−1個欄位

設置和獲取

設置

HSET key field value

HSET bd name budong
HSET bd age 18

獲取

HGET key field

HGET bd name

設置多個

HMSET key field value [field value … ]

HMSET ks name kongshan age 18

HMGET key field [ field … ] # 獲取多個

HMGET ks name age  # 獲取多個
HKEYS bd  # 獲取所有keys
HVALS bd  # 獲取所有value

HGETALL key

HGETALL bd  # 獲取所有key和value,獲取所有鍵值對
HLEN bd  # 獲取filed 個數

判斷欄位是否存在

HEXISTS key field

HEXISTS bd size  # 存在返回1 不存在返回0
HSETNX bd size 180 # 不存在是添加,存在什麼也不做

增加數字

HINCRBY key field increment
HINCRBY bd age 2  # 年齡增加2歲

刪除欄位

HDEL key field [field…] # 刪除一個/多個欄位

HDEL bd size

集合

查找和刪除元素

增加元素

SADD key member [member …]

SADD se1 1 2 3 a b
SADD se2 a b c 1 2

刪除元素

SREM key member [member …]

SREM se1 2 # 刪除指定元素

隨機刪除count個元素

SPOP key [cout]

SPOP se2 2 # 隨機刪除2個元素

判斷元素是否存在

SISMEMBER se1 1

獲取所有元素

SMEMBERS key

SMEMBERS se1

獲取集合元素個數

SCARD key

SCARD se1

隨機獲取count 個數元素 count 為正數,返回count個不重複數,為負數可能出現重複數據

SRANDMEMBER key [count]

SRANDMEMBER se2 3

交集

SINTER key1 key2 ..

SINTER se1 se2  # 求se1 和 se2 交集

SINTERSTORE destination key1 key2 ..

SINTERSTORE se3 se1 se2 # 將交集保存到 se3中

並集

SUNION key1 key2

SUNION se1 se2

SUNIONSTORE destination key1 key2

SUNIONSTORE se4 se1 se2 # 將並集保存到se4

差集

set1有而set2沒有的元素

SDIFF key1 key2

SDIFF se1 se2

SDIFFSTORE destination key1 key2

SDIFFSTORE se5 se1 se2 # 將差集保存到se5

有序集合

​ 在集合類型的基礎上有序集合類型為集合中的每個元素都關聯了一個分數,這使得我們不僅可以完成插入、刪除和判斷元素是否存在等集合類型支援的操作,還能夠獲得分數最高(或最低)的前N個元素、獲得指定分數範圍內的元素等與分數有關的操作。雖然集合中每個元素都是不同的,但是它們的分數卻可以相同

特點和差別

  1. 列表類型是通過鏈表實現的,獲取靠近兩端的數據速度極快,而當元素增多後,訪問中間數據的速度會較慢,所以它更加適合實現如「新鮮事」或「日誌」這樣很少訪問中間元素的應用

  2. 有序集合類型是使用散列表和跳躍表(Skiplist)實現的,所以即使讀取位於中間部分的數據速度也很快(時間複雜度是O(log(N)))

  3. 列表中不能簡單地調整某個元素的位置,但是有序集合可以(通過更改這個元素的分數)

  4. 有序集合要比列表類型更耗費記憶體。有序集合類型算得上是Redis的5種數據類型中最高級的類型了,在學習時可以與列表類型和集合類型對照理解

添加、獲取和刪除元素

ZADD key score member [score member … ]

ZADD math 90 bd 86 ks 88 yf

ZADD 還可以用雙精度浮點數,+inf 表示正無窮 -inf 表示負無窮

查看元素個數

ZCARD key

ZCARD math # 查看元素個數

獲取元素分數

ZSCORE key member

ZSCORE math bd

從小到大列印 加上WITHSCORES 同時列印分數

ZRANGE key start stop [WITHSCORES]

ZRANGE math 0 -1

ZREVRANGE key start stop [WITHSCORES] # 從大到小列印

ZREVRANGE math 0 -1

移除元素

ZREM key member

ZREM math yf

獲取指定分數範圍的元素

ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

ZRANGEBYSCORE math 70 90
ZRANGEBYSCORE math 70 (90 LIMIT 1 2 # 不取90,同時指定1到2位置查找

按照元素分數從小到大的順序返回分數在min和max之間(包含min和max) LIMIT 向後偏移offset個元素,並且只獲取前count個元素

獲取指定分數範圍的元素個數

ZCOUNT key min max

ZCOUNT math 70 90

增加某個元素的分數

ZINCRBY key increment member

ZINCRBY math 5 bd # 增加5分 分數也可以是負數,表示減分

按照排名範圍刪除元素

ZREMRANGEBYRANK key start stop

ZADD test 1 a 2 b 3 c 4 d 5 e 6 f
ZREMRANGEBYRANK test 0 2 # 刪除排名1到3 的元素
ZRANGE test 0 -1

按照分數範圍刪除元素

ZREMRANGEBYSCORE key min max

ZADD test 1 a 2 b 3 c 4 d 5 e 6 f
ZREMRANGEBYSCORE test (3 5  # 刪除分數大於3小於5的元素

計算有序集合的交集

ZINTERSTORE destination numkeys key [key…][WEIGHTS weight[weight…]] [AGGREGATE SUM|MIN

計算多個有序集合的交集並將結果存儲在destination鍵中(同樣以有序集合類型存儲),返回值為destination鍵中的元素個數。destination鍵中元素的分數是由AGGREGATE參數決定的,默認是SUM

ZADD s2 10 a 20 b
ZINTERSTORE s3 2 s1 s2  # 2 是指有幾個集合交集的意思

同樣也有並集 ZUNIONSTORE 用法類似,就不在再贅述