日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Redis總結

 路人甲Java 2022-05-07 發(fā)布于北京

資源列表:

Redis 命令參考

Commands

Redis是什么

  Redis是一個開源(BSD許可)的內(nèi)存中的數(shù)據(jù)結構存儲,用作數(shù)據(jù)庫、緩存和消息中間件。它支持多種數(shù)據(jù)結構,如字符串、哈希表列表、無序集合、有序集合的范圍查詢,位圖基數(shù)統(tǒng)計地理空間索引的與查詢。Redis內(nèi)置復制Lua腳本、LRU回收、事務和不同級別的磁盤持久化,并通過哨兵自動分區(qū)提供高可用性集群。

單線程結構

  • 純內(nèi)存數(shù)據(jù)庫,瓶頸不在內(nèi)存,在于網(wǎng)絡IO
  • 單線程,避免頻繁切換上下文
  • 異步阻塞I/O(多路復用)

持久化

RDB(Redis DataBase)持久化

  • 快照
  • 優(yōu)點:適合備份、還原、恢復數(shù)據(jù)快、最大化 Redis 的性能
  • 缺點:兩次快照間的數(shù)據(jù)會丟失、數(shù)據(jù)集比較龐大時, fork() 可能會非常耗時

AOF(Append Only File)持久化

  • 日志
  • 優(yōu)點:數(shù)據(jù)完整性高、可讀性高、可重寫(重寫后的新 AOF 文件包含了恢復當前數(shù)據(jù)集所需的最小命令集合)
  • 缺點:體積大、慢于RDB、有bug

事務

multi開啟事務,exec執(zhí)行事務

tx

  可以看到,redis事務實現(xiàn)原理是將要執(zhí)行的命令,存儲到一個隊列中,依次執(zhí)行,報錯時停止并取消事務,不報錯則提交事務。

例外:不會回滾的情況:

