Redis教程(全面实战教程)
【訂閱專欄合集,作者所有付費文章都能看】
文章目錄
- 1.緩存的需求
- 1.1目前緩存的主流技術
- 1.2什么是緩存?
- 2.Redis
- 2.1.NoSQL
- 2.2.主流的NoSQL產品
- 2.3.Redis簡介
- 2.4.歷史與發展
- 2.5.Redis的特性
- 2.6.Redis版本說明
- 2.7.下載Redis
- 2.8.Redis的安裝
- 2.8.1.安裝文件
- 2.8.2.安裝方式一
- 2.8.3.安裝方式二(安裝到系統服務)
- 2.8.4.32位操作系統安裝
- 2.8.5.注意事項
- 2.9.Redis-cli使用
- 2.9.1.redis-cli的使用之發送命令
- 2.9.2.redis-cli的使用之命令返回值
- 2.10.Redis的多數據庫
- 2.10.1.配置數據庫數量
- 2.11.Redis的基本命令
- 2.11.1.KEYS
- 2.11.2.EXISTS
- 2.11.3.DEL
- 2.11.4.TYPE
- 2.11.5.HELP
- 3.Redis的字符串數據類型(String)
- 3.1.字符串類型
- 3.2.GET、SET
- 3.3.INCR
- 3.4.INCRBY
- 3.5.DECR、DECRBY
- 3.6.APPEND
- 3.7.STRLEN
- 3.8.MSET、MGET
- 4. 列表類型(List)
- 5.Redis 集合(Set)
- 5.1.set
- 5.2.有序集合(sorted set)
- 6.Redis的Hash數據結構
- 6.1.數據結構
- 6.2.基本操作
- 6.3.判斷是否存在和選擇性插入
- 6.4.Hash的自增長
- 6.5.只獲取字段名或字段值
- 6.6.獲取字段數量
- 7.Redis之生存時間
- 7.1.設置生存時間
- 7.2.清除生存時間
- 8.Redis事務
- 8.1.11.1、Redis事務
- 8.2.11.2、實例
- 8.3.11.3、Redis 事務命令
- 9.客戶端
- 9.1.支持的語言
- 9.2.Jedis
- 9.3.Jedis的使用
- 9.3.1.導入依賴
- 9.3.2.簡單示例
- 9.3.3.連接池使用
- 9.3.4.分片式集群
- 9.3.5.分片式集群的使用
- 10.Spring項目集成Redis
- 10.1.1.Spring和Jedis的整合
- 10.1.2.封裝RedisService
- 10.1.3.優化RedisService
- 10.1.4.測試RedisService
- 11.SpringBoot集成Redis
- 11.1.引入maven依賴
- 11.2.新增配置文件信息
- 11.3.Java代碼
- 11.4.單元測試
- 12.基于Redis的互聯網API冪等設計
- 13.基于redis的分布式鎖
推薦【Kafka教程】https://bigbird.blog.csdn.net/article/details/108770504
推薦【rabbitmq教程】https://bigbird.blog.csdn.net/article/details/81436980
推薦【Flink教程】https://blog.csdn.net/hellozpc/article/details/109413465
推薦【SpringBoot教程】https://blog.csdn.net/hellozpc/article/details/107095951
推薦【SpringCloud教程】https://blog.csdn.net/hellozpc/article/details/83692496
推薦【Mybatis教程】https://blog.csdn.net/hellozpc/article/details/80878563
推薦【SnowFlake教程】https://blog.csdn.net/hellozpc/article/details/108248227
推薦【并發限流教程】https://blog.csdn.net/hellozpc/article/details/107582771
推薦【JVM面試與調優教程】https://bigbird.blog.csdn.net/article/details/113888604
1.緩存的需求
前端頁面廣告位數據無需每次查詢后臺系統的接口,可以在前臺系統添加緩存,提高訪問首頁的速度。
電商網站首頁左側商品類目一欄的數據也可以緩存起來,不用每次打開首頁都去數據庫讀取數據,讀取數據庫IO開銷大。
解決方案:使用緩存。
1.1目前緩存的主流技術
1、Redis
2、Memcached
二者誰的性能更高?
1、單純從緩存命中的角度來說,是Memcached要高,Redis和Memcache的差距不大
2、但是,Redis提供的功能更加的強大
二者的區別是什么?
1、Memcache是多線程
2、Redis是單線程
1.2什么是緩存?
2.Redis
2.1.NoSQL
2.2.主流的NoSQL產品
2.3.Redis簡介
Redis官網: http://redis.io/
redis是Nosql數據庫中使用較為廣泛的非關系型內存數據庫,redis內部是一個key-value存儲系統。它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set –有序集合)和hash(哈希類型,類似于Java中的map)。Redis基于內存運行并支持持久化的NoSQL數據庫,是當前最熱門的NoSql數據庫之一,也被人們稱為數據結構存儲服務務器。
2.4.歷史與發展
2.5.Redis的特性
與其他NoSQL數據庫相比,Redis有著更為復雜的數據結構并且提供對他們的原子性操作,這是一個不同于其他數據庫的進化路徑。Redis的數據類型都是基于基本數據結構的,同時對程序員透明,無需進行額外的抽象。
Redis運行在內存中但是可以持久化到磁盤,所以在對不同數據集進行高速讀寫時需要權衡內存,因為數據量不能大于硬件內存。內存數據庫的另一個優點是,相比在磁盤上相同的復雜的數據結構,在內存中操作起來非常簡單,這樣Redis可以做很多內部復雜性很強的事情。同時,在磁盤格式方面他們是緊湊的以追加的方式產生的,因為他們并不需要進行隨機訪問。
Redis特性:
性能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s 。
豐富的數據類型 – Redis支持二進制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數據類型操作。
原子 – Redis的所有操作都是原子性的,同時Redis還支持對幾個操作全并后的原子性執行。
其它特性 – Redis還支持 publish/subscribe, 通知, key 過期等等特性。
2.6.Redis版本說明
2.7.下載Redis
Linux版本 2.8.11 :
http://download.redis.io/releases/redis-2.8.11.tar.gz
Linux所有版本
http://download.redis.io/releases/
Windows(64位)版本 2.8.9 :
https://github.com/MSOpenTech/redis/blob/2.8/bin/release/redis-2.8.9.zip?raw=true
Windows(32位)版本 2.6 :
https://github.com/MSOpenTech/redis/blob/2.6/bin/release/redisbin.zip?raw=true
Windows所有版本:
https://github.com/MicrosoftArchive/redis/releases
2.8.Redis的安裝
2.8.1.安裝文件
2.8.2.安裝方式一
雙擊打開redis-server.exe即可:
測試:
雙擊打開redis-cli.exe
2.8.3.安裝方式二(安裝到系統服務)
先刪除原有的系統服務:
進到redis目錄執行如下命令安裝服務:
2.8.4.32位操作系統安裝
只能通過雙擊打開redis-server.exe啟動,不能安裝到系統服務。
2.8.5.注意事項
由于文件系統非NTFS,導致Redis啟動失敗:
限制Redis的最大內存(redis.windows-service.conf):
2.9.Redis-cli使用
2.9.1.redis-cli的使用之發送命令
從windows命令行進入到redis安裝目錄執行如下命令:
2.9.2.redis-cli的使用之命令返回值
2.10.Redis的多數據庫
FLUSHALL – 清空所有數據庫的所有數據
FLUSHDB – 清空當前所在數據庫的數據
2.10.1.配置數據庫數量
2.11.Redis的基本命令
2.11.1.KEYS
2.11.2.EXISTS
2.11.3.DEL
2.11.4.TYPE
2.11.5.HELP
HELP 空格 tab鍵
3.Redis的字符串數據類型(String)
3.1.字符串類型
3.2.GET、SET
3.3.INCR
3.4.INCRBY
3.5.DECR、DECRBY
3.6.APPEND
3.7.STRLEN
3.8.MSET、MGET
下表列出了一些用于在Redis中管理字符串的基本命令。
編號 命令 描述說明
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 使用鍵和到期時間來設置值
9 SETNX key value 設置鍵的值,僅當鍵不存在時
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 將指定值附加到鍵
4. 列表類型(List)
Redis列表是簡單的字符串列表,按照插入順序排序。你可以添加一個元素到列表的頭部(左邊)或者尾部(右邊)
一個列表最多可以包含 232 - 1 個元素 (4294967295, 每個列表超過40億個元素)。
redis 127.0.0.1:6379> LPUSH runoobkey redis
(integer) 1
redis 127.0.0.1:6379> LPUSH runoobkey mongodb
(integer) 2
redis 127.0.0.1:6379> LPUSH runoobkey mysql
(integer) 3
redis 127.0.0.1:6379> LRANGE runoobkey 0 10
Redis 列表命令
下表列出了列表相關的基本命令:
序號 命令及描述
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
為已存在的列表添加值
5.Redis 集合(Set)
5.1.set
Redis的Set是string類型的無序集合。集合成員是唯一的,這就意味著集合中不能出現重復的數據。
Redis 中 集合是通過哈希表實現的,所以添加,刪除,查找的復雜度都是O(1)。
集合中最大的成員數為 232 - 1 (4294967295, 每個集合可存儲40多億個成員)。
實例
redis 127.0.0.1:6379> SADD runoobkey2 redis
(integer) 1
redis 127.0.0.1:6379> SADD runoobkey2 mongodb
(integer) 1
redis 127.0.0.1:6379> SADD runoobkey2 mysql
(integer) 1
redis 127.0.0.1:6379> SADD runoobkey mysql
(integer) 0
redis 127.0.0.1:6379> SMEMBERS runoobkey
在以上實例中我們通過 SADD 命令向名為 runoobkey 的集合插入的三個元素。
Redis 集合命令
下表列出了 Redis 集合基本命令:
序號 命令及描述
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]
迭代集合中的元素
5.2.有序集合(sorted set)
Redis 有序集合和集合一樣也是string類型元素的集合,且不允許重復的成員。
不同的是每個元素都會關聯一個double類型的分數。redis正是通過分數來為集合中的成員進行從小到大的排序。
有序集合的成員是唯一的,但分數(score)卻可以重復。
集合是通過哈希表實現的,所以添加,刪除,查找的復雜度都是O(1)。 集合中最大的成員數為 232 - 1 (4294967295, 每個集合可存儲40多億個成員)。
實例
redis 127.0.0.1:6379> ZADD runoobkey 1 redis
(integer) 1
redis 127.0.0.1:6379> ZADD runoobkey 2 mongodb
(integer) 1
redis 127.0.0.1:6379> ZADD runoobkey 3 mysql
(integer) 1
redis 127.0.0.1:6379> ZADD runoobkey 3 mysql
(integer) 0
redis 127.0.0.1:6379> ZADD runoobkey 4 mysql
(integer) 0
redis 127.0.0.1:6379> ZRANGE runoobkey 0 10 WITHSCORES
在以上實例中我們通過命令 ZADD 向 redis 的有序集合中添加了三個值并關聯上分數。
Redis 有序集合命令
下表列出了 redis 有序集合的基本命令:
序號 命令及描述
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]
迭代有序集合中的元素(包括元素成員和元素分值)
6.Redis的Hash數據結構
6.1.數據結構
Redis hash 是一個string類型的field和value的映射表,hash特別適合用于存儲對象。
Redis 中每個 hash 可以存儲 232 - 1 鍵值對(40多億)。
Map<String,Map<String,String>>
6.2.基本操作
6.3.判斷是否存在和選擇性插入
6.4.Hash的自增長
6.5.只獲取字段名或字段值
6.6.獲取字段數量
下表列出了 redis hash 基本的相關命令:
序號 命令及描述
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]
迭代哈希表中的鍵值對。
7.Redis之生存時間
7.1.設置生存時間
TTL返回值:
大于0的數字:剩余生存時間,單位為秒
-1 : 沒有生存時間,永久存儲
-2 : 數據已經被刪除
7.2.清除生存時間
8.Redis事務
8.1.11.1、Redis事務
Redis 事務可以一次執行多個命令, 并且帶有以下兩個重要的保證:
事務是一個單獨的隔離操作:事務中的所有命令都會序列化、按順序地執行。事務在執行的過程中,不會被其他客戶端發送來的命令請求所打斷。
事務是一個原子操作:事務中的命令要么全部被執行,要么全部都不執行。
一個事務從開始到執行會經歷以下三個階段:
開始事務。
命令入隊。
執行事務。
8.2.11.2、實例
以下是一個事務的例子, 它先以 MULTI 開始一個事務, 然后將多個命令入隊到事務中, 最后由 EXEC 命令觸發事務, 一并執行事務中的所有命令:
redis 127.0.0.1:6379> MULTI
OK
redis 127.0.0.1:6379> SET book-name “Mastering C++ in 21 days”
QUEUED
redis 127.0.0.1:6379> GET book-name
QUEUED
redis 127.0.0.1:6379> SADD tag “C++” “Programming” “Mastering Series”
QUEUED
redis 127.0.0.1:6379> SMEMBERS tag
QUEUED
redis 127.0.0.1:6379> EXEC
8.3.11.3、Redis 事務命令
下表列出了 redis 事務的相關命令:
序號 命令及描述
1 DISCARD
取消事務,放棄執行事務塊內的所有命令。
2 EXEC
執行所有事務塊內的命令。
3 MULTI
標記一個事務塊的開始。
4 UNWATCH
取消 WATCH 命令對所有 key 的監視。
5 WATCH key [key …]
監視一個(或多個) key ,如果在事務執行之前這個(或這些) key 被其他命令所改動,那么事務將被打斷。
9.客戶端
9.1.支持的語言
9.2.Jedis
9.3.Jedis的使用
(項目下載地址https://download.csdn.net/download/zpcandzhj/10571317)
9.3.1.導入依賴
<dependencies><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> </dependencies>9.3.2.簡單示例
(在運行java程序之前確保redis服務器已經啟動!)
import redis.clients.jedis.Jedis; /*** @author Evan*/ public class JedisDemo {public static void main(String[] args) {// 構造jedis對象Jedis jedis = new Jedis("127.0.0.1", 6379);// 向redis中添加數據jedis.set("name", "鳥鵬");// 從redis中讀取數據String value = jedis.get("name");System.out.println(value);// 關閉連接jedis.close();} }運行之后查看redis中的值: 127.0.0.1:6379> keys * 1) "name"9.3.3.連接池使用
import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig;/*** @author Evan*/ public class JedisPoolDemo {public static void main(String[] args) {// 構建連接池配置信息JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();// 設置最大連接數jedisPoolConfig.setMaxTotal(50);// 構建連接池JedisPool jedisPool = new JedisPool(jedisPoolConfig, "127.0.0.1", 6379);// 從連接池中獲取連接Jedis jedis = jedisPool.getResource();// 讀取數據System.out.println(jedis.get("name"));// 將連接還回到連接池中jedisPool.returnResource(jedis);// 釋放連接池jedisPool.close();} }9.3.4.分片式集群
存在的問題:無法動態增加減少服務節點。
9.3.5.分片式集群的使用
import redis.clients.jedis.JedisPoolConfig; import redis.clients.jedis.JedisShardInfo; import redis.clients.jedis.ShardedJedis; import redis.clients.jedis.ShardedJedisPool;import java.util.ArrayList; import java.util.List;/*** 集群式的連接池*/ public class ShardedJedisPoolDemo {public static void main(String[] args) {// 構建連接池配置信息JedisPoolConfig poolConfig = new JedisPoolConfig();// 設置最大連接數poolConfig.setMaxTotal(50);// 定義集群信息List<JedisShardInfo> shards = new ArrayList<JedisShardInfo>();shards.add(new JedisShardInfo("127.0.0.1", 6379));//shards.add(new JedisShardInfo("192.168.48.22", 6379));// 定義集群連接池ShardedJedisPool shardedJedisPool = new ShardedJedisPool(poolConfig, shards);ShardedJedis shardedJedis = null;try {// 從連接池中獲取到jedis分片對象shardedJedis = shardedJedisPool.getResource();// 從redis中獲取數據String value = shardedJedis.get("name");System.out.println(value);} catch (Exception e) {e.printStackTrace();} finally {if (null != shardedJedis) {// 關閉,檢測連接是否有效,有效則放回到連接池中,無效則重置狀態shardedJedis.close();}}// 關閉連接池shardedJedisPool.close();} }10.Spring項目集成Redis
10.1.1.Spring和Jedis的整合
applicationContext.xml
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"><!-- 開啟注解 --><context:component-scan base-package="com.zpc.redis"></context:component-scan><!--連接池的配置--><bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"><property name="maxTotal" value="10"/></bean><!--分片式連接池的配置--><bean class="redis.clients.jedis.ShardedJedisPool"><constructor-arg index="0" ref="jedisPoolConfig"/><constructor-arg index="1"><list><bean class="redis.clients.jedis.JedisShardInfo"><constructor-arg index="0" value="127.0.0.1"/><constructor-arg index="1" value="6379"/></bean></list></constructor-arg></bean> </beans>10.1.2.封裝RedisService
package com.zpc.redis.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import redis.clients.jedis.ShardedJedis; import redis.clients.jedis.ShardedJedisPool;@Service public class RedisService {@Autowiredprivate ShardedJedisPool shardedJedisPool;/*** 執行set操作** @param key* @param value* @return*/public String set(String key, String value) {ShardedJedis shardedJedis = null;try {// 從連接池中獲取到jedis分片對象shardedJedis = shardedJedisPool.getResource();return shardedJedis.set(key, value);} finally {if (null != shardedJedis) {// 關閉,檢測連接是否有效,有效則放回到連接池中,無效則重置狀態shardedJedis.close();}}}/*** 執行get操作** @param key* @return*/public String get(String key) {ShardedJedis shardedJedis = null;try {// 從連接池中獲取到jedis分片對象shardedJedis = shardedJedisPool.getResource();return shardedJedis.get(key);} finally {if (null != shardedJedis) {// 關閉,檢測連接是否有效,有效則放回到連接池中,無效則重置狀態shardedJedis.close();}}} }10.1.3.優化RedisService
定義接口:
public interface Function<T, E> {T callback(E e); }RedisService2的實現:
package com.zpc.redis.service;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import redis.clients.jedis.ShardedJedis; import redis.clients.jedis.ShardedJedisPool;@Service public class RedisService2 {@Autowiredprivate ShardedJedisPool shardedJedisPool;private <T> T execute(Function<T, ShardedJedis> fun) {ShardedJedis shardedJedis = null;try {// 從連接池中獲取到jedis分片對象shardedJedis = shardedJedisPool.getResource();return fun.callback(shardedJedis);} finally {if (null != shardedJedis) {// 關閉,檢測連接是否有效,有效則放回到連接池中,無效則重置狀態shardedJedis.close();}}}/*** 執行set操作** @param key* @param value* @return*/public String set(final String key, final String value) {return this.execute(new Function<String, ShardedJedis>() {@Overridepublic String callback(ShardedJedis e) {return e.set(key, value);}});}/*** 執行get操作** @param key* @return*/public String get(final String key) {return this.execute(new Function<String, ShardedJedis>() {@Overridepublic String callback(ShardedJedis e) {return e.get(key);}});}/*** 執行刪除操作** @param key* @return*/public Long del(final String key) {return this.execute(new Function<Long, ShardedJedis>() {@Overridepublic Long callback(ShardedJedis e) {return e.del(key);}});}/*** 設置生存時間,單位為:秒** @param key* @param seconds* @return*/public Long expire(final String key, final Integer seconds) {return this.execute(new Function<Long, ShardedJedis>() {@Overridepublic Long callback(ShardedJedis e) {return e.expire(key, seconds);}});}/*** 執行set操作并且設置生存時間,單位為:秒** @param key* @param value* @return*/public String set(final String key, final String value, final Integer seconds) {return this.execute(new Function<String, ShardedJedis>() {@Overridepublic String callback(ShardedJedis e) {String str = e.set(key, value);e.expire(key, seconds);return str;}});}}10.1.4.測試RedisService
import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = "classpath:applicationContext.xml") public class RedisServiceTest {@AutowiredRedisService redisService;@Testpublic void set() throws Exception {redisService.set("keyx", "valuex");}@Testpublic void get() throws Exception {System.out.println("\n=============res:" + redisService.get("keyx")+"\n");} }11.SpringBoot集成Redis
11.1.引入maven依賴
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.3.RELEASE</version></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies> </project>11.2.新增配置文件信息
application.properties spring.redis.database=0 spring.redis.host=127.0.0.1 spring.redis.port=6379 #spring.redis.password=123456 spring.redis.jedis.pool.max-idle=8 spring.redis.jedis.pool.min-idle=0 spring.redis.jedis.pool.max-active=8 spring.redis.edis.pool.max-wait=-1 spring.redis.timeout=500011.3.Java代碼
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service;import java.util.concurrent.TimeUnit;@Service public class RedisService {@Autowiredprivate StringRedisTemplate stringRedisTemplate;public void setStr(String key, String value) {setStr(key, value, null);}public void setStr(String key, String value, Long time) {stringRedisTemplate.opsForValue().set(key, value);if (time != null) {stringRedisTemplate.expire(key, time, TimeUnit.SECONDS);}}public Object getKey(String key) {return stringRedisTemplate.opsForValue().get(key);}public void delKey(String key) {stringRedisTemplate.delete(key);} }11.4.單元測試
import com.npbase.runner.NpRunnerApplication; import com.npbase.service.redis.RedisService; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner;/*** Created by ZHOUPENGCHENG390 on 2018/7/3.*/ @RunWith(SpringRunner.class) @SpringBootTest(classes = NpRunnerApplication.class) public class HelloControllerTest {@AutowiredRedisService redisService;@Testpublic void testRedis() {redisService.setStr("name", "鵬程");System.out.println("===========getName:" + redisService.getKey("name") + "===========\n");} }12.基于Redis的互聯網API冪等設計
在互聯網API接口中,由于網絡超時、手動刷新等經常導致客戶端重復提交數據到服務端,這就要求在設計API接口時做好冪等控制。尤其是在面向微服務架構的系統中,系統間的調用非常頻繁,如果不做好冪等性設置,輕則會導致臟數據入庫,重則導致資損。
本例基于Redis實現一個冪等控制框架。
詳見這篇博文《基于redis的API接口冪等設計》
13.基于redis的分布式鎖
詳見這篇博文:https://blog.csdn.net/hellozpc/article/details/82953590
redis集群增減機器的一致性hash算法
https://www.cnblogs.com/myseries/p/10956835.html
redis集群架構
https://www.zhihu.com/question/293357668
總結
以上是生活随笔為你收集整理的Redis教程(全面实战教程)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言 字符串转浮点型函数
- 下一篇: 自助任务平台WQ5.5.6源码对接微信带