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這個倉庫