Redis API的理解和使用

一.通用命令

在這裏插入圖片描述

  1. key key + 類通配符
    在這裏插入圖片描述 在這裏插入圖片描述

key命令一般不在生產環境使用,key多慢。

  1. dbsize
    在這裏插入圖片描述

dbsize 時間複雜度爲O1級別,可以在生產環境中使用

  1. exists
    在這裏插入圖片描述

exists 時間複雜度爲O1級別,可以在生產環境中使用

  1. del
    在這裏插入圖片描述

可以同時刪除多個

  1. expire , ttl , persist
    在這裏插入圖片描述在這裏插入圖片描述
  2. type
    在這裏插入圖片描述
  3. 時間複雜度
    在這裏插入圖片描述

二. 數據結構和內部編碼

在這裏插入圖片描述

內部有一個redisObject

在這裏插入圖片描述

目的:使用更小的空間實現更優內存使用效果

  1. 單線程

(1) 單線程模型
在這裏插入圖片描述

(2)單線程快的原因

–純內存
–非阻塞IO
–避免線程切換和競態消耗

(3)單線程注意

–一次只運行一條命令
–拒絕長(慢)命令
keys,flushall,flushdb,slow lua script,mutil/exec,operate,big value

三.字符串

  1. 字符串鍵值結構

key 爲字符串
value 可以爲 字符串 數字 二進制 json對象 最大爲512M

  1. 使用場景

(1)緩存
(2)計數器
(3)分佈式鎖 …

  1. 命令
get key    :   獲取key對應的value
set key value : 設置key-value
del key  : 刪除key-value

incr key       :   key自增1,如果key不存在,自增後get(key)=1
decr key      :   key自減1,如果key不存在,自減後get(key)=-1
incrby key k  : key自增k ,如果key不存在,自增後get(key) = k 
decr key k    :  key自減k,如果key不存在,自減後get(key)=-k

192.168.187.128:6382> get counter
(nil)
192.168.187.128:6382> incr counter
(integer) 1
192.168.187.128:6382> get counter
"1"
192.168.187.128:6382> incr counter
(integer) 2
192.168.187.128:6382> get counter
"2"
192.168.187.128:6382> incrby counter 99
(integer) 101
192.168.187.128:6382> get counter
"101" 

  1. 實戰:記錄網站每個用戶個人主頁的訪問量
incr userid:pageview(單線程:無競爭)
  1. 緩存視頻的基本信息(數據源在MySQL中)
    在這裏插入圖片描述

先在redis中查找,如果沒有就去數據庫中查找

public VideoInfo get(long id){
    String redisKey = redisPrefix + id ;
    Video videoInfo = redis.get(redisKey);
    if(videoInfo == null){
        videoInfo = mysql.get(id);
         if(videoInfo != null){
             //序列化
             redis.set(redisKey,serialize(videoInfo));
           }
     }
   }
set key value    :  不管key是否存在 都設置
setnx key value :  key不存在,才設置
set key value xx  :  key存在,才設置

192.168.187.128:6382> exists php
(integer) 0
192.168.187.128:6382> set php good
OK
192.168.187.128:6382> get php
"good"
192.168.187.128:6382> setnnx key java
(error) ERR unknown command 'setnnx'
192.168.187.128:6382> setnx key java
(integer) 1
192.168.187.128:6382> get php
"good"
192.168.187.128:6382> set key value java
(error) ERR syntax error
192.168.187.128:6382> set key java xx
OK
192.168.187.128:6382> get php
"good"
192.168.187.128:6382> set php java xx
OK
192.168.187.128:6382> get php
"java"

mget key1 key2 key3 : 批量獲取key,原子操作
mset key1 value1 key2 value2 key3 value3 : 批量設置key-value

  1. n次get操作和mget操作區別
    在這裏插入圖片描述在這裏插入圖片描述
getset key newvalue       :    set key newvalue 並返回舊的value
append key value           :     將value追加到舊的value
strlen key                       :     返回字符串的長度(注意中文)

