Redis 從入門到奪門而出 - 基礎

didiao java發表於2020-11-16

基礎

介紹

首先來看下redis 官網,如果感覺看著吃力,也有國人翻譯的中文版本redis 中文網站。下面來看一下網站對Redis的介紹。

Redis 是一個開源(BSD 許可)的,記憶體中的資料結構儲存系統,它可以用作資料庫、快取和訊息中介軟體。 它支援多種型別的資料結構,如
字串(strings), 雜湊(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets)
與範圍查詢, bitmaps, hyperloglogs 和 地理空間(geospatial) 索引半徑查詢。 Redis 內建了
複製(replication),LUA 指令碼(Lua scripting), LRU 驅動事件(LRU
eviction),事務(transactions) 和不同級別的 磁碟持久化(persistence), 並通過 Redis
哨兵(Sentinel)和自動 分割槽(Cluster)提供高可用性(high availability)。

《2020最新Java基礎精講視訊教程和學習路線!》

如果看了還感覺莫名其妙,沒關係。簡單來說Redis是一種基於鍵值(Key-Value)的高效能記憶體資料庫。它提供了一些有用且方便的資料結構,比如 Value 可以是string、hash、list、set、zset,由於這種結構的存在,我們平時的開發中就可以靈活的應用這些結構優化我們的技術實現。同時,Redis還提供了鍵過期,釋出訂閱,事務,流水線等其它附加功能。如果看到這裡你還沒明白,沒關係,接下來我將一點一點揭開它神祕的面紗。讓你真正做到從入門到奪門而出。

特性

如果有人問你,你用過Redis,那它有什麼特性呢,下面的答案請務必記住(當然了,記性不好的譬如我記住幾條關鍵的也可)。來看一下答案:

  1. 速度快,讀寫效能 10W/s,當然了和機器配置也有關係
  2. 為什麼快呢?記憶體操作,C語言實現,離作業系統API更近;單執行緒架構(務必不要記錯),避免了多執行緒競爭帶來的損耗。IO多路複用,協議簡單。
  3. 支援持久化,雖然是互動時是記憶體操作,但提供資料落盤機制,防止斷電產生的資料丟失問題。 支援主從複製:多副本 Master-Slave
    節點
  4. 支援高可用 HA:哨兵(sentinel)機制實現高可用,保證節點故障自動發現和故障轉移
  5. 支援多客戶端語言:Java、Python、C++等

使用場景

那什麼時候可以考慮使用呢?什麼時候可以用而不是故意炫技呢?來看一下目前常見的使用情況:

  • 快取:資料庫之前加快取,降低資料庫讀寫壓力
  • 排行榜:按照熱度排名、按照發布時間排名
  • 計數器:播放數、瀏覽數
  • 社交網路:贊、踩、粉絲、下拉重新整理
  • 訊息佇列:釋出訂閱

安裝

Redis支援Windows和Linux,如果只是自己玩玩,可以直接使用Windows版本,非常的簡單和快速就能啟動。這裡就不給出Windows環境下的安裝包了,網上一搜到處都是。下面主要說明下Linux環境下的安裝與基本配置(當然了,只是以啟動服務客戶端可以連線為目的的簡單配置)
以centos7舉例:

依賴檢查

 yum install cpp -y 
yum install binutils -y 
yum install glibc-kernheaders -y 
yum install glibc-common -y 
yum install glibc-devel -y 
yum install gcc -y yum 
install make -y

下載編譯安裝包.
下載編譯安裝包

 cd /usr/local 
 mkdir soft 
 d soft 
 wget http://download.redis.io/releases/redis-4.0.6.tar.gz 
 tar xzf redis-4.0.6.tar.gz 
 cd redis-4.0.6 
 make mkdir /usr/local/redis 
 cp redis-server /usr/local/redis 
 cp redis-benchmark /usr/local/redis 
 cp redis-check-rdb /usr/local/redis 
 cp redis-sentinel /usr/local/redis 
 cp redis-cli /usr/local/redis 
 cp redis.conf /usr/local/redis

一般需要設定密碼,注意修改redis.conf檔案 修改 requirepass 123456789 ,並且修改bind 127.0.0.1為本機的外網 IP,否則無法通過遠端機器連線。
啟動:
./redis-server redis.conf &
使用客戶端連線:
./redis-cli -h 192.168.9.100 -p 6379 -a 123456789

在這裡插入圖片描述
版本選擇

版本號第二位偶數為穩定版本。