當一個事務中某一條(多條)命令加入隊列不報錯,執(zhí)行時才會報錯,則redis會忽略錯誤繼續(xù)執(zhí)行。

  使用watch監(jiān)視一個(或多個) key ,如果在事務執(zhí)行之前這個(或這些) key 被其他命令所改動,那么事務將被打斷。當exec被調(diào)用時, 不管事務是否成功執(zhí)行, 對所有鍵的監(jiān)視都會被取消?;蛘哒{(diào)用unwatch手動取消監(jiān)控。

管道

  • pipeline通過減少客戶端與redis的通信次數(shù)來實現(xiàn)降低往返延時時間,而且Pipeline 實現(xiàn)的原理是隊列,而隊列的原理是時先進先出,這樣就保證數(shù)據(jù)的順序性。
  • 適用場景:批量操作、可靠性要求不高、

Lua腳本

  Lua是一個高效的輕量級腳本語言,用標準C語言編寫并以源代碼形式開放, 其設計目的是為了嵌入應用程序中,從而為應用程序提供靈活的擴展和定制功能,從定義上來說, Redis 中的腳本本身就是一種事務, 所以任何在事務里可以完成的事, 在腳本里面也能完成。 并且一般來說, 使用腳本要來得更簡單,并且速度更快。

  • 通過lua腳本可以原子執(zhí)行多條redis命令
  • 執(zhí)行l(wèi)ua腳本期間,會阻塞所有命令操作

使用腳本的好處

  • 減少網(wǎng)絡開銷,在Lua腳本中可以把多個命令放在同一個腳本中運行
  • 原子操作,redis會將整個腳本作為一個整體執(zhí)行,中間不會被其他命令插入。換句話說,編寫腳本的過程中無需擔心會出現(xiàn)競態(tài)條件
  • 復用性,客戶端發(fā)送的腳本會永遠存儲在redis中,這意味著其他客戶端可以復用這一腳本來完成同樣的邏輯

多數(shù)據(jù)庫支持

默認支持16個數(shù)據(jù)庫;可以理解為一個命名空間

跟關系型數(shù)據(jù)庫不一樣的點

  1. redis不支持自定義數(shù)據(jù)庫名詞
  2. 每個數(shù)據(jù)庫不能單獨設置授權
  3. 每個數(shù)據(jù)庫之間并不是完全隔離的。 可以通過flushall命令清空redis實例面的所有數(shù)據(jù)庫中的數(shù)據(jù)

通過 select dbid 去選擇不同的數(shù)據(jù)庫命名空間 。 dbid的取值范圍默認是0 -15

分布式集群

  Redis Cluster中,Sharding采用slot(槽)的概念,一共分成16384個槽,這有點兒類似前面講的pre sharding思路。對于每個進入Redis的鍵值對,根據(jù)key進行散列,分配到這16384個slot中的某一個中。使用的hash算法也比較簡單,就是CRC16后16384取模。Redis集群中的每個node(節(jié)點)負責分攤這16384個slot中的一部分,也就是說,每個slot都對應一個node負責處理。當動態(tài)添加或減少node節(jié)點時,需要將16384個槽做個再分配,槽中的鍵值也要遷移。當然,這一過程,在目前實現(xiàn)中,還處于半自動狀態(tài),需要人工介入。Redis集群,要保證16384個槽對應的node都正常工作,如果某個node發(fā)生故障,那它負責的slots也就失效,整個集群將不能工作。為了增加集群的可訪問性,官方推薦的方案是將node配置成主從結構,即一個master主節(jié)點,掛n個slave從節(jié)點。這時,如果主節(jié)點失效,Redis Cluster會根據(jù)選舉算法從slave節(jié)點中選擇一個上升為主節(jié)點,整個集群繼續(xù)對外提供服務。這非常類似服務器節(jié)點通過Sentinel監(jiān)控架構成主從結構,只是Redis Cluster本身提供了故障轉移容錯的能力。

  • redis sharding
  • codis
  • twemproxy

支持的數(shù)據(jù)類型、常用命令、常用場景

String

默認存儲最大容量為512M

常用命令:set、get、incr、decr、append、strlenmget、setnx

List

有序,可重復

常用命令:lpush、rpushlpop、rpop、llen、lrange、lrem、lset

  • lpush+lpop:Stack(棧)
  • lpush+rpop:Queue(隊列)
  • lpush+ltrim:Capped Collection(有限集合)
  • lpush+brpop:Message Queue(消息隊列)
  • blpop:事件提醒(替代輪詢)

Hash

不支持數(shù)據(jù)類型的嵌套

適合存儲對象

常用命令:hset、hget、[hmset](http://doc./hash/hmset
,.html)、hmget、hgetallhexistshincrby、hsetnxhdel

Set

無序、不重復

常用命令:saddsrem、smembers、sdiff、sunionsinter

  • sadd:標簽
  • sinter:交集
  • sunion:并集

SortedSet

有序、不重復

常用命令:zadd、zrange

  • zcount:統(tǒng)計信息
  • zrevrange:排行榜

key

常用命令:expire、ttl

Script

常用命令:eval

Redis安裝

安裝

首先,到redis官網(wǎng)找到要安裝的redis版本,Redis下載頁,我們這里選用v4.0.11,依次執(zhí)行下面命令:

# wget http://download./releases/redis-4.0.11.tar.gz
# tar xzf redis-4.0.11.tar.gz
# cd redis-4.0.11
# make

到此安裝完成,然后可以通過make test測試編譯狀態(tài)

# make test

無報錯完成編譯應該會有這樣的輸出:

make-test

報錯:需要tcl 8.5以上來運行redis test

You need tcl 8.5 or newer in order to run the Redis test
make: *** [test] Error 1

下面安裝tcl8.6.1

# wget http://downloads./tcl/tcl8.6.1-src.tar.gz
# sudo tar xzvf tcl8.6.1-src.tar.gz
# cd tcl8.6.1/unix/
# sudo ./configure
# sudo make
# sudo make install 

再次運行make test,沒問題之后,運行最后一步,完成安裝:

# make install

redis-make-install

直接啟動:

# ./redis-server ../redis.conf

redis-server

后臺啟動redis,只需修改redis.conf配置文件的daemonize yes,再次啟動即可。

daemonize

安裝啟動相關命令

啟動redis服務器:

# ./redis-server ../redis.conf

停止redis服務:

# ./redis-cli shutdown

連接本地啟動好的redis:

# redis-cli

根據(jù)ip端口連接redis:

# redis-cli -h 127.0.0.1 -p 6379

查看當前是否設置了密碼

127.0.0.1:6379> config get requirepass
1) "requirepass"
2) ""

