2redis常用命令

Redis

  1. Redis命令描述

Redis 命令用於在 redis 服務上執行操作。

要在 redis 服務上執行命令需要一個 redis 客戶端。

Redis 客戶端在我們之前下載的的 redis 的安裝包中。

 

 

 

Redis支持五種數據類型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)等

 

    1. 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,返回所有與該匹配

  通配符:

         *  代表所有

         ? 表示代表一個字符

 

RENAME key newkey 

修改Key的名稱

 

MOVE key db 
將當前數據庫的 key 移動到給定的數據庫 db 當中

有多個數據庫。默認時一個,最多有16個,可以在配置文件中配置。 select 1  打開第一個數據庫

TYPE key 
返回 key 所儲存的值的類型

 

 

    1. 應用場景

EXPIRE key seconds
1、限時的優惠活動信息

查看key是否存在,存在即優惠活動還在,不在證明優惠活動已取消

2、網站數據緩存(對於一些需要定時更新的數據,例如:積分排行榜)

3、手機驗證碼

4、限制網站訪客訪問頻率(例如:1分鐘最多訪問10次)

設置一個key,記錄次數,當次數訪問10次還是錯了,設置一個過期時間5分鐘,然後返回提示:5分鐘後重新登陸

再次登陸時,判斷是否有key,key 的時間是多少,返回信息

 

    1. Key的命名建議

redis單個key 存入512M大小

1.key不要太長,儘量不要超過1024字節,這不僅消耗內存,而且會降低查找的效率;
2.key也不要太短,太短的話,key的可讀性會降低;
3.在一個項目中,key最好使用統一的命名模式,例如user:123:password;

user:1:name  大大

user:2:name  李明

4.key名稱區分大小寫

  1. Redis數據類型
    1. String
      1. 簡介

string是redis最基本的類型,一個key對應一個value。

string類型是二進制安全的。意思是redis的string可以包含任何數據。比如jpg圖片或者序列化的對象 。

string類型是Redis最基本的數據類型,一個鍵最大能存儲512MB。

 

 二進制安全是指,在傳輸數據時,保證二進制數據的信息安全,也就是不被篡改、破譯等,如果被攻擊,能夠及時檢測出來

 

二進制安全特點:

    1、編碼、解碼發生在客戶端完成,執行效率高

     2、不需要頻繁的編解碼,不會出現亂碼

 

 

 

      1. String命令

賦值語法:

 SET KEY_NAME   VALUE

Redis SET 命令用於設置給定 key 的值。如果 key 已經存儲值, SET 就覆寫舊值,且無視類型

 

SETNX key value  //解決分佈式鎖 方案之一

只有在 key 不存在時設置 key 的值。SetnxSET 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. 應用場景:

1、String通常用於保存單個字符串或JSON字符串數據

2String是二進制安全的,所以你完全可以把一個圖片文件的內容作爲字符串來存儲

3計數器常規key-value緩存應用。常規計數: 微博數, 粉絲數)

INCR等指令本身就具有原子操作的特性,所以我們完全可以利用redisINCRINCRBYDECRDECRBY等指令來實現原子計數的效果。假如,在某種場景下有3個客戶端同時讀取了mynum的值(值爲2),然後對其同時進行了加1的操作,那麼,最後mynum的值一定是5

不少網站都利用redis的這個特性來實現業務上的統計計數需求。

 

    1. 哈希(Hash)
      1. 簡介

 

string:字符串類型數據(json)

hash:一個對象

 

Redis hash 是一個string類型的field和value的映射表,hash特別適合用於存儲對象Redis 中每個 hash 可以存儲 232 - 1 鍵值對(40多億)

 可以看成具有KEY和VALUE的MAP容器,該類型非常適合於存儲值對象的信息,

如:uname,upass,age等。該類型的數據僅佔用很少的磁盤空間(相比於JSON)

 

      1. 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 中,指定的字段是否存在

 

 

 

      1. 應用場景:

 

Hash的應用場景:(存儲一個用戶信息對象數據)

  1. 常用於存儲一個對象
  2. 爲什麼不用string存儲一個對象?

hash是最接近關係數據庫結構的數據類型,可以將數據庫一條記錄或程序中一個對象轉換成hashmap存放在redis中。

