Redis API的理解和使用

一、通用命令

  • keys:顯示所有符合條件的鍵(一般不在生產(chǎn)環(huán)境使用,時間復(fù)雜度O(n)速度慢)
  • dbsize:計算key的總數(shù)(內(nèi)部計數(shù)器,時間復(fù)雜度O(1)
  • exists key:判斷鍵是否存在(O(1))
  • del key
  • expire key seconds:設(shè)置鍵的有效期,-1代表永久
    +type key


    image.png

二、數(shù)據(jù)結(jié)構(gòu)和內(nèi)部編碼

image.png

三、單線程

單線程為什么這么快?
1.純內(nèi)存:所有的數(shù)據(jù)都存在內(nèi)存中
2.使用多路I/O復(fù)用模型,非阻塞IO
多路I/O復(fù)用模型是利用 select、poll、epoll 可以同時監(jiān)察多個流的 I/O 事件的能力,在空閑的時候,會把當(dāng)前線程阻塞掉,當(dāng)有一個或多個流有 I/O 事件時,就從阻塞態(tài)中喚醒,于是程序就會輪詢一遍所有的流(epoll 是只輪詢那些真正發(fā)出了事件的流),并且只依次順序的處理就緒的流,這種做法就避免了大量的無用操作。
3.避免了不必要的上下文切換和競爭,不用考慮鎖的問題

單線程需要注意的問題:
1.一次只運(yùn)行一條命令
2.拒絕長(慢)命令

四、數(shù)據(jù)結(jié)構(gòu)

1.String

結(jié)構(gòu)和命令:
key-value:value最大為512MB

應(yīng)用場景:

  • 緩存
  • 計數(shù)器
  • 分布式鎖

常用命令:

  • get、set、del
  • incr:incr key 自增1,如果key不存在,自增后get(key)=1
  • decr:自減
  • incrby:incrby key k 自增k
  • decrby
  • setnx:key不存在,才設(shè)置(添加鍵值)
  • setxx:key存在才設(shè)置(更新鍵值)
  • mget、mset:get、set多個


    n次get
1次mget節(jié)省了網(wǎng)絡(luò)時間
  • getset、append、strlen
    應(yīng)用:
    1.記錄網(wǎng)站每個用戶個人主頁的訪問量:
    incr userid:pageview
    2.緩存視頻的基本信息(數(shù)據(jù)源在Mysql中):
//偽代碼
public VideoInfo get(long id){
    String redisKey = redisPrefix + id;
    VideoInfo videoInfo = redis.get(redisKey);
    if(videoInfo == null){
        videoInfo = mysql.get(id);
        if(videoInfo != null){
            //序列化
            redis.set(redisKey,serialize(videoInfo));
        }
    }
    return videoInfo;
}

3.分布式id生成器

2.哈希

結(jié)構(gòu):

hash結(jié)構(gòu)

filed不能相同

命令:

  • hget、hset、hdel / 例:hget key field
  • hexists、hlen
  • hmget、hmset
  • hgetall、hvals、hkeys O(n)

應(yīng)用:
1.記錄網(wǎng)站每個用戶訪問量
hincrby user pageViewCount

3.list

有序、可以重復(fù)、可以從左右彈出
命令:

  • rpush:從右邊插入 lpush
  • rpop、lpop
  • rinsert、linsert
  • lrem O(n)
lrem key count value
//根據(jù)count值,從列表中刪除所有value相等的項
(1) count>0,從左到右,刪除最多count個value相等的項
(2)count<0,從右到左,刪除最多Math.abs(count)個value相等的項
(3)count=0,刪除所有value相等的項
  • ltrim
ltrim key start end
//按照索引范圍修剪列表
  • lrange
  • lindex
  • llen
  • lset

應(yīng)用:
1.時間線(微博)

image.png

4.set

無序,不能重復(fù),集合間操作
命令:

  • sadd,srem
  • 可以做集合間的操作,sinter(交),sdiff(差),sunion(并)
  • scard:計算集合大小
  • sismember:是否是集合中的元素
  • srandmember:從集合中隨機(jī)挑count個元素,但是不會彈出
  • spop:從集合中隨機(jī)彈出一個元素
  • smembers:從集合中取出所有的元素

5.有序集合

有序集合結(jié)構(gòu)
集合VS有序結(jié)合

命令:

  • zadd、zrem
  • zscore
  • zcard
  • zrange、zrangebyscore
  • zcount
  • zremrangebyscore、zremrangebyrank
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容