192.168.187.128:6382> get php
"java"
192.168.187.128:6382> getset php ffff
"java"
192.168.187.128:6382> get php
"ffff"
192.168.187.128:6382> append php ",java"
(integer) 9
192.168.187.128:6382> get php
"ffff,java"
192.168.187.128:6382> strlen php
(integer) 9
192.168.187.128:6382> set hello "足球"
OK
192.168.187.128:6382> strlen hello
(integer) 4
incrbyfloat key 3.5                    :  增加key對應的值3.5
getrange key start end             :  獲取字符串指定下標所有的值
setrange key index value          : 設置指定下標所有對應的值

192.168.187.128:6382> incr counter
(integer) 102
192.168.187.128:6382> incr times
(integer) 1
192.168.187.128:6382> incrbyfloat times 1.1
"2.1"
192.168.187.128:6382> getrange times 0 2
"2.1"
192.168.187.128:6382> setrange php 4 p
(integer) 9
192.168.187.128:6382> get php
"ffffpjava"
192.168.187.128:6382>

  1. 字符串總結
    在這裏插入圖片描述

四.Hash

  1. 哈希鍵值結構
    在這裏插入圖片描述在這裏插入圖片描述

  2. field不能相同,value可以相同

  3. 所有的API以H開頭

  4. hget hset hdel

hget key field     :     獲取hash key 對應的field的Values
hset key field value  : 設置hash key 對應的field的value
hdel key field  :  刪除hash key 對應field的value
hgetall   :  獲取所有的key和value
  1. hexists hlen
hexists key field   : 判斷hash key 是否有field
hlen key    : 獲取hash key field 的數量

192.168.187.128:6382> hexists user1 age
(integer) 0
192.168.187.128:6382> hexists user1 name
(integer) 1
192.168.187.128:6382> hash user1
(error) ERR unknown command 'hash'
192.168.187.128:6382> hlen user1
(integer) 1
  1. hmget hmset
hmget key field1 field2 ...fieldN    : 批量獲取hash key 的一批field對應的值
hmset key field1 value1 field2 value2....fieldN valueN     : 批量設置hash key 的一批field value
  1. 實戰 : 記錄網站每個用戶個人主頁的訪問量
hincrby user:1:info pageview count
  1. 緩存視頻的基本信息(數據源在mysal中)僞代碼
public VideoInfo get(long id){
    String reidsKey = redisPrefix + id ;
    Map<String,String> hashMap = redis.hgetAll(redisKey);
    VideoInfo videoInfo = transferMapToVideo(hasMap);
    if(videoInfo == null){
        videoInfo = mysql.get(id);
        if(videoInfo != null){
            redis.hmset(redisKey,transferVideoToMap(videoInfo));
        }
    }
    return videoInfo;
   }
  1. hgetall hvals hkeys
hgetall key        : 返回hash key對應所有的field和value
hvals key           :返回hash key 對應所有field的value
hkeys key          : 返回hash key對應所有的field
  1. 使用hgetall 小心使用牢記單線程
  2. 如何更新用戶屬性

(1)使用String : key 爲 用戶id value 爲用戶對象
(2)使用String : key 爲 每個用戶的屬性user:1:name value爲屬性的值world
(3)使用Hash : key爲用戶id , value 爲hash表 ,方便修改

  1. hsetnx hincrby hincrbyfloat
hsetnx key field value    : 設置hash key對應field的value(如果field已經存在,則失敗)
hincrby key field intCounter : hash key對應的field的value自增intCounter
hincrbyfloat key field floatCounter  : hincrby浮點數

五.List

  1. 列表結構
    在這裏插入圖片描述
  2. 特點:有序,可以重複,左右兩邊插入彈出
  3. 以L開頭
  4. rpush
 rpush key value1 value2 .. value3   :  從列表右端插入值
lpush key value1 value2 ...value3   :  從列表左端插入值
  1. linsert
 linsert key before|after value newValue    :  在list指定的值前|後插入newValue    例:linsert listkey before b java
  1. lpop