用戶ID爲查找的key,存儲的value用戶對象包含姓名,年齡,生日等信息,如果用普通的key/value結構來存儲,主要有以下2種存儲方式:

    第一種方式將用戶ID作爲查找key,把其他信息封裝成一個對象以序列化的方式存儲,這種方式的缺點是,增加了序列化/反序列化的開銷,並且在需要修改其中一項信息時,需要把整個對象取回,並且修改操作需要對併發進行保護,引入CAS等複雜問題

    第二種方法是這個用戶信息對象有多少成員就存成多少個key-value對兒,用用戶ID+對應屬性的名稱作爲唯一標識來取得對應屬性的值,雖然省去了序列化開銷和併發問題,但是用戶ID爲重複存儲,如果存在大量這樣的數據,內存浪費還是非常可觀的。

總結:

Redis提供的Hash很好的解決了這個問題,Redis的Hash實際是內部存儲的Value爲一個HashMap,並提供了直接存取這個Map成員的接口

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

 

    1. 開啓端口防火牆

 

開放端口(如下命令只針對Centos7以上)

    查看已經開放的端口:firewall-cmd --list-ports

    開啓端口:

            firewall-cmd --zone=public --add-port=6379/tcp --permanent

重啓防火牆

      firewall-cmd --reload #重啓

 

    1. Java操作Redis 設置密碼

這個問題是由於Redis沒有配置密碼的原因導致的,只需要爲redis設置密碼即可

config get requirepass: 這是查詢redis是否配置密碼,如果返回爲空,則表明未配置密碼

config set requirepass “guoweixin”這是將redis的密碼設置爲“guoweixin”

客戶端登錄用redis-cli 密碼登陸(redis-cli -a  password

 

    1. Java Jedis連接池優化

 

    1. 案例:Jedis操作Redis string 和hash

 

----------------------------

 

  1. RedisTemplate
    1. 簡介

Spring data 提供了RedisTemplate模版

它封裝了redis連接池管理的邏輯,業務代碼無須關心獲取,釋放連接邏輯;spring redis同時支持了Jedis,Jredis,rjc 客戶端操作;

在RedisTemplate中提供了幾個常用的接口方法的使用,分別是

 

 

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

 

    1. JedisPoolConfig常用配置信息

  • #最大空閒數 
  • redis.maxIdle=300 
  • #連接池的最大數據庫連接數。設爲0表示無限制,如果是jedis 2.4以後用redis.maxTotal 
  • #redis.maxActive=600 
  • #控制一個pool可分配多少個jedis實例,用來替換上面的redis.maxActive,如果是jedis 2.4以後用該屬性 
  • redis.maxTotal=1000 
  • #最大建立連接等待時間。如果超過此時間將接到異常。設爲-1表示無限制。 
  • redis.maxWaitMillis=1000 
  • #連接的最小空閒時間 默認1800000毫秒(30分鐘) 
  • redis.minEvictableIdleTimeMillis=300000 
  • #每次釋放連接的最大數目,默認3 
  • redis.numTestsPerEvictionRun=1024 
  • #逐出掃描的時間間隔(毫秒) 如果爲負數,則不運行逐出線程, 默認-1 
  • redis.timeBetweenEvictionRunsMillis=30000 
  • #是否在從池中取出連接前進行檢驗,如果檢驗失敗,則從池中去除連接並嘗試取出另一個 
  • redis.testOnBorrow=true 
  • #在空閒時檢查有效性, 默認false 
  • redis.testWhileIdle=true

 

    1. Redis客戶端工具

https://redisdesktop.com/download

      1. 查看Redis客戶端

原因 :把任何數據保存到redis中時,都需要進行序列化,默認使用JdkSerializationRedisSerializer進行數據序列化。

所有的key和value還有hashkey和hashvalue的原始字符前,都加了一串字符。

  1. 案例作業
    1. 限制登錄功能

用戶在2分鐘內,僅允許輸入錯誤密碼5次。如果超過次數,限制其登錄1小時。(要求每登錄失敗時,都要給相應提式)

 

 

 

      1. 基本代碼1:

 

      1. 完整代碼2:

需求分析:

業務層編寫

 

 

Controller層

    1. 手機驗證功能

用戶在客戶端輸入手機號,點擊發送後隨機生成4位數字碼。有效期爲90秒。

輸入驗證碼,點擊驗證,返回成功或者失敗。且每個手機號在一天內只能驗證3次。並給相應信息提示

 

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