04- Redis

NoSQL

百度百科

​ NoSQL,泛指非關係型的數據庫。隨着互聯網web2.0網站的興起,傳統的關係數據庫在處理web2.0網站,特別是超大規模和高併發的SNS類型的web2.0純動態網站已經顯得力不從心,出現了很多難以克服的問題,而非關係型的數據庫則由於其本身的特點得到了非常迅速的發展。NoSQL數據庫的產生就是爲了解決大規模數據集合多重數據種類帶來的挑戰,尤其是大數據應用難題。

非關係型數據庫的特點

數據模型比較簡單 (沒有數據表與表之間的關係)

需要靈活性更強的IT系統 ()

對數據庫性能要求較高 (緩存 )

不需要高度的數據一致性 (關係型數據庫數據 事務安全性較高, 非關係型較差)

優點

對數據高併發讀寫  (非關係型數據,基於內存存儲數據, 讀寫效率高)
對海量數據的搞笑存儲和訪問
對數據的高擴展性和高可用性

高擴展性

一臺主要服務器
	其他幾個從屬的服務器
	主服務器可讀寫, 從服務器 只支持讀操作
	(服務器集羣, 當集羣中服務器中的內存空間不夠用了, 可以直接在集羣中添加新的服務器存儲空間)

高可用

集羣中的服務器, 當某一臺服務器宕機不可用之後, 可以直接由新的備用機來取代

高可靠

數據不會產生丟失現象, 但是redis 是基於內存的, 當服務器一斷電, 內存會被清空. 所以需要保證內存中的數據和磁盤中的數據的同步保存

Redis 概述

開發中的需求

	在開發網站的時候如果有一些數據在短時間之內不會發生變化,而它們還要被頻繁的訪問,爲了提高用戶的請求速度和降低網站的負載,就把這些數據放到一個讀取速度更快的介質上(或者是通過較少的計算量就可以獲得該數據),該行爲就稱作對該數據的緩存。該介質可以是文件、數據庫、內存,內存經常用於數據緩存。

redis是什麼

百度百科

	是一個開源的使用ANSI C語言編寫、支持網絡、可基於內存亦可持久化的日誌型、Key-Value數據庫,並提供多種語言的API。從2010年3月15日起,Redis的開發工作由VMware主持。從2013年5月開始,Redis的開發由Pivotal贊助。

優勢

Redis跟memcache不同的是,儲存在Redis中的數據是持久化的,斷電或重啓後,數據也不會丟失。因爲Redis的存儲分爲內存存儲、磁盤存儲和log文件三部分,重啓後,Redis可以從磁盤重新將數據加載到內存中,這些可以通過配置文件對其進行配置,正因爲這樣,Redis才能實現持久化。

Redis支持主從模式,可以配置集羣,這樣更利於支撐起大型的項目,這也是Redis的一大亮點。

- 性能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s 。
- 豐富的數據類型 – Redis支持二進制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數據類型操作。
- 原子 – Redis的所有操作都是原子性的,同時Redis還支持對幾個操作全並後的原子性執行。
- 豐富的特性 – Redis還支持 publish/subscribe, 通知, key 過期等等特性。

redis 三種集羣策略

主從形式 (讀寫分離)

主節點和從節點 
只有一臺機器可寫
	另外的機器只讀
這種策略的問題是, 當主節點出現問題的時候, 項目無法寫入的問題

哨兵形式

衍生出另外的哨兵節點  (實現了高可用狀態)
哨兵服務器會監控其他服務器, 
	當主節點出現問題的時候, 
	會在其他從節點中找出一臺服務器切換爲主服務器,
	當主服務器修復完成之後, 自動作爲從節點添加回當前集羣中

集羣模式

支持多主多從
	當有大量數據需要服務器處理的時候, 多臺主服務器可以均攤服務器的壓力, 
	當有一臺主服務器出現問題的時候, 其他服務器自動承擔更多壓力

持久化策略(高可靠)

redis 是以簡單的 鍵值對的方式存儲數據的.

爲了保證 數據的高可靠性, redis 必須週期性的把數據存儲到 硬盤中

redis 由兩種數據同步的方式

RDB 週期性 , 每隔一段時間, 保存一次數據