設置密碼

127.0.0.1:6379> config set requirepass 123456 //密碼是123456
OK

使用總結

關于key

  • 建議key不要太長,不要超過1024字節(jié),占用內(nèi)存且會降低查詢效率
  • 建議統(tǒng)一命名規(guī)則,例如:String:001:zhangsan:age

使用 bitmap 實現(xiàn)用戶上線次數(shù)統(tǒng)計

  Bitmap 對于一些特定類型的計算非常有效。

  假設現(xiàn)在我們希望記錄自己網(wǎng)站上的用戶的上線頻率,比如說,計算用戶 A 上線了多少天,用戶 B 上線了多少天,諸如此類,以此作為數(shù)據(jù),從而決定讓哪些用戶參加 beta 測試等活動 —— 這個模式可以使用 SETBITBITCOUNT 來實現(xiàn)。

  比如說,每當用戶在某一天上線的時候,我們就使用 SETBIT ,以用戶名作為 key ,將那天所代表的網(wǎng)站的上線日作為 offset 參數(shù),并將這個 offset 上的為設置為 1 。

  舉個例子,如果今天是網(wǎng)站上線的第 100 天,而用戶 peter 在今天閱覽過網(wǎng)站,那么執(zhí)行命令 SETBIT peter 100 1 ;如果明天 peter 也繼續(xù)閱覽網(wǎng)站,那么執(zhí)行命令 SETBIT peter 101 1 ,以此類推。

  當要計算 peter 總共以來的上線次數(shù)時,就使用 BITCOUNT 命令:執(zhí)行 BITCOUNT peter ,得出的結果就是 peter 上線的總天數(shù)。

  更詳細的實現(xiàn)可以參考博文(墻外) Fast, easy, realtime metrics using Redis bitmaps 。

緩存

緩存一致性

  • 先更新庫數(shù)據(jù),再刪除緩存

緩存擊穿和緩存雪崩

分布式鎖的實現(xiàn)

setnx+lua實現(xiàn)

public class RedisTool {

    private static final String LOCK_SUCCESS = "OK";
    private static final String SET_IF_NOT_EXIST = "NX";
    private static final String SET_WITH_EXPIRE_TIME = "PX";
    private static final Long RELEASE_SUCCESS = 1L;

    // 獲取鎖
    public static boolean getLock(Jedis jedis, String lockKey, String requestId, int expireTime) {

        String result = jedis.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime);

        if (LOCK_SUCCESS.equals(result)) {
            return true;
        }
        return false;

    }

	// 釋放鎖
    public static boolean releaseLock(Jedis jedis, String lockKey, String requestId) {

        String script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end";
        Object result = jedis.eval(script, Collections.singletonList(lockKey), Collections.singletonList(requestId));

        if (RELEASE_SUCCESS.equals(result)) {
            return true;
        }
        return false;
    }
}

搶紅包,秒殺的實現(xiàn)

incr+lua腳本實現(xiàn)

參考鏈接:

http://doc.>

https://blog.csdn.net/liqingtx/article/details/60330555

公眾號二維碼

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多