百度百科 NoSQL,泛指非關係型的數據庫。隨着互聯網web2.0網站的興起,傳統的關係數據庫在處理web2.0網站,特別是超大規模和高併發的SNS類型的web2.0純動態網站已經顯得力不從心,出現了不少難以克服的問題,而非關係型的數據庫則因爲其自己的特色獲得了很是迅速的發展。NoSQL數據庫的產生就是爲了解決大規模數據集合多重數據種類帶來的挑戰,尤爲是大數據應用難題。mysql
數據模型比較簡單 (沒有數據表與表之間的關係)linux
須要靈活性更強的IT系統 ()web
對數據庫性能要求較高 (緩存 ) redis
不須要高度的數據一致性 (關係型數據庫數據 事務安全性較高, 非關係型較差)spring
對數據高併發讀寫 (非關係型數據,基於內存存儲數據, 讀寫效率高) 對海量數據的搞笑存儲和訪問 對數據的高擴展性和高可用性
一臺主要服務器 其餘幾個從屬的服務器 主服務器可讀寫, 從服務器 只支持讀操做 (服務器集羣, 當集羣中服務器中的內存空間不夠用了, 能夠直接在集羣中添加新的服務器存儲空間)
集羣中的服務器, 當某一臺服務器宕機不可用以後, 能夠直接由新的備用機來取代
數據不會產生丟失現象, 可是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 是以簡單的 鍵值對的方式存儲數據的.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沒問題
運行服務端
這時候另啓一個cmd窗口,原來的不要關閉,否則就沒法訪問服務端了。
切換到redis目錄下運行 redis-cli.exe 。
C:redis>redis-cli.exe
127.0.0.1:6379> ping PONG
以上說明咱們已經成功安裝了redis。
目錄位置爲 /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/
cd /usr/local/redis/etc/ vim redis.conf
修改 daemonize 屬性的值爲 yes
/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-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
/usr/local/bin/redis-cli -h 127.0.0.1 -p 6379
安裝Redis
通配符 | 含義 |
---|---|
? | 匹配一個字符 |
* | 匹配任意個字符 |
[] | 匹配括號中, 範圍內的任意一個字符 |
\ | 轉義字符 |
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 | 將指定值附加到鍵 |
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 | 爲已存在的列表添加值 |
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] | 迭代集合中的元素 |
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] | 迭代有序集合中的元素(包括元素成員和元素分值) |
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 通常用於緩存, 而緩存通常都是要設置失效時間的, 到期後數據銷燬
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 事務能夠一次執行多個命令, 而且帶有如下兩個重要的保證:
事務是一個單獨的隔離操做:
事務中的全部命令都會序列化、按順序地執行。事務在執行的過程當中,不會被其餘客戶端發送來的命令請求所打斷。
事務是一個原子操做:事務中的命令要麼所有被執行,要麼所有都不執行。
MULTI 多條語句代碼 EXEC 當 執行 EXEC 以事務的方式 觸發命令的執行
序號 | 命令 | 說明 |
---|---|---|
1 | DISCARD | 取消事務, 放棄執行事務塊內的全部命令。 |
2 | EXEC | 執行全部事務塊內的命令。 |
3 | MULTI | 標記一個事務塊的開始。 |
4 | UNWATCH | 取消 WATCH 命令對全部 key 的監視。 |
5 | WATCH key [key …] | 監視一個(或多個) key , 若是在事務執行以前 這個(或這些) key 被其餘命令所改動, 那麼事務將被打斷。 |
隨着項目訪問量的增長,對Redis服務器的操做也越加頻繁,雖然Redis讀寫速度都很快,可是必定程度上也會形成必定的延時,那麼爲了解決訪問量大的問題,一般會採起的一種方式是主從架構Master/Slave,Master 以寫爲主,Slave 以讀爲主,Master 主節點更新後根據配置,自動同步到從機Slave 節點。
主 redis 配置無需特殊配置。
從redis配置
修改從 redis 服務器上的 redis.conf 文件,添加 slaveof 主 redisip 主 redis 端口。
salveof 192.168.3.88 6379
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(); }
參考文章 : https://blog.csdn.net/hellozp...
<!-- Redis --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
@EnableCaching
添加緩存
@Cacheable(cacheNames = "product", key = "123") 若是不填 key ,默認的 key 是當前的方法名
對象沒有序列化錯誤
讓對象實現 Serializable
更新緩存
@CachePut(cacheNames = "prodcut", key = "123") 做用和@Cacheable 相似
刪除緩存
@CacheEvict(cacheNames = "prodcut", key = "123")
cacheNames
也能夠統一寫在類上面, @CacheConfig(cacheNames = "product")
,具體的方法上就不用寫啦。