1. 程式人生 > >redis學習1:初識redis

redis學習1:初識redis

redis

Redis是一個開源的使用ANSI C語言編寫、支援網路、可基於記憶體亦可持久化的日誌型、Key-Value資料庫,並提供多種語言的API。簡而言之redis就是放在遠端網路上的一個key-value資料結構。

優點

  • redis豐富的資料結構——更加方便操作
  • redis的資料都是在記憶體操作——更加快速操作
  • 單執行緒處理——避免了鎖
  • 非阻塞式IO多路複用——充分利用網路IO
  • 設計簡單,效率快
  • 方便擴充套件,不需要像mysql一樣分庫分表,只需要簡單擴大記憶體,或者增加redis的個數

缺點

  • Rdb備份不具備實時性
  • Aof持久化比較消耗記憶體和cpu,甚至當aof檔案過大的時候佔用磁碟

應用場景

  • 快取系統
  • 排行版
  • 計數器
  • 社交網路
  • 訊息佇列系統
  • 實時系統
  • ...

資料型別

結構型別 結構儲存的值 結構的讀寫能力
STRING 可以是字串、整數或者浮點數 對整個字串或者字串的其中一部分執行操作
對整數和浮點數執行自增或自減操作
LIST 一個連結串列,連結串列上的每個節點都包含了一個字串 從兩端壓入或者彈出元素 
對單個或者多個元素
進行修剪,只保留一個範圍內的元素
SET 包含字串的無序收集器(unordered collection),並且被包含的每個字串都是獨一無二、各不相同的 新增、獲取、移除單個元素
檢查一個元素是否存在於集合中
計算交集、並集、差集
從集合裡面隨機獲取元素
HAST 包含鍵值對的無序散列表 新增、獲取、移除單個鍵值對
獲取所有鍵值對
檢查某個鍵是否存在
ZSET 字串成員(member)與浮點數分值(score)之間的有序對映,元素的排列順序由分值的大小決定 新增、獲取、刪除元素
根據分值範圍或者成員來獲取元素
計算一個鍵的排名

 

STRING

設定語法

set key value [EX seconds] [PX ms] [nx|xx]
  • key: 鍵名
  • value: 鍵值
  • ex seconds: 鍵秒級過期時間
  • ex ms: 鍵毫秒及過期時間
  • nx: 鍵不存在才能設定,setnx和nx選項作用一樣,用於新增,分散式鎖的實現
  • xx: 鍵存在才能設定,setxx和xx選項作用一樣,用於更新

常用命令

> set hello world
OK
> get hello
"world"
> del hello
(integer) 1
> get hello
(nil)

書中提到一個有趣的概念,批量操作mget可以提供效率節省時間

逐條 get/se t的時間消耗公式:

n次get/set時間 = n次網路時間 + n次命令時間

批量get/set的時間消耗公式: n次get/set時間 = 1次網路時間 + n次命令時間

合理的使用批量操作可以提高Redis效能,但是注意不要量太大,如果過量的話可能會導致Redis阻塞

時間複雜度

  • set: O(1)
  • get: O(1)
  • del: O(k),k為鍵的個數
  • mget: O(k),k為鍵的個數
  • mset: O(k),k為鍵的個數
  • append: O(1)
  • str: O(1)
  • getrange: O(n), n為字串的長度

內部編碼

  • int: 8位元組長整型
  • embstr: 小於39位元組值
  • raw: 大於39位元組的值

典型場景

  • 快取
  • 計算器
  • 分散式鎖

場景

  • 快取
  • 計算器
  • 分散式鎖

LIST

> rpush list-key item
(integer) 1
> rpush list-key item2
(integer) 2
> rpush list-key item
(integer) 3
> lrange list-key 0 -1
1) "item"
2) "item2"
3) "item"
> lindex list-key 1
"item2"
> lpop list-key
"item"
> lrange list-key 0 -1
1) "item2"
2) "item"

SET

 

 
 
​​​​​​​> sadd set-key item
(integer) 1
> sadd set-key item2
(integer) 1
> sadd set-key item3
(integer) 1
> sadd set-key item
(integer) 0
> smembers set-key
1) "item"
2) "item2"
3) "item3"
> sismember set-key item4
(integer) 0
> sismember set-key item
(integer) 1
> srem set-key item2
(integer) 1
> srem set-key item2
(integer) 0
> smembers set-key
1) "item"
2) "item3"

HASH

建立雜湊型別的鍵值

127.0.0.1:6379> hset user name LotusChing 
(integer) 1
127.0.0.1:6379> hset user age 21
(integer) 1
127.0.0.1:6379> hset user gender "Male"
(integer) 1

HSET 不支援建立一次性建立多field

127.0.0.1:6379> hset user name "LotusChing" age 21
(error) ERR wrong number of arguments for 'hset' command

獲取雜湊鍵中的field值

127.0.0.1:6379> hget user name
"LotusChing"
127.0.0.1:6379> hget user age
"21"
127.0.0.1:6379> hget user gender
"Male"

HGET 不支援一次獲取多個field

獲取雜湊鍵中的fields

127.0.0.1:6379> hekys user
1) "name"
2) "age"

獲取雜湊鍵中的所有field的value

127.0.0.1:6379> hvals user
1) "LotusChing"
2) "21"

刪除雜湊鍵中某個field

127.0.0.1:6379> hdel user age
(integer) 1
127.0.0.1:6379> hkeys user
1) "name"

統計雜湊中field的個數

127.0.0.1:6379> hkeys user
1) "name"
2) "age"
3) "gender"
127.0.0.1:6379> hlen user
(integer) 3

批量設定雜湊鍵的field

127.0.0.1:6379> hmset user name "LotusChing" age 21 gender "Male"
OK
127.0.0.1:6379> hkeys user
1) "name"
2) "age"
3) "gender"
127.0.0.1:6379> hvals user
1) "LotusChing"
2) "21"
3) "Male"

批量獲取雜湊鍵中field的value

127.0.0.1:6379> hmget user name age gender
1) "LotusChing"
2) "21"
3) "Male"

判斷雜湊鍵中field是否存在

127.0.0.1:6379> hexists user name
(integer) 1
127.0.0.1:6379> hexists user hobbies
(integer) 0

一次性獲取雜湊鍵中所有的fields和values

注意:儘量避免使用hgetall,因為如果雜湊鍵field過多的話,可能會導致Redis阻塞,建議使用hmget獲取所需雜湊鍵中的field值,或者採用hscan

127.0.0.1:6379> hgetall user
1) "name"
2) "LotusChing"
3) "age"
4) "21"
5) "gender"
6) "Male"

ZSET

> zadd zset-key 728 member1
(integer) 1
> zadd zset-key 982 member0
(integer) 1
> zadd zset-key 982 member0
(integer) 0
> zrange zset-key 0 -1 withscores
1) "member1"
2) "728"
3) "member0"
4) "982"
> zrangebyscore zset-key 0 800 withscores
1) "member1"
2) "728"
> zrem zset-key member1
(integer) 1
> zrem zset-key member1
(integer) 0
> zrange zset-key 0 -1 withscores
1) "member0"
2) "982"

小結

本文主要對redis進行了一個簡單的介紹,從特點,優缺點等方面進行了介紹,同時介紹了下redis中主要的資料型別以及常用的一些操作。本文章主要進行了一些總結性的工作,參考了https://www.cnblogs.com/TsingLo/p/4630157.html這篇部落格以及https://github.com/frank-lam/2019_campus_apply/blob/master/notes/Redis.md這個倉庫