Redis
- Redis命令描述
Redis 命令用於在 redis 服務上執行操作。
要在 redis 服務上執行命令需要一個 redis 客戶端。
Redis 客戶端在我們之前下載的的 redis 的安裝包中。
Redis支持五種數據類型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)等
-
- Redis鍵key
Redis 鍵命令用於管理 redis 的鍵
DEL key
該命令用於在 key 存在時刪除 key。
DUMP key
序列化給定 key ,並返回被序列化的值。
EXISTS key
檢查給定 key 是否存在。
EXPIRE key seconds
爲給定 key 設置過期時間(以秒計)。
PEXPIRE key milliseconds
設置 key 的過期時間以毫秒計。
不設置時間時,默認爲永久有效(-1)。爲-1時,表示永遠不會消失,-2代表無效,
redis防止內存溢出,有兩種方案,設置過期時間,2使用內存策略機制
TTL key
以秒爲單位,返回給定 key 的剩餘生存時間(TTL, time to live)
PTTL key
以毫秒爲單位返回 key 的剩餘的過期時間。
PERSIST key
移除 key 的過期時間,key 將持久保持。
KEYS pattern
查找所有符合給定模式( pattern)的 key 。
keys 通配符 獲取所有與pattern匹配的key,返回所有與該匹配
通配符:
* 代表所有
? 表示代表一個字符
修改Key的名稱
MOVE key db
將當前數據庫的 key 移動到給定的數據庫 db 當中
有多個數據庫。默認時一個,最多有16個,可以在配置文件中配置。 select 1 打開第一個數據庫
TYPE key
返回 key 所儲存的值的類型
-
- 應用場景
EXPIRE key seconds
1、限時的優惠活動信息
查看key是否存在,存在即優惠活動還在,不在證明優惠活動已取消
2、網站數據緩存(對於一些需要定時更新的數據,例如:積分排行榜)
3、手機驗證碼
4、限制網站訪客訪問頻率(例如:1分鐘最多訪問10次)
設置一個key,記錄次數,當次數訪問10次還是錯了,設置一個過期時間5分鐘,然後返回提示:5分鐘後重新登陸
再次登陸時,判斷是否有key,key 的時間是多少,返回信息
-
- Key的命名建議
redis單個key 存入512M大小
1.key不要太長,儘量不要超過1024字節,這不僅消耗內存,而且會降低查找的效率;
2.key也不要太短,太短的話,key的可讀性會降低;
3.在一個項目中,key最好使用統一的命名模式,例如user:123:password;
user:1:name 大大
user:2:name 李明
4.key名稱區分大小寫
- Redis數據類型
- String
- 簡介
- String
string是redis最基本的類型,一個key對應一個value。
string類型是二進制安全的。意思是redis的string可以包含任何數據。比如jpg圖片或者序列化的對象 。
string類型是Redis最基本的數據類型,一個鍵最大能存儲512MB。
二進制安全是指,在傳輸數據時,保證二進制數據的信息安全,也就是不被篡改、破譯等,如果被攻擊,能夠及時檢測出來
二進制安全特點:
1、編碼、解碼發生在客戶端完成,執行效率高
2、不需要頻繁的編解碼,不會出現亂碼
-
-
- String命令
-
賦值語法:
SET KEY_NAME VALUE
Redis SET 命令用於設置給定 key 的值。如果 key 已經存儲值, SET 就覆寫舊值,且無視類型
SETNX key value //解決分佈式鎖 方案之一
只有在 key 不存在時設置 key 的值。Setnx(SET if Not eXists) 命令在指定的 key 不存在時,爲 key 設置指定的值
MSET key value [key value ...]
同時設置一個或多個 key-value 對
取值語法:
GET KEY_NAME
Redis GET命令用於獲取指定 key 的值。如果 key 不存在,返回 nil 。如果key 儲存的值不是字符串類型,返回一個錯誤。
GETRANGE key start end
用於獲取存儲在指定 key 中字符串的子字符串。字符串的截取範圍由 start 和 end 兩個偏移量決定(包括 start 和 end 在內)
set gradname java1802
getrange gradname 0 3
---> java
GETBIT key offset
對 key 所儲存的字符串值,獲取指定偏移量上的位(bit)
MGET key1 [key2..]
獲取所有(一個或多個)給定 key 的值
GETSET語法: GETSET KEY_NAME VALUE
Getset 命令用於設置指定 key 的值,並返回 key 的舊值,當 key 不存在時,返回 nil
STRLEN key
返回 key 所儲存的字符串值的長度
刪除語法:
DEL KEY_Name
刪除指定的KEY,如果存在,返回值數字類型。
自增/自減:
INCR KEY_Name
Incr 命令將 key 中儲存的數字值增1。如果 key 不存在,那麼 key 的值會先被初始化爲 0 ,然後再執行 INCR 操作
自增:INCRBY KEY_Name 增量值
Incrby 命令將 key 中儲存的數字加上指定的增量值
自減:DECR KEY_NAME 或 DECYBY KEY_NAME 減值
decR 命令將 key 中儲存的數字減1
字符串拼接:APPEND KEY_NAME VALUE
Append 命令用於爲指定的 key 追加至未尾,如果不存在,爲其賦值
-
-
- 應用場景:
-
1、String通常用於保存單個字符串或JSON字符串數據
2、因String是二進制安全的,所以你完全可以把一個圖片文件的內容作爲字符串來存儲
3、計數器(常規key-value緩存應用。常規計數: 微博數, 粉絲數)
INCR等指令本身就具有原子操作的特性,所以我們完全可以利用redis的INCR、INCRBY、DECR、DECRBY等指令來實現原子計數的效果。假如,在某種場景下有3個客戶端同時讀取了mynum的值(值爲2),然後對其同時進行了加1的操作,那麼,最後mynum的值一定是5。
不少網站都利用redis的這個特性來實現業務上的統計計數需求。
-
- 哈希(Hash)
- 簡介
- 哈希(Hash)
string:字符串類型數據(json)
hash:一個對象
Redis hash 是一個string類型的field和value的映射表,hash特別適合用於存儲對象。 Redis 中每個 hash 可以存儲 232 - 1 鍵值對(40多億)
可以看成具有KEY和VALUE的MAP容器,該類型非常適合於存儲值對象的信息,
如:uname,upass,age等。該類型的數據僅佔用很少的磁盤空間(相比於JSON)
-
-
- Hash命令
-
賦值語法:
HSET KEY FIELD VALUE //爲指定的KEY,設定FILD/VALUE
HMSET KEY FIELD VALUE [FIELD1,VALUE1]…… 同時將多個 field-value (域-值)對設置到哈希表 key 中。
取值語法:
HGET KEY FIELD //獲取存儲在HASH中的值,根據FIELD得到VALUE
HMGET key field[field1] //獲取key所有給定字段的值
HGETALL key //返回HASH表中所有的字段和值
HKEYS key //獲取所有哈希表中的字段
HLEN key //獲取哈希表中字段的數量
刪除語法:
HDEL KEY field1[field2] //刪除一個或多個HASH表字段
其它語法:
HSETNX key field value
只有在字段 field 不存在時,設置哈希表字段的值
HINCRBY key field increment
爲哈希表 key 中的指定字段的整數值加上增量 increment 。
HINCRBYFLOAT key field increment
爲哈希表 key 中的指定字段的浮點數值加上增量 increment 。
HEXISTS key field //查看哈希表 key 中,指定的字段是否存在
-
-
- 應用場景:
-
Hash的應用場景:(存儲一個用戶信息對象數據)
- 常用於存儲一個對象
- 爲什麼不用string存儲一個對象?
hash是最接近關係數據庫結構的數據類型,可以將數據庫一條記錄或程序中一個對象轉換成hashmap存放在redis中。
用戶ID爲查找的key,存儲的value用戶對象包含姓名,年齡,生日等信息,如果用普通的key/value結構來存儲,主要有以下2種存儲方式:
第一種方式將用戶ID作爲查找key,把其他信息封裝成一個對象以序列化的方式存儲,這種方式的缺點是,增加了序列化/反序列化的開銷,並且在需要修改其中一項信息時,需要把整個對象取回,並且修改操作需要對併發進行保護,引入CAS等複雜問題。
第二種方法是這個用戶信息對象有多少成員就存成多少個key-value對兒,用用戶ID+對應屬性的名稱作爲唯一標識來取得對應屬性的值,雖然省去了序列化開銷和併發問題,但是用戶ID爲重複存儲,如果存在大量這樣的數據,內存浪費還是非常可觀的。
總結:
Redis提供的Hash很好的解決了這個問題,Redis的Hash實際是內部存儲的Value爲一個HashMap,並提供了直接存取這個Map成員的接口
- Java連接Redis
在官方網站列一些Java客戶端訪問,有:Jedis/Redisson/Jredis/JDBC-Redis等,其中官方推薦使用Jedis和Redisson。常用Jedis。
開始在 Java 中使用 Redis 前, 我們需要確保已經安裝了 redis 服務及 Java redis 驅動,且你的機器上能正常使用 Java。 Java的安裝配置可以參考我們的 Java開發環境配置 接下來讓我們安裝 Java redis 驅動
安裝相應JAR:
<!-- Redis --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.4.2</version> </dependency> |
-
- 開啓端口防火牆
開放端口(如下命令只針對Centos7以上)
查看已經開放的端口:firewall-cmd --list-ports
開啓端口:
firewall-cmd --zone=public --add-port=6379/tcp --permanent
重啓防火牆
firewall-cmd --reload #重啓
-
- Java操作Redis 設置密碼
這個問題是由於Redis沒有配置密碼的原因導致的,只需要爲redis設置密碼即可
config get requirepass: 這是查詢redis是否配置密碼,如果返回爲空,則表明未配置密碼
config set requirepass “guoweixin”這是將redis的密碼設置爲“guoweixin”
客戶端登錄:用redis-cli 密碼登陸(redis-cli -a password)
-
- Java Jedis連接池優化
-
- 案例:Jedis操作Redis string 和hash
----------------------------
- RedisTemplate
- 簡介
Spring data 提供了RedisTemplate模版
它封裝了redis連接池管理的邏輯,業務代碼無須關心獲取,釋放連接邏輯;spring redis同時支持了Jedis,Jredis,rjc 客戶端操作;
在RedisTemplate中提供了幾個常用的接口方法的使用,分別是
-
- Spring data 使用RedisTemplate模版
1、jar:Redis和Spring整合
<!-- redis 和Spring整合 --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.4.2</version> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>1.4.2.RELEASE</version> </dependency> |
2、對應實體Bean進行序列化操作
3、編寫相應配置文件
利用RedisTemplate操作Redis
-
- JedisPoolConfig常用配置信息
|
-
- Redis客戶端工具
https://redisdesktop.com/download
-
-
- 查看Redis客戶端
-
原因 :把任何數據保存到redis中時,都需要進行序列化,默認使用JdkSerializationRedisSerializer進行數據序列化。
所有的key和value還有hashkey和hashvalue的原始字符前,都加了一串字符。
- 案例作業
- 限制登錄功能
用戶在2分鐘內,僅允許輸入錯誤密碼5次。如果超過次數,限制其登錄1小時。(要求每登錄失敗時,都要給相應提式)
-
-
- 基本代碼1:
-
-
-
- 完整代碼2:
-
需求分析:
業務層編寫
Controller層
-
- 手機驗證功能
用戶在客戶端輸入手機號,點擊發送後隨機生成4位數字碼。有效期爲90秒。
輸入驗證碼,點擊驗證,返回成功或者失敗。且每個手機號在一天內只能驗證3次。並給相應信息提示