AOF 只要執行增刪改操作, 執行日誌操作 , 當服務器出現問題的時候, 可以通過日誌文件來恢復數據

	AOF持久化,默認是關閉的,默認是打開RDB持久化
	appendonly yes,可以打開AOF持久化機制,在生產環境裏面,一般來說AOF都是要打開的,除非你說隨便丟個幾分鐘的數據也無所謂
	打開AOF持久化機制之後,redis每次接收到一條寫命令,就會寫入日誌文件中,當然是先寫入os cache的,然後每隔一定時間再fsync一下
	而且即使AOF和RDB都開啓了,redis重啓的時候,也是優先通過AOF進行數據恢復的,因爲aof數據比較完整
	可以配置AOF的fsync策略,有三種策略可以選擇,一種是每次寫入一條數據就執行一次fsync; 一種是每隔一秒執行一次fsync; 一種是不主動執行fsync
	always: 每次寫入一條數據,立即將這個數據對應的寫日誌fsync到磁盤上去,性能非常非常差,吞吐量很低; 確保說redis裏的數據一條都不丟,那就只能這樣了

mysql -> 內存策略,大量磁盤,QPS到多少,一兩k。QPS,每秒鐘的請求數量
redis -> 內存,磁盤持久化,QPS到多少,單機,一般來說,上萬QPS沒問題

Redis 環境搭建

Windows 環境

運行服務端

這時候另啓一個cmd窗口,原來的不要關閉,不然就無法訪問服務端了。

切換到redis目錄下運行 redis-cli.exe 。

C:\redis>redis-cli.exe

127.0.0.1:6379> ping
PONG

以上說明我們已經成功安裝了redis。

linux 環境

上傳文件

目錄位置爲 /usr/local/

解壓文件

tar -zxvf redis-5.0.4.tar.gz

進入目錄並編譯

 cd redis-5.0.4
 make

完成安裝

進入src 目錄
cd src 
make install

統一管理配置文件和常用命令

創建兩個新文件夾

mkdir /usr/local/redis/etc
mkdir /usr/local/redis/bin

移動配置文件到etc

mv /usr/local/redis-5.0.4/redis.conf /usr/local/redis/etc/

移動常用命令到bin (進入到src 目錄中)

cd /usr/local/redis-5.0.4/src
mv mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-server /usr/local/redis/bin/

配置redis 後臺啓動

cd /usr/local/redis/etc/
vim redis.conf

修改 daemonize 屬性的值爲 yes

啓動 redis 服務

/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf

查看端口號

ps -ef | grep redis

配置redis 服務開機啓動

vim /etc/rc.local

添加配置文件內容爲 redis 的啓動命令

touch /var/lock/subsys/local
/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf

允許外部機器連接

(1)修改redis.conf 文件,把bind 127.0.0.1 這一行註釋掉。
(2)修改redis.conf 文件,protected-mode 要設置成no
(3)啓動的時候,需要指定redis.conf 文件,執行命令
/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf

redis 重啓服務

/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 6379 shutdown
// 或者使用終極武器
pkill redis-server
// 或者
kill 進程號

防火牆配置

/sbin/iptables -I INPUT -p tcp --dport 6379 -j ACCEPT 
/etc/rc.d/init.d/iptables save
/etc/rc.d/init.d/iptables restart
/etc/rc.d/init.d/iptables status

使用Xshell 工具遠程連接

/usr/local/bin/redis-cli -h 127.0.0.1 -p 6379

桌面管理工具

安裝Redis

redis 基本命令

set 鍵 值

get 鍵

keys *

通配符 含義
? 匹配一個字符
* 匹配任意個字符
[] 匹配括號中, 範圍內的任意一個字符
\ 轉義字符

exists 鍵

del 鍵

type 鍵

help

數據類型

redis 多數據庫支持

Redis 默認支持16 個數據庫, 命名方式 爲 0-15
可以通過參數修改默認數據庫的個數
客戶端連接 redis 之後 自動選擇 0 號數據庫
可以通過 select 命令更換數據庫 (select 1 )

字符串

get set
mset / mget

incr (自增長)
incrby 指定步長 增長
decr 自減
decrby  
append 向尾部追加值
strlen 獲取字符串長度

管理字符串的基本命令