lpop key   : 從列表左側彈出一個item
  1. rpop
rpop key   : 從列表右側彈出一個item
  1. lrem
lrem key count value  根據count值 從列表中刪除所有value相等的項
(1)count >0  ,從左到右,刪除最多count個value相等的項
(2)count <0, 從右到左,刪除最多Maht.abs(count)個value相等的項
(3)count =0 ,刪除所有value相等的項
  1. ltrim
ltrim key start end           :   按照索引範圍修剪列表
  1. lrange
lrange key start end (包含end)        : 獲取列表指定索引範圍所有itme
索引從左: 0 - 5
索引從右:-1 - -6
  1. lindex
lindex key index   :   獲取列表指定索引的item
  1. llen
llen key    :  獲取列表長度
  1. lset
lset key index newValue     :  設置列表指定索引值爲newValue

六. 集合Set

  1. 不能有重複值
  2. 集合的結構
    在這裏插入圖片描述
  3. 特點:無序,無重複,集合間操作
  4. sadd srem
sadd key element   :  向集合key添加element(如果element已經存在,添加失敗)
srem key element   :  將集合key中的element移除掉
  1. scard sismember srandmember smembers spop
scard user:1:follow = 4  : 計算集合大小
sismember user:1:follow it = 1 :判斷it是否在集合中
srandmember user:1:follow count = his : 從集合中隨機挑選count個元素
spop user:1:follow = sports  : 從集合中隨機彈出一個元素
smembers user:1:follow = music his sports it    : 獲取集合所有元素
  1. spop從集合彈出
srandmenber不會破壞集合
  1. 實戰

抽獎系統
Like,贊,踩
標籤

  1. sdiff sinter sunion
sdiff user:1:follow user:2:follow = music his    :  差集
sinter user:1:follow user:2:follow = it sports    : 交集
sunion user:1:follow user:2:follow  = it music his sports news end    :  並集
sdiff|sinter|suion + store destkey      : 將差集,交集,並集結果保存在destkey中

七.有序集合zset

  1. 有序集合結構
    在這裏插入圖片描述
  2. 集合VS有序集合
    在這裏插入圖片描述
  3. 列表VS有序集合
    在這裏插入圖片描述
  4. zadd
zadd key score element (可以是多對)     :  添加score 和 element

192.168.187.128:6382> zadd user:1:ranking 244 tom
(integer) 1
192.168.187.128:6382> zadd user:1:ranking 214 jinm
(integer) 1
192.168.187.128:6382> zadd user:1:ranking d j
(error) ERR value is not a valid float
  1. zrem
    (1)zrem key element(可以是多個) : zrem user:1:ranking 225 tom

  2. zscore

zscore key element   : 返回元素的分數
192.168.187.128:6382> zscore user:1:ranking tom
"244"
  1. zincrby
zincrby key increScore element    :  增加或減少元素的分數
192.168.187.128:6382> zincrby user:1:ranking 4 tom
"248"
  1. zcard
zcard key                : 返回元素的總個數
192.168.187.128:6382> zcard user:1:ranking
(integer) 2
  1. zrange
zrange key start end [WITHSCORES]      : 返回指定索引範圍內的升序元素(分值)
zrange user:1:ranking 1 3 withscores
  1. zrangebyscore
zrangebyscore key minScore maxScore [WITHSCORES]    :  返回指定分數範圍內的升序元素
zrangebyscore user:1:ranking 90 210 withscores
  1. zcount
zcount key minScore maxScore            :  返回有序集合內在指定分數範圍內的個數
zcount user:1:ranking 200 221
  1. zremrangebyrank
zremrangebyrank key start end                            : 刪除指定排名內的升序元素   索引
zremrangebyrank user:1:ranking 1 2
  1. zremrangebyscore key minScore maxScore : 刪除指定分數內的升序元素
zremrangebyrank user:1:ranking 90 210
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章