欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

Redis命令怎么使用

這篇文章主要介紹“redis命令怎么使用”,在日常操作中,相信很多人在Redis命令怎么使用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Redis命令怎么使用”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

成都創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站制作、成都網(wǎng)站制作、崇義網(wǎng)絡(luò)推廣、成都小程序開發(fā)、崇義網(wǎng)絡(luò)營銷、崇義企業(yè)策劃、崇義品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);成都創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供崇義建站搭建服務(wù),24小時(shí)服務(wù)熱線:028-86922220,官方網(wǎng)址:aaarwkj.com

問題原因

阿粉負(fù)責(zé)的應(yīng)用是一個(gè)管理后臺應(yīng)用,權(quán)限管理使用 Shiro 框架,由于存在多個(gè)節(jié)點(diǎn),需要使用分布式 Session,于是這里使用 Redis 存儲 Session 信息。

由于 Shiro 并沒有直接提供 Redis 存儲 Session 組件,阿粉不得不使用 Github 一個(gè)開源組件 shiro-redis。

由于 Shiro 框架需要定期驗(yàn)證 Session 是否有效,于是 Shiro 底層將會調(diào)用  SessionDAO#getActiveSessions 獲取所有的 Session 信息。

shiro-redis 正好繼承 SessionDAO 這個(gè)接口,底層使用用keys 命令查找 Redis 所有存儲的 Session  key。

public Set<byte[]> keys(byte[] pattern){
    checkAndInit();
    Set<byte[]> keys = null;
    Jedis jedis = jedisPool.getResource();
    try{
        keys = jedis.keys(pattern);
    }finally{
        jedis.close();
    }
    return keys;
}
   

找到問題原因,解決辦法就比較簡單了,github 上查找到解決方案,升級一下 shiro-redis 到最新版本。

在這個(gè)版本,shiro-redis 采用 scan命令代替 keys,從而修復(fù)這個(gè)問題。

public Set<byte[]> keys(byte[] pattern) {
    Set<byte[]> keys = null;
    Jedis jedis = jedisPool.getResource();

    try{
        keys = new HashSet<byte[]>();
        ScanParams params = new ScanParams();
        params.count(count);
        params.match(pattern);
        byte[] cursor = ScanParams.SCAN_POINTER_START_BINARY;
        ScanResult<byte[]> scanResult;
        do{
            scanResult = jedis.scan(cursor,params);
            keys.addAll(scanResult.getResult());
            cursor = scanResult.getCursorAsBytes();
        }while(scanResult.getStringCursor().compareTo(ScanParams.SCAN_POINTER_START) > 0);
    }finally{
        jedis.close();
    }
    return keys;

}
   

雖然問題成功解決了,但是阿粉心里還是有點(diǎn)不解。

為什么keys 指令會導(dǎo)致其他命令執(zhí)行變慢?

為什么Keys 指令查詢會這么慢?

為什么Scan 指令就沒有問題?

   

Redis 執(zhí)行命令的原理

首先我們來看第一個(gè)問題,為什么keys 指令會導(dǎo)致其他命令執(zhí)行變慢?

回答這個(gè)問題,我們首先看下 Redis 客戶端執(zhí)行一條命令的情況:

Redis命令怎么使用    

站在客戶端的視角,執(zhí)行一條命令分為三步:

  1. 發(fā)送命令
  2. 執(zhí)行命令
  3. 返回結(jié)果

但是這僅僅客戶端自己以為的過程,但是實(shí)際上同一時(shí)刻,可能存在很多客戶端發(fā)送命令給 Redis,而 Redis 我們都知道它采用的是單線程模型。

為了處理同一時(shí)刻所有的客戶端的請求命令,Redis 內(nèi)部采用了隊(duì)列的方式,排隊(duì)執(zhí)行。

Redis命令怎么使用    

于是客戶端執(zhí)行一條命令實(shí)際需要四步:

  1. 發(fā)送命令
  2. 命令排隊(duì)
  3. 執(zhí)行命令
  4. 返回結(jié)果

由于 Redis 單線程執(zhí)行命令,只能順序從隊(duì)列取出任務(wù)開始執(zhí)行。

只要 3 這個(gè)過程執(zhí)行命令速度過慢,隊(duì)列其他任務(wù)不得不進(jìn)行等待,這對外部客戶端看來,Redis 好像就被阻塞一樣,一直得不到響應(yīng)。

所以使用 Redis 過程切勿執(zhí)行需要長時(shí)間運(yùn)行的指令,這樣可能導(dǎo)致 Redis 阻塞,影響執(zhí)行其他指令。

   

KEYS 原理

接下來開始回答第二個(gè)問題,為什么Keys 指令查詢會這么慢?

回答這個(gè)問題之前,請大家回想一下 Redis 底層存儲結(jié)構(gòu)。

不太清楚朋友的也沒關(guān)系,大家可以回看一下阿粉之前的文章「阿里面試官:HashMap 熟悉吧?好的,那就來聊聊 Redis 字典吧!」。