序號 命令 說明
1 SET key value 此命令設置指定鍵的值。
2 GET key 獲取指定鍵的值。
3 GETRANGE key start end 獲取存儲在鍵上的字符串的子字符串。
4 GETSET key value 設置鍵的字符串值並返回其舊值。
5 GETBIT key offset 返回在鍵處存儲的字符串值中偏移處的位值。
6 MGET key1 [key2…] 獲取所有給定鍵的值
7 SETBIT key offset value 存儲在鍵上的字符串值中設置或清除偏移處的位
8 SETEX key seconds value (expired) 使用鍵和到期時間來設置值
9 SETNX key value (not exists) 設置鍵的值,僅當鍵不存在時
10 SETRANGE key offset value 在指定偏移處開始的鍵處覆蓋字符串的一部分
11 STRLEN key 獲取存儲在鍵中的值的長度
12 MSET key value [key value …] 爲多個鍵分別設置它們的值
13 MSETNX key value [key value …] 爲多個鍵分別設置它們的值,僅當鍵不存在時
14 PSETEX key milliseconds value 設置鍵的值和到期時間(以毫秒爲單位)
15 INCR key 將鍵的整數值增加1
16 INCRBY key increment 將鍵的整數值按給定的數值增加
17 INCRBYFLOAT key increment 將鍵的浮點值按給定的數值增加
18 DECR key 將鍵的整數值減1
19 DECRBY key decrement 按給定數值減少鍵的整數值
20 APPEND key value 將指定值附加到鍵

列表類型(List)

127.0.0.1:6379[2]> lpush list zhangsan lisi wangwu zhaoliu
(integer) 4
127.0.0.1:6379[2]> lrange list 0 10
1) "zhaoliu"
2) "wangwu"
3) "lisi"
4) "zhangsan"

常用命令

序號 命令 說明
1 BLPOP key1
[key2 ] timeout
移出並獲取列表的第一個元素,
如果列表沒有元素會阻塞列表
直到等待超時或發現可彈出元素爲止。
2 BRPOP key1 [key2 ] timeout 移出並獲取列表的最後一個元素,
如果列表沒有元素會阻塞列表
直到等待超時或發現可彈出元素爲止。
3 BRPOPLPUSH source destination timeout 從列表中彈出一個值,
將彈出的元素插入到另外一個列表中並返回它;
如果列表沒有元素會阻塞列表
直到等待超時或發現可彈出元素爲止。
4 LINDEX key index 通過索引獲取列表中的元素
5 LINSERT key BEFORE AFTER pivot value
6 LLEN key 獲取列表長度
7 LPOP key 移出並獲取列表的第一個元素
8 LPUSH key value1 [value2] 將一個或多個值插入到列表頭部
9 LPUSHX key value 將一個值插入到已存在的列表頭部
10 LRANGE key start stop 獲取列表指定範圍內的元素
11 LREM key count value 移除列表元素
12 LSET key index value 通過索引設置列表元素的值
13 LTRIM key start stop 對一個列表進行修剪(trim),
就是說,讓列表只保留指定區間內的元素,
不在指定區間之內的元素都將被刪除。
14 RPOP key 移除並獲取列表最後一個元素
15 RPOPLPUSH source destination 移除列表的最後一個元素,
並將該元素添加到另一個列表並返回
16 RPUSH key value1 [value2] 在列表中添加一個或多個值
17 RPUSHX key value 爲已存在的列表添加值

set

	Redis的Set是string類型的無序集合。集合成員是唯一的,這就意味着集合中不能出現重複的數據。
Redis 中 集合是通過哈希表實現的,所以添加,刪除,查找的複雜度都是O(1)。

常用命令

序號 命令 描述
1 SADD key member1 [member2] 向集合添加一個或多個成員
2 SCARD key 獲取集合的成員數
3 SDIFF key1 [key2] 返回給定所有集合的差集
4 SDIFFSTORE destination key1 [key2] 返回給定所有集合的差集並存儲在 destination 中
5 SINTER key1 [key2] 返回給定所有集合的交集
6 SINTERSTORE destination key1 [key2] 返回給定所有集合的交集並存儲在 destination 中
7 SISMEMBER key member 判斷 member 元素是否是集合 key 的成員
8 SMEMBERS key 返回集合中的所有成員
9 SMOVE source destination member 將 member 元素從 source 集合移動到 destination 集合
10 SPOP key 移除並返回集合中的一個隨機元素
11 SRANDMEMBER key [count] 返回集合中一個或多個隨機數
12 SREM key member1 [member2] 移除集合中一個或多個成員
13 SUNION key1 [key2] 返回所有給定集合的並集
14 SUNIONSTORE destination key1 [key2] 所有給定集合的並集存儲在 destination 集合中
15 SSCAN key cursor [MATCH pattern] [COUNT count] 迭代集合中的元素

