Redis 從入門到奪門而出 - 基礎
基礎
介紹
首先來看下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還提供了鍵過期,釋出訂閱,事務,流水線等其它附加功能。如果看到這裡你還沒明白,沒關係,接下來我將一點一點揭開它神祕的面紗。讓你真正做到從入門到奪門而出。
特性
如果有人問你,你用過Redis,那它有什麼特性呢,下面的答案請務必記住(當然了,記性不好的譬如我記住幾條關鍵的也可)。來看一下答案:
- 速度快,讀寫效能 10W/s,當然了和機器配置也有關係
- 為什麼快呢?記憶體操作,C語言實現,離作業系統API更近;單執行緒架構(務必不要記錯),避免了多執行緒競爭帶來的損耗。IO多路複用,協議簡單。
- 支援持久化,雖然是互動時是記憶體操作,但提供資料落盤機制,防止斷電產生的資料丟失問題。 支援主從複製:多副本 Master-Slave
節點 - 支援高可用 HA:哨兵(sentinel)機制實現高可用,保證節點故障自動發現和故障轉移
- 支援多客戶端語言: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]
相關文章
- Redis入門基礎Redis
- redis從入門到精通Redis
- Redis從入門到進階Redis
- Redis從入門到實踐Redis
- Redis 從入門到實戰Redis
- 【零基礎】PostgreSQL從入門到精通SQL
- Redis從入門到高可用,分散式實踐(1)- 基礎介紹Redis分散式
- LSTM入門必讀:從入門基礎到工作方式詳解
- vue+webpack 從入門到精通(基礎篇)VueWeb
- RxJava從放棄到入門(一):基礎篇RxJava
- 資料分析 | 零基礎入門資料分析(一):從入門到摔門?
- Redis從入門到精通:初級篇Redis
- Redis從入門到精通:中級篇Redis
- scala 從入門到入門+
- makefile從入門到入門
- vim從入門到棄坑:基礎指令的歸類
- Redis從入門到放棄系列(十) ClusterRedis
- python萌新:從零基礎入門到放棄Python
- 零基礎入門前端,從小白到大神進階前端
- LLM 鏈式架構基礎:從入門到實踐架構
- kafka從入門到關門Kafka
- Service Worker 從入門到出門
- MyBatis從入門到精通(一):MyBatis入門MyBatis
- Redis7.0最新系列教程-基礎入門Redis
- Nginx入門到實戰(1)基礎篇Nginx
- RabbitMQ基礎入門MQ
- mongodb基礎入門MongoDB
- MySQL 基礎入門MySql
- ZooKeeper 基礎入門
- Elasticsearch 基礎入門Elasticsearch
- Vim 入門:基礎
- Bootstrap基礎入門boot
- Html基礎入門HTML
- ElasticSearch基礎入門Elasticsearch
- HTML 基礎入門HTML
- Dart 基礎入門Dart
- SQL入門基礎SQL
- Nginx 基礎入門Nginx