這里阿粉復(fù)制之前文章內(nèi)容,Redis 底層使用字典這種結(jié)構(gòu),這個(gè)結(jié)構(gòu)與 Java HashMap 底層比較類似。

Redis命令怎么使用    

keys命令需要返回所有的符合給定模式 pattern 的  Redis 中鍵,為了實(shí)現(xiàn)這個(gè)目的,Redis 不得不遍歷字典中 ht[0]哈希表底層數(shù)組,這個(gè)時(shí)間復(fù)雜度為 「O(N)」(N 為 Redis 中 key 所有的數(shù)量)。

如果 Redis 中 key 的數(shù)量很少,那么這個(gè)執(zhí)行速度還是也會很快。等到 Redis key 的數(shù)量慢慢更加,上升到百萬、千萬、甚至上億級別,那這個(gè)執(zhí)行速度就會很慢很慢。

下面是阿粉本地做的一次實(shí)驗(yàn),使用 lua 腳本往 Redis 中增加 10W 個(gè) key,然后使用 keys 查詢所有鍵,這個(gè)查詢大概會阻塞十幾秒的時(shí)間。

eval "for i=1,100000  do redis.call('set',i,i+1) end" 0

SCAN 原理

最后我們來看下第三個(gè)問題,為什么scan 指令就沒有問題?

這是因?yàn)?scan命令采用一種黑科技-「基于游標(biāo)的迭代器」。

每次調(diào)用 scan 命令,Redis 都會向用戶返回一個(gè)新的游標(biāo)以及一定數(shù)量的 key。下次再想繼續(xù)獲取剩余的 key,需要將這個(gè)游標(biāo)傳入 scan 命令, 以此來延續(xù)之前的迭代過程。

簡單來講,scan 命令使用分頁查詢 redis 。

下面是一個(gè) scan 命令的迭代過程示例:

scan 命令使用游標(biāo)這種方式,巧妙將一次全量查詢拆分成多次,降低查詢復(fù)雜度。

雖然  scan 命令時(shí)間復(fù)雜度與 keys一樣,都是 「O(N)」,但是由于 scan 命令只需要返回少量的 key,所以執(zhí)行速度會很快。

最后,雖然scan 命令解決 keys不足,但是同時(shí)也引入其他一些缺陷:

  • 同一個(gè)元素可能會被返回多次,這就需要我們應(yīng)用程序增加處理重復(fù)元素功能。
  • 如果一個(gè)元素在迭代過程增加到 redis,或者說在迭代過程被刪除,那個(gè)這個(gè)元素會被返回,也可能不會。

以上這些缺陷,在我們開發(fā)中需要考慮這種情況。

除了 scan以外,redis 還有其他幾個(gè)用于增量迭代命令:

  • sscan:用于迭代當(dāng)前數(shù)據(jù)庫中的數(shù)據(jù)庫鍵,用于解決         smembers 可能產(chǎn)生阻塞問題
  • hscan命令用于迭代哈希鍵中的鍵值對,用于解決         hgetall 可能產(chǎn)生阻塞問題。
  • zscan:命令用于迭代有序集合中的元素(包括元素成員和元素分值),用于產(chǎn)生         zrange 可能產(chǎn)生阻塞問題。

到此,關(guān)于“Redis命令怎么使用”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

新聞標(biāo)題:Redis命令怎么使用
轉(zhuǎn)載源于:http://aaarwkj.com/article26/jpdscg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管、、定制網(wǎng)站、企業(yè)網(wǎng)站制作網(wǎng)頁設(shè)計(jì)公司、建站公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化
亚洲中文字幕乱码一二三| 日韩精品综合成人欧美| 久久国产三级久久久久久| 97久久久人妻精品一区| 粉嫩在线一区二区懂色| 91极品气质女神长腿翘臀| 99精品人妻一区二区三区蜜桃| 91九色国产原创在线观看| 亚洲精品国产第一区第二区| 亚洲成av在线免费不卡| 久久精品国产亚洲av麻豆花絮| 日韩中文免费av一区| 欧美黄片精品在线观看| 国产传媒在线播放一区| 久久精品国产亚洲av久一一区| 国产白丝诱惑在线视频| 亚洲国产精品有码专区| 国产亚洲综合区成人国产| 免费在线观看欧美色妇| 五月婷久久精品国产亚洲av| 精品人妻一区二区三区观看| 男人天堂av在线资源| 国产一区av麻豆免费观看| 青青草青青草在线观看视频| 日韩精品 在线一区二区| 国产一区二区精品小视频| 日韩中文字幕在线首页| 亚洲精品国产中文字幕| 国产精品一久久香蕉产线看| 我想看日韩一级黄色片| 91亚洲精品一区二区三区| 日韩欧美亚洲一区二区三区| 日本熟女午夜福利视频| 日韩欧美中文字幕在线等| 日韩精品亚洲一区二区三区免费| 欧美劲爆三级免费观看| 日韩精品欧美精品一区二区| 国产综合一区二区三区视频| 国产视频一区2区三区| 麻豆精品国产一区二区91| 四虎免费在线视频观看|