有序集合(sorted set)

Redis 有序集合和集合一樣也是string類型元素的集合,且不允許重複的成員。

常用命令

序號 常用命令 描述
1 ZADD key score1 member1 [score2 member2] 向有序集合添加一個或多個成員,或者更新已存在成員的分數
2 ZCARD key 獲取有序集合的成員數
3 ZCOUNT key min max 計算在有序集合中指定區間分數的成員數
4 ZINCRBY key increment member 有序集合中對指定成員的分數加上增量 increment
5 ZINTERSTORE destination numkeys key [key …] 計算給定的一個或多個有序集的交集並將結果集存儲在新的有序集合 key 中
6 ZLEXCOUNT key min max 在有序集合中計算指定字典區間內成員數量
7 ZRANGE key start stop [WITHSCORES] 通過索引區間返回有序集合成指定區間內的成員
8 ZRANGEBYLEX key min max [LIMIT offset count] 通過字典區間返回有序集合的成員
9 ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] 通過分數返回有序集合指定區間內的成員
10 ZRANK key member 返回有序集合中指定成員的索引
11 ZREM key member [member …] 移除有序集合中的一個或多個成員
12 ZREMRANGEBYLEX key min max 移除有序集合中給定的字典區間的所有成員
13 ZREMRANGEBYRANK key start stop 移除有序集合中給定的排名區間的所有成員
14 ZREMRANGEBYSCORE key min max 移除有序集合中給定的分數區間的所有成員
15 ZREVRANGE key start stop [WITHSCORES] 返回有序集中指定區間內的成員,通過索引,分數從高到底
16 ZREVRANGEBYSCORE key max min [WITHSCORES] 返回有序集中指定分數區間內的成員,分數從高到低排序
17 ZREVRANK key member 返回有序集合中指定成員的排名,有序集成員按分數值遞減(從大到小)排序
18 ZSCORE key member 返回有序集中,成員的分數值
19 ZUNIONSTORE destination numkeys key [key …] 計算給定的一個或多個有序集的並集,並存儲在新的 key 中
20 ZSCAN key cursor [MATCH pattern] [COUNT count] 迭代有序集合中的元素(包括元素成員和元素分值)

Hash數據結構

簡介

Redis hash 是一個string類型的field和value的映射表,hash特別適合用於存儲對象。

Map<String,Map<String,String>>

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-VFRZpBC1-1572277934808)(04- Redis.assets/2018072900071026.png)]

語法結構

hset key field value
hset 鍵  屬性 值
對比 
設置 學生鍵 name屬性 值爲張三
hget 鍵 屬性
hmset 鍵 屬性 值  [屬性 值] ...
hmget 鍵 屬性 [屬性]
hgetall key(鍵)

獲取鍵集或值集

hkeys 鍵
hvals 鍵

獲取字段數量

hlen 鍵

判斷是否存在

hsxists 鍵 屬性
127.0.0.1:6379[2]> hset stu name zhangsan
127.0.0.1:6379[2]> hexists stu name
(integer) 1
字段存在 返回 1 真 , 不存在返回 0 假

選擇性插入

hsetnx 鍵 屬性 值
如果值存在, 則不執行, 值不存在則執行

自增長

hincrby per age 1
hincrby key field increment

hincrby user age 2 (user 鍵的 age 屬性  自增 2)

刪除

hdel key field [field...]

常用命令彙總

1 HDEL key field2 [field2] 刪除一個或多個哈希表字段
2 HEXISTS key field 查看哈希表 key 中,指定的字段是否存在。
3 HGET key field 獲取存儲在哈希表中指定字段的值。
4 HGETALL key 獲取在哈希表中指定 key 的所有字段和值
5 HINCRBY key field increment 爲哈希表 key 中的指定字段的整數值加上增量 increment 。
6 HINCRBYFLOAT key field increment 爲哈希表 key 中的指定字段的浮點數值加上增量 increment
7 HKEYS key 獲取所有哈希表中的字段
8 HLEN key 獲取哈希表中字段的數量
9 HMGET key field1 [field2] 獲取所有給定字段的值
10 HMSET key field1 value1 [field2 value2 ] 同時將多個 field-value (域-值)對設置到哈希表 key 中。
11 HSET key field value 將哈希表 key 中的字段 field 的值設爲 value 。
12 HSETNX key field value 只有在字段 field 不存在時,設置哈希表字段的值。
13 HVALS key 獲取哈希表中所有值
14 HSCAN key cursor [MATCH pattern] [COUNT count] 迭代哈希表中的鍵值對。

