Redis
Redis是一個開源(BSD許可高性能的記憶體存盤的key-value資料庫! 可用作資料庫,高速快取和訊息佇列代理,它支持字串、哈希表、串列(List)、集合(Set)、有序集合(Ordered Sets),位圖(bitmap),hyperloglogs,GEO等資料型別,內置復制、Lua腳本、LRU識訓、事務以及不同級別磁盤持久化功能,同時通過Redis Sentinel提供高可用,通過Redis Cluster提供自動磁區,
優點
- 高性能: Redis能讀的速度是110000次/s,寫的速度是81000次/s ,
- 豐富的資料型別:Redis支持二進制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 資料型別操作,
- 原子性: Redis的所有操作都是原子性的,同時Redis還支持對幾個操作合并后的原子性執行,
- Redis還支持 publish/subscribe, 通知, key過期等等特性, --這塊得功能用的少
- 可以持久化 , 資料淘汰 , 資料的過期時間 -- 可以用作一個資料庫,資料比較安全
- 分布式: 高并發 高可靠 擴展
適用的場景
- 用來做快取(ehcache/memcached)——redis的所有資料是放在記憶體中的(記憶體資料庫)
- 可以在某些特定應用場景下替代傳統資料庫解決一些特定需求
- 社交類的應用(共同好友,使用了某項功能的人數統計)
- session共享、購物車
- 實時排行榜
- 可以用于實作簡單的佇列系統(不常用)
- 可以用于實作簡單的訂閱-發布系統
- 在離線批計算中,可以用redis作為外部字典庫來查詢(map端join)
- 在實時流式計算中,可以用redis作為計算程序中的中間存盤,或者作為實時流式計算的最終結果存盤器
什么是快取?
快取的偽代碼:
import org.apache.commons.lang3.RandomUtils;
import java.sql.*;
import java.util.HashMap;
/**
* 快取得目的就是為了減輕資料庫的壓力
*/
public class _01_快取 {
static HashMap<Integer,String> map = new HashMap<>();
public staticd void main(String[] args) throws Exception {
//獲取mysql的連接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "123456");
for (int i = 0; i < 10000; i++) {
//我這邊再不斷的訪問資料庫
int id = RandomUtils.nextInt(1,10000);
String name = getData(conn, id);
}
}
public static String getData(Connection conn,int id) throws SQLException {
String name = "";
PreparedStatement pps = conn.prepareStatement("select name from user where id = ?");
pps.setInt(1,id);
String mapName = map.get(id);
if (mapName == null){
ResultSet resultSet = pps.executeQuery();
while (resultSet.next()){
name = resultSet.getString(1);
map.put(id,name);
}
}else {
return mapName;
}
return name;
}
}
Redis的單節點部署
-
下載原始碼包
官網:http://redis.io
所有版本安裝包下載鏈接:https://download.redis.io/releases/ -
編譯原始碼
原因:redis的原始碼是c語言開發,編譯redis原始碼需要安裝gcc
# 安裝centos的Extras庫,它里面有一些centos的安裝包
yum -y install centos-release-scl
# 安裝gcc,centos的默認gcc版本是4.8.5,給他升級到最新版本9.幾
# 并且安裝devtoolset 用來維護開發環境
yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
# 激活對應的devtoolset
scl enable devtoolset-9 bash
# 配置環境變數
echo "source /opt/rh/devtoolset-9/enable" /etc/profile
# source下環境變數使環境變數生效
source /etc/profile
# 安裝完成之后查看是否安裝成功
gcc -v
# 查看版本號,如果有版本號出現代表安裝成功
# 最下面一行出現這個
# gcc version 9.3.1 20200408 (Red Hat 9.3.1-2) (GCC)
# 解壓redis原始碼
tar -zxf redis-6.0.9.tar.gz
cd redis-6.0.9/
# 編譯安裝 遷出可執行檔案
make install PREFIX=/opt/apps/redis6
# 將原來redis中的redis.conf復制出來,放在后來遷出的redis6檔案夾中去
cp /opt/apps/redis/redis.conf /opt/apps/redis6/
# 修改復制過來的組態檔
vi redis.conf
# 修改的第一個地方:
bind 127.0.0.1 # 原來監聽的埠是本機,后面我們要搭建集群,遠程連接,本地顯然是不合適
bind linux01 # 改成集群里面的地址
# 修改的第二個地方:
# daemonize 后臺運行的意思,如果是no,就是前臺啟動,改成yes,后臺啟動,方便一點
daemonize no # 原來是no
daemonize yes # 改成yes
# 環境變數
vi /etc/profile
# REDIS_HOME
export REDIS_HOME=/opt/app/redis6
export PATH=$PATH:$REDIS_HOME/bin
source /etc/profile
# 啟動redis
redis-server /opt/apps/redis6/redis.conf
# 查看是否啟動成功
netstat -nltp |grep redis
# 連接到客戶端
# -h 代表的是指定主機名,-p 代表的是埠號, 默認埠就是6379 --raw 中文顯示亂碼問題
redis-cli -h linux01 -p 6379 --raw
# 連接測驗 輸入ping 回傳pong則成功
linux01:6379> ping
PONG
Redis資料結構
key
keys
KEYS pattern
-- 查找所有符合給定模式 pattern 的 key
KEYS * -- 匹配資料庫中所有 key
KEYS h?llo -- 匹配 hello,hallo 和 hxllo 等, 占一個字符
KEYS h*llo -- 匹配 hllo 和 heeeeello 等
KEYS h[ae]llo -- 匹配 hello 和 hallo ,但不匹配 hillo
-- 回傳值:符合給定模式的 key 串列,
MSET one 1 two 2 three 3 four 4 -- 一次設定 4 個 key
KEYS *o*
KEYS t??
KEYS t[w]*
KEYS * -- 匹配資料庫內所有 key
DEL
DEL key [key ...]
-- 洗掉給定的一個或多個 key ,
-- 不存在的 key 會被忽略,
-- 回傳值:被洗掉 key 的數量,### DUMP
Plain Text
DUMP key
序列化給定 key ,并回傳被序列化的值,使用 RESTORE 命令可以將這個值反序列化為 Redis 鍵,
序列化生成的值有以下幾個特點:
它帶有 64 位的校驗和,用于檢測錯誤, RESTORE 在進行反序列化之前會先檢查校驗和,
值的編碼格式和 RDB 檔案保持一致,
RDB 版本會被編碼在序列化值當中,如果因為 Redis 的版本不同造成 RDB 格式不兼容,那么 Redis 會拒絕對這個值進行反序列化操作,
序列化的值不包括任何生存時間資訊,
回傳值:
如果 key 不存在,那么回傳 nil ,
否則,回傳序列化之后的值,
DUMP
DUMP key
-- 序列化給定 key ,并回傳被序列化的值,使用 RESTORE 命令可以將這個值反序列化為 Redis 鍵,
-- 序列化生成的值有以下幾個特點:
-- 它帶有 64 位的校驗和,用于檢測錯誤, RESTORE 在進行反序列化之前會先檢查校驗和,
-- 值的編碼格式和 RDB 檔案保持一致,
-- RDB 版本會被編碼在序列化值當中,如果因為 Redis 的版本不同造成 RDB 格式不兼容,那么 Redis 會拒絕對這個值進行反序列化操作,
-- 序列化的值不包括任何生存時間資訊,
-- 回傳值:
-- 如果 key 不存在,那么回傳 nil ,
-- 否則,回傳序列化之后的值,
set name hello
linux01:6379> dump name
"\x00\x05hello\t\x00\xb3\x80\x8e\xba1\xb2C\xbb"
RESTORE
RESTORE key ttl serialized-value
-- 反序列化給定的序列化值,并將它和給定的 key 關聯,
-- 引數 ttl 以毫秒為單位為 key 設定生存時間;如果 ttl 為 0 ,那么不設定生存時間,
-- RESTORE 在執行反序列化之前會先對序列化值的 RDB 版本和資料校驗和進行檢查,如果 RDB 版本不相同或者資料不完整的話,那么 RESTORE 會拒絕進行反序列化,并回傳一個錯誤,
-- 回傳值:
-- 如果反序列化成功那么回傳 OK ,否則回傳一個錯誤,
SET greeting "hello, dumping world!"
DUMP greeting
-- "\x00\x15hello, dumping world!\x06\x00E\xa0Z\x82\xd8r\xc1\xde"
RESTORE greeting-again 0 "\x00\x15hello, dumping world!\x06\x00E\xa0Z\x82\xd8r\xc1\xde"
GET greeting-again
-- "hello, dumping world!"
EXISTS
EXISTS key
-- 檢查給定 key 是否存在,
-- 回傳值:若 key 存在,回傳 1 ,否則回傳 0 ,
EXPIRE
EXPIRE key seconds
-- 為給定 key 設定生存時間,當 key 過期時(生存時間為 0 ),它會被自動洗掉,
-- 更新生存時間
-- 可以對一個已經帶有生存時間的 key 執行 EXPIRE 命令,新指定的生存時間會取代舊的生存時間,
-- 過期時間的精確度
-- 在 Redis 2.4 版本中,過期時間的延遲在 1 秒鐘之內 —— 也即是,就算 key 已經過期,但它還是可能在過期之后一秒鐘之內被訪問到,而在新的 Redis 2.6 版本中,延遲被降低到 1 毫秒之內,
-- 回傳值:
-- 設定成功回傳 1 ,
-- 當 key 不存在或者不能為 key 設定生存時間時(比如在低于 2.1.3 版本的 Redis 中你嘗試更新 key 的生存時間),回傳 0
SET cache_page "www.google.com"
EXPIRE cache_page 30 -- 設定過期時間為 30 秒
TTL cache_page -- 查看剩余生存時間
EXPIRE cache_page 30000 -- 更新過期時間
TTL
TTL key
-- 以秒為單位,回傳給定 key 的剩余生存時間(TTL, time to live),
-- 回傳值:
-- 當 key 不存在時,回傳 -2 ,
-- 當 key 存在但沒有設定剩余生存時間時,回傳 -1 ,
-- 否則,以秒為單位,回傳 key 的剩余生存時間,
PTTL
PTTL key
-- 這個命令類似于 TTL 命令,但它以毫秒為單位回傳 key 的剩余生存時間,而不是像 TTL 命令那樣,以秒為單位,
-- 回傳值:
-- 當 key 不存在時,回傳 -2
-- 當 key 存在但沒有設定剩余生存時間時,回傳 -1
-- 否則,以毫秒為單位,回傳 key 的剩余生存時間
EXPIREAT
EXPIREAT key timestamp
-- EXPIREAT 的作用和 EXPIRE 類似,都用于為 key 設定生存時間,
-- 不同在于 EXPIREAT 命令接受的時間引數是 UNIX 時間戳(unix timestamp),
PEXPIREAT
PEXPIREAT key milliseconds-timestamp
--這個命令和 EXPIREAT 命令類似,但它以毫秒為單位設定 key 的過期 unix 時間戳,而不是像 EXPIREAT 那樣,以秒為單位
--回傳值:
--如果生存時間設定成功,回傳 1
--當 key 不存在或沒辦法設定生存時間時,回傳 0
PERSIST
PERSIST key
-- 移除給定 key 的生存時間,將這個 key 從『易失的』(帶生存時間 key )轉換成『持久的』(一個不帶生存時間、永不過期的 key ),
-- 回傳值:
-- 當生存時間移除成功時,回傳 1 .
--如果 key 不存在或 key 沒有設定生存時間,回傳 0
RANDOMKEY
RANDOMKEY
-- 從當前資料庫中隨機回傳(不洗掉)一個 key
-- 回傳值:
-- 當資料庫不為空時,回傳一個 key
-- 當資料庫為空時,回傳 nil
RENAME
RENAME key newkey
-- 將 key 改名為 newkey ,
-- 當 key 和 newkey 相同,或者 key 不存在時,回傳一個錯誤,
-- 當 newkey 已經存在時, RENAME 命令將覆寫舊值,
-- 回傳值:
-- 改名成功時提示 OK ,失敗時候回傳一個錯誤,
RENAMENX
RENAMENX key newkey
-- 當且僅當 newkey 不存在時,將 key 改名為 newkey
-- 當 newkey 存在時,回傳一個0
-- 回傳值:
-- 修改成功時,回傳 1
-- 如果 newkey 已經存在,回傳 0
MIGRATE
MIGRATE host port key destination-db timeout [COPY] [REPLACE]
-- 將 key 原子性地從當前實體傳送到目標實體的指定資料庫上,一旦傳送成功, key 保證會出現在目標實體上,而當前實體上的 key 會被洗掉
-- 這個命令是一個原子操作,它在執行的時候會阻塞進行遷移的兩個實體,直到以下任意結果發生:遷移成功,遷移失敗,等到超時
-- 命令的內部實作是這樣的:它在當前實體對給定 key 執行 DUMP 命令 ,將它序列化,然后傳送到目標實體,目標實體再使用 RESTORE 對資料進行反序列化,并將反序列化所得的資料添加到資料庫中;當前實體就像目標實體的客戶端那樣,只要看到 RESTORE 命令回傳 OK ,它就會呼叫 DEL 洗掉自己資料庫上的 key
-- timeout 引數以毫秒為格式,指定當前實體和目標實體進行溝通的最大間隔時間,這說明操作并不一定要在 timeout 毫秒內完成,只是說資料傳送的時間不能超過這個 timeout 數
-- 可選項:
-- COPY :不移除源實體上的 key
-- REPLACE :替換目標實體上已存在的 key
-- 回傳值:遷移成功時回傳 OK ,否則回傳相應的錯誤,
MOVE
MOVE key db
-- 將當前資料庫的 key 移動到給定的資料庫 db 當中,
-- 如果當前資料庫(源資料庫)和給定資料庫(目標資料庫)有相同名字的給定 key ,或者 key 不存在于當前資料庫,那么 MOVE 沒有任何效果,
-- 因此,也可以利用這一特性,將 MOVE 當作鎖(locking)原語(primitive),
-- 回傳值:移動成功回傳 1 ,失敗則回傳 0 ,
String
SET
SET key value [EX seconds] [PX milliseconds] [NX|XX]
-- 將字串值 value 關聯到 key ,
-- 如果 key 已經持有其他值, SET 就覆寫舊值,無視型別,
-- 對于某個原本帶有生存時間(TTL)的鍵來說, 當 SET 命令成功在這個鍵上執行時, 這個鍵原有的 TTL 將被清除,
-- 可選引數
-- 從 Redis 2.6.12 版本開始, SET 命令的行為可以通過一系列引數來修改:
-- EX second :設定鍵的過期時間為 second 秒, SET key value EX second 效果等同于 SETEX key second value ,
-- PX millisecond :設定鍵的過期時間為 millisecond 毫秒, SET key value PX millisecond 效果等同于 PSETEX key millisecond value ,
-- NX :只在鍵不存在時,才對鍵進行設定操作, SET key value NX 效果等同于 SETNX key value
-- XX :只在鍵已經存在時,才對鍵進行設定操作,
-- 回傳值:
-- 在 Redis 2.6.12 版本以前, SET 命令總是回傳 OK ,
-- 從 Redis 2.6.12 版本開始, SET 在設定操作成功完成時,才回傳 OK ,
-- 如果設定了 NX 或者 XX ,但因為條件沒達到而造成設定操作未執行,那么命令回傳空批量回復(NULL Bulk Reply)
-- 對不存在的鍵進行設定
redis 127.0.0.1:6379> SET key "value"
OK
redis 127.0.0.1:6379> GET key
"value"
-- 對已存在的鍵進行設定
redis 127.0.0.1:6379> SET key "new-value"
OK
redis 127.0.0.1:6379> GET key
"new-value"
-- 使用 EX 選項
redis 127.0.0.1:6379> SET key-with-expire-time "hello" EX 10086
OK
redis 127.0.0.1:6379> GET key-with-expire-time
"hello"
redis 127.0.0.1:6379> TTL key-with-expire-time
(integer) 10069
-- 使用 PX 選項
redis 127.0.0.1:6379> SET key-with-pexpire-time "moto" PX 123321
OK
redis 127.0.0.1:6379> GET key-with-pexpire-time
"moto"
redis 127.0.0.1:6379> PTTL key-with-pexpire-time
(integer) 111939
-- 使用 NX 選項
redis 127.0.0.1:6379> SET not-exists-key "value" NX
OK -- 鍵不存在,設定成功
redis 127.0.0.1:6379> GET not-exists-key
"value"
redis 127.0.0.1:6379> SET not-exists-key "new-value" NX
(nil) -- 鍵已經存在,設定失敗
redis 127.0.0.1:6379> GEt not-exists-key
"value" # 維持原值不變
-- 使用 XX 選項
redis 127.0.0.1:6379> EXISTS exists-key
(integer) 0
redis 127.0.0.1:6379> SET exists-key "value" XX
(nil) -- 因為鍵不存在,設定失敗
redis 127.0.0.1:6379> SET exists-key "value"
OK -- 先給鍵設定一個值
redis 127.0.0.1:6379> SET exists-key "new-value" XX
OK -- 設定新值成功
redis 127.0.0.1:6379> GET exists-key
"new-value"
-- NX 或 XX 可以和 EX 或者 PX 組合使用
redis 127.0.0.1:6379> SET key-with-expire-and-NX "hello" EX 10086 NX
OK
redis 127.0.0.1:6379> GET key-with-expire-and-NX
"hello"
redis 127.0.0.1:6379> TTL key-with-expire-and-NX
(integer) 10063
redis 127.0.0.1:6379> SET key-with-pexpire-and-XX "old value"
OK
redis 127.0.0.1:6379> SET key-with-pexpire-and-XX "new value" PX 123321
OK
redis 127.0.0.1:6379> GET key-with-pexpire-and-XX
"new value"
redis 127.0.0.1:6379> PTTL key-with-pexpire-and-XX
(integer) 112999
-- EX 和 PX 可以同時出現,但后面給出的選項會覆寫前面給出的選項
redis 127.0.0.1:6379> SET key "value" EX 1000 PX 5000000
OK
redis 127.0.0.1:6379> TTL key
(integer) 4993 -- 這是 PX 引數設定的值
redis 127.0.0.1:6379> SET another-key "value" PX 5000000 EX 1000
OK
redis 127.0.0.1:6379> TTL another-key
(integer) 997 -- 這是 EX 引數設定的值
GET
GET key
-- 回傳 key 所關聯的字串值
-- 如果 key 不存在那么回傳特殊值 nil
-- 假如 key 儲存的值不是字串型別,回傳一個錯誤,因為 GET 只能用于處理字串值
-- 回傳值:
-- 當 key 不存在時,回傳 nil,否則,回傳 key 的值
-- 如果 key 不是字串型別,那么回傳一個錯誤
-- 對不存在的 key 或字串型別 key 進行 GET
redis> GET db
(nil)
redis> SET db redis
OK
redis> GET db
"redis"
-- 對不是字串型別的 key 進行 GET
redis> DEL db
(integer) 1
redis> LPUSH db redis mongodb mysql
(integer) 3
redis> GET db
(error) ERR Operation against a key holding the wrong kind of value
MSET
MSET key value [key value ...]
-- 同時設定一個或多個 key-value 對,
-- 如果某個給定 key 已經存在,那么 MSET 會用新值覆寫原來的舊值,如果這不是你所希望的效果,請考慮使用 MSETNX 命令:它只會在所有給定 key 都不存在的情況下進行設定操作,
-- MSET 是一個原子性(atomic)操作,所有給定 key 都會在同一時間內被設定,某些給定 key 被更新而另一些給定 key 沒有改變的情況,不可能發生,
redis> MSET date "2012.3.30" time "11:00 a.m." weather "sunny"
OK
redis> MGET date time weather
1) "2012.3.30"
2) "11:00 a.m."
3) "sunny"
-- MSET 覆寫舊值例子
redis> SET google "google.hk"
OK
redis> MSET google "google.com"
OK
redis> GET google
"google.com"
MGET
MGET key [key ...]
-- 回傳所有(一個或多個)給定 key 的值,
-- 如果給定的 key 里面,有某個 key 不存在,那么這個 key 回傳特殊值 nil ,因此,該命令永不失敗,
-- 回傳值:一個包含所有給定 key 的值的串列,
edis> SET redis redis.com
OK
redis> SET mongodb mongodb.org
OK
redis> MGET redis mongodb mysql
1) "redis.com"
2) "mongodb.org"
3) (nil)
GETSET
GETSET key value
-- 將給定 key 的值設為 value ,并回傳 key 的舊值(old value),
-- 當 key 存在但不是字串型別時,回傳一個錯誤,
-- 回傳值:
-- 回傳給定 key 的舊值,
-- 當 key 沒有舊值時,也即是, key 不存在時,回傳 nil ,
redis> GETSET db mongodb -- 沒有舊值,回傳 nil
(nil)
redis> GET db
"mongodb"
redis> GETSET db redis -- 回傳舊值 mongodb
"mongodb"
redis> GET db
"redis"
APPEND
APPEND key value
-- 如果 key 已經存在并且是一個字串, APPEND 命令將 value 追加到 key 原來的值的末尾,
-- 如果 key 不存在, APPEND 就簡單地將給定 key 設為 value ,就像執行 SET key value 一樣,
-- 回傳值:追加 value 之后, key 中字串的長度,
DECRBY
DECRBY key decrement
-- 將 key 所儲存的值減去減量 decrement ,
-- 如果 key 不存在,那么 key 的值會先被初始化為 0 ,然后再執行 DECRBY 操作,
-- 如果值包含錯誤的型別,或字串型別的值不能表示為數字,那么回傳一個錯誤,
-- 本操作的值限制在 64 位(bit)有符號數字表示之內,
DECR key
-- 將 key 中儲存的數字值減一
-- 回傳值:減去 decrement 之后, key 的值,
INCRBY
INCRBY key increment
-- 將 key 所儲存的值加上增量 increment ,
-- 如果 key 不存在,那么 key 的值會先被初始化為 0 ,然后再執行 INCRBY 命令,
-- 如果值包含錯誤的型別,或字串型別的值不能表示為數字,那么回傳一個錯誤,
-- 本操作的值限制在 64 位(bit)有符號數字表示之內,
INCR key
-- 將 key 中儲存的數字值增一
-- 回傳值:加上 increment 之后, key 的值,
GETRANGE
GETRANGE key start end
-- 回傳 key 中字串值的子字串,字串的截取范圍由 start 和 end 兩個偏移量決定(包括 start 和 end 在內),
-- 負數偏移量表示從字串最后開始計數, -1 表示最后一個字符, -2 表示倒數第二個,以此類推,
-- GETRANGE 通過保證子字串的值域(range)不超過實際字串的值域來處理超出范圍的值域請求,
-- 回傳值:截取得出的子字串,
STRLEN
STRLEN key
-- 回傳 key 所儲存的字串值的長度
-- 當 key 儲存的不是字串值時,回傳一個錯誤
-- 回傳值:
-- 字串值的長度
-- 當 key 不存在時,回傳 0
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/554199.html
標籤:其它
上一篇:SQLite教程1
下一篇:返回列表