這裡也來介紹下 Redis 常見的資料結構,方便大家使用。

刪庫跑路操作flushall,清空所有值。

常用操作

# 設定 key 為 name,value 為 pleuvoir 的字串,並且10秒後過期
set name pleuvoir ex 10
# 檢視 key = name 的過期時間
ttl name
# 檢視 key = name 的值
get name
# set nx 如果沒有則設定,否則不操作(分散式鎖常用)
setnx name pleuvoir

批量設值,減少 IO,原子性

mset country china city bj
mget country city

自增/減操作

# 第一次沒有值會為
1incr age
#獲得的值為1
get age
# 減操作,一直減的話是可以變為負數的
# decr age
# 按照指定的區間,每次加10
incrby age 10
# 按照浮點型,incr 只能針對整型
incrfloat score 1.1

雜湊操作

#設定
hmset user:1 name pleuvoir age 18
#獲取
hgetall user:1

列表(List)
簡單來說就是一個 key 對應的值是多個有序的字串。對應到Java中如下:

List<String> users = new ArrayList();
users.add("pleuvoir");
users.add("realtrump");
users.add("jack");

當然,它的操作還是比較多的,為了方便理解,我畫了個圖。
在這裡插入圖片描述
因為有序,所以按照下標獲取自然是支援的。請注意:一個列表最多可以儲存2^32-1個元素。下面演示下列表命令。

# 從右向左插入 返回3
rpush users pleuvoir realtrump jack
# 查詢所有元素
lrange users 0 -1
# 返回當前列表長度
llen users
# 彈出最左邊元素
lpop users

集合(Set)
儲存多元素,不允許有重複值,並且無序。只能儲存2^32-1個元素。除此之外,可以求交集、並集、差集。可以利用此特性完成一些應用上的需求。使用方式如下:

# 插入
sadd language chinese english
# 若再次插入則忽略重複
sadd language chinese english
# 檢視全部(結果無序
smembers language
# 刪除某個元素
srem language chinese
# 檢視當前元素個數
scard language

另外,由於可以計算交集的特性,在實際的應用中比如可以得到兩個人相同的愛好。

# 小明喜歡的顏色
sadd color:xiaoming red blue green
# 小紅喜歡的顏色
sadd color:xiaohong red blue
# 計算他們共同喜歡的顏色
sinter color:xiaoming color:xiaohong

有序集合(Zset)
常用做排行榜。具體和集合的區別是,每個元素多了一個打分。這樣可以按照評分來進行排序。

以下組資料進行舉例,看看是如何通過命令完成操作的,我們暫且認為這是點贊排行榜,key 為good_ranks
在這裡插入圖片描述

# 初始化點贊資料
zadd good_ranks 20 xiaoming 300 xiaohong 1 xiaowang 
# 檢視分數與成員
zrange good_ranks 0 -1 withscores

在這裡插入圖片描述
可以看出,預設分數是從小到達排序的。

# 返回xiaoming的名次,正向排序。返回1 下標從0開始,是第二名
zrank good_ranks xiaoming
# 返回xiaowang的名次,反向排序。他排在最上面,反向則返回2
zrevrank good_ranks xiaowang

這裡只是簡單的列舉了幾種場景,下面舉個實際的例子在應用中如何儲存物件資訊。

場景舉例
假設我們的需求是儲存使用者資訊,那麼該選取何種資料結構,並且它們有什麼優缺點?

現在有一個物件:

User user = new user();
user.setName("pleuvoir");
user.setAge(18);

使用雜湊結構

hmset user:1 name pleuvoir age 18

優點:簡單直接,每個 key 對應一個 value。缺點:雜湊結構佔用記憶體大,並且最大儲存512M。

使用序列化
這裡有兩種情況,一種是使用字串形式,另外一種是使用序列化工具如ProtoBuf以二進位制的形式儲存。

字串形式:

set user {"name":"pleuvoir","age":18}

二進位制形式就不做展示了,若使用合理可以節約記憶體,但是如果使用一些圖形化工具檢視,可能看的不是很清楚。

這兩種序列化的方式共同的缺點是:修改一個屬性,修改反序列化整個物件,設定完值以後再序列化儲存到Redis這個成本還是比較大的。優點是:程式設計簡單。

全域性命令

# 檢視所有Key,線上謹慎操作
keys * 

# 檢查是否存在
exists [key]

# 設定過期時間
expire [key] [seconds]

# 檢視過期時間
ttl [key]

# 檢視鍵的資料型別
type [key]

相關文章