Redis之生存時間

redis 一般用於緩存, 而緩存一般都是要設置失效時間的, 到期後數據銷燬

語法

expire key seconds 
設置失效時間 鍵 單位秒
127.0.0.1:6379[2]> set name zhangsan
OK
127.0.0.1:6379[2]> get name 
"zhangsan"
127.0.0.1:6379[2]> expire name 5
(integer) 1
127.0.0.1:6379[2]> ttl name
(integer) 2
127.0.0.1:6379[2]> ttl name
(integer) -2
127.0.0.1:6379[2]> get name
(nil)

TTL返回值:

大於0的數字:剩餘生存時間,單位爲秒

-1 : 沒有生存時間,永久存儲

-2 : 數據已經被刪除

清除生存時間限制

persist key
重新設置值, 也會清除生存時間限制

redis 事務

Redis 事務可以一次執行多個命令, 並且帶有以下兩個重要的保證:

事務是一個單獨的隔離操作:

事務中的所有命令都會序列化、按順序地執行。事務在執行的過程中,不會被其他客戶端發送來的命令請求所打斷。 

事務是一個原子操作:事務中的命令要麼全部被執行,要麼全部都不執行。

語法

MULTI
多條語句代碼
EXEC
當 執行 EXEC  以事務的方式 觸發命令的執行

常用命令列表

序號 命令 說明
1 DISCARD 取消事務,
放棄執行事務塊內的所有命令。
2 EXEC 執行所有事務塊內的命令。
3 MULTI 標記一個事務塊的開始。
4 UNWATCH 取消 WATCH 命令對所有 key 的監視。
5 WATCH key [key …] 監視一個(或多個) key ,
如果在事務執行之前
這個(或這些) key 被其他命令所改動,
那麼事務將被打斷。

redis 主從複製

​ 隨着項目訪問量的增加,對Redis服務器的操作也越加頻繁,雖然Redis讀寫速度都很快,但是一定程度上也會造成一定的延時,那麼爲了解決訪問量大的問題,通常會採取的一種方式是主從架構Master/Slave,Master 以寫爲主,Slave 以讀爲主,Master 主節點更新後根據配置,自動同步到從機Slave 節點。

配置文件

主 redis 配置無需特殊配置。

從redis配置

修改從 redis 服務器上的 redis.conf 文件,添加 slaveof 主 redisip 主 redis 端口。

salveof 192.168.3.88 6379

測試主從數據

Jedis 客戶端操作

Jedis 簡介

Jedis是Redis官方推薦的Java連接開發工具。要在Java開發中使用好Redis中間件,必須對Jedis熟悉才能寫成漂亮的代碼
	Jedis的基本使用非常簡單,只需要創建Jedis對象的時候指定host,port, password即可。當然,Jedis對象又很多構造方法,都大同小異,只是對應和Redis連接的socket的參數不一樣而已。簡單使用如下圖所示

導入依賴

<dependency>
  <groupId>redis.clients</groupId>
  <artifactId>jedis</artifactId>
  <version>2.6.0</version>
</dependency>
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-log4j12</artifactId>
  <version>1.6.4</version>
</dependency>

確保 redis 的服務器可以正常訪問

代碼案例

基本使用方式

public static void testJedis(){
    Jedis jedis = new Jedis("192.168.3.186",6379);
    jedis.set("jedis","hello");
    String name = jedis.get("jedis");
    System.out.println(name);
    jedis.close();
}

連接池方式

public static void testJedisPool(){
    // 構建連接池配置信息
    JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
    // 設置最大連接數
    jedisPoolConfig.setMaxTotal(50);
    // 構建連接池
    JedisPool jedisPool = new JedisPool(jedisPoolConfig, "192.168.3.186", 6379);
    // 從連接池中獲取連接
    Jedis jedis = jedisPool.getResource();
    // 讀取數據
    System.out.println(jedis.get("jedis"));
    // 將連接還回到連接池中
    jedisPool.returnResource(jedis);
    // 釋放連接池
    jedisPool.close();
}

SpringBoot 整合 Redis

參考文章 : https://blog.csdn.net/hellozpc/article/details/81267030#29Rediscli_99

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章