Redis 數據庫

NoSQL

百度百科

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

非關係型數據庫的特色

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

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

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

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

優勢

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

高擴展性

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

高可用

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

高可靠

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

Redis 概述

開發中的需求

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

redis是什麼

百度百科sql

是一個開源的使用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 是以簡單的 鍵值對的方式存儲數據的.shell

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

redis 由兩種數據同步的方式vim

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 ::1這一行註釋掉。
(2)修改redis.conf 文件,protected-mode 要設置成no
(3)啓動的時候,須要指定redis.conf 文件,執行./src/redis-server redis.conf命令

redis 重啓服務

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>>

这里写图片描述

語法結構

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/hellozp...

引入 maven 依賴

<!-- Redis -->
<dependency>
      <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

啓動類上添加註解

@EnableCaching

代碼中使用redis

註解方式

添加緩存

@Cacheable(cacheNames = "product", key = "123")
        若是不填 key ,默認的 key 是當前的方法名

對象沒有序列化錯誤

img

讓對象實現 Serializable

更新緩存

@CachePut(cacheNames = "prodcut", key = "123")
    做用和@Cacheable 相似

刪除緩存

@CacheEvict(cacheNames = "prodcut", key = "123")

cacheNames 也能夠統一寫在類上面, @CacheConfig(cacheNames = "product") ,具體的方法上就不用寫啦。

RedisTemplate方式

相關文章
相關標籤/搜索