Redis 從入門到精通(基礎)

1、前言

你們好,我是深度Linux,本系列專欄是對 Redis 的入門以及進階使用,但願對你們有所幫助。
在這裏插入圖片描述redis

2、基礎

(1)介紹數據庫

首先來看下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)。若是看了還感受莫名其妙,不要緊。簡單來講Redis是一種基於鍵值(Key-Value)的高性能內存數據庫。它提供了一些有用且方便的數據結構,好比Value能夠string、hash、list、set、zset,因爲這種結構的存在,咱們平時的開發中就能夠靈活的應用這些結構優化咱們的技術實現。同時Redis還提供了鍵過時,發佈訂閱,事務,流水線等其它附加功能。若是看到這裏你還沒明白,不要緊,接下來我將一點一點揭開它神祕的面紗。讓你真正作到從入門到奪門而出。

(2)特性
若是有人問你,你用過Redis,那它有什麼特性呢,下面的答案請務必記住(固然了,記性很差的譬如我記住幾條關鍵的也可)。來看一下答案:centos

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

(3)使用場景
那何時能夠考慮使用呢?何時能夠用而不是故意炫技呢?來看一下目前常見的使用狀況:緩存

  • 緩存:數據庫以前加緩存,下降數據庫讀寫壓力
  • 排行榜:按照熱度排名、按照發布時間排名
  • 計數器:播放數、瀏覽數
  • 社交網絡:贊、踩、粉絲、下拉刷新
  • 消息隊列:發佈訂閱

(4)安裝
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
 cd 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
在這裏插入圖片描述
在這裏插入圖片描述多線程

3、數據結構

這裏也來介紹下 Redis 常見的數據結構,方便你們使用。架構

刪庫跑路操做flushall,清空全部值。分佈式

(1)經常使用操做

# 設置 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
#得到的值爲
1get age
# 減操做,一直減的話是能夠變爲負數的
# decr age
# 按照指定的區間,每次加10
incrby age 10
# 按照浮點型,incr 只能針對整型
incrfloat score 1.1

哈希操做

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

在這裏插入圖片描述

學習資料視頻免費領取,免費學習看這裏

4、列表(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

5、集合(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

6、有序集合(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

這裏只是簡單的列舉了幾種場景,下面舉個實際的例子在應用中如何保存對象信息。

7、場景舉例
假設咱們的需求是保存用戶信息,那麼該選取何種數據結構,而且它們有什麼優缺點?

如今有一個對象:

User user = new user();
user.setName("pleuvoir");
user.setAge(18);
使用哈希結構
hmset user:1 name pleuvoir age 18

優勢:簡單直接,每一個 key 對應一個 value。缺點:哈希結構佔用內存大,而且最大保存512M。
2.使用序列化

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

字符串形式:

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

二進制形式就不作展現了,若使用合理能夠節約內存,可是若是使用一些圖形化工具查看,可能看的不是很清楚。

這兩種序列化的方式共同的缺點是:修改一個屬性,修改反序列化整個對象,設置完值之後再序列化保存到Redis這個成本仍是比較大的。優勢是:編程簡單。

9、全局命令

# 查看全部Key,線上謹慎操做
keys * 
# 檢查是否存在
exists [key]
# 設置過時時間
expire [key] [seconds]
# 查看過時時間
ttl [key]
# 查看鍵的數據類型
type [key]

10、參考連接

Redis 命令參考

相關文章
相關標籤/搜索