最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

Redis 基礎(chǔ)知識

2023-02-01 18:25 作者:九夏lb  | 我要投稿

Redis

Redis 是一個開源的使用 ANSI C 語言編寫、遵守 BSD 協(xié)議、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value 數(shù)據(jù)庫,并提供多種語言的 API。

安裝

采用 Docker 安裝Redis 進行測試和學(xué)習(xí),執(zhí)行以下命令進行安裝:docker run -d -p 6379:6379 --name redis redis

基礎(chǔ)

數(shù)據(jù)類型

String

主要存儲單個 key-value 類型的數(shù)據(jù)。

  • SET key value : 設(shè)置 key 的值

  • GET key : 獲取 key 的值

  • GETRANGE key start end : 獲取 keyvalue 的 star 到 end 之間字符串

  • GETSET key value : 先獲取 key 舊的 value,然后設(shè)置 key 的 value

  • GETBIT key offset : 獲取 key 的 value 指定的位 bit

  • MGET key [key2 …] : 獲取所有 key 的 value

  • SETBIT key offset value : 給 key 對應(yīng) value 的 offset 位的值為 value

  • SETEX key seconds value : 將 value 關(guān)聯(lián)到 key ,并設(shè)置 seconds 秒過期

  • SETNX key value : 只有在 key 不存在時設(shè)置 key 的值

  • SETRANGE key offset value : 用 value 覆寫 key 對應(yīng)的值,從 offset 位開始

  • STRLEN key : 獲取 key 對應(yīng) value 的長度

  • MSET key value [key1 value1] : 同時設(shè)置多個 key-value

  • MSETNX key value [key1 value1] : 同時設(shè)置多個 key-value,當(dāng)且僅當(dāng) key 都不存在的時候

  • PSETEX key milliseconds value : 將 value 關(guān)聯(lián)到 key,并設(shè)置 milliseconds 毫秒后過期

  • INCR key : 將 key 的 value(數(shù)值)加一

  • INCRBY key increment : 將 key 的 value 加上 increment

  • INCRBYFLOAT key increment : 將 key 的 value 加上 浮點 increment

  • DECR key : 將 key 對應(yīng)的數(shù)值 value 減一

  • DECRBY key decrement : 將 key 對應(yīng)的數(shù)值 value 減去 decrement

  • APPEND key value : 如果 key 已經(jīng)存在并且是一個字符串, APPEND 命令將指定的 value 追加到該 key 原來值(value)的末尾

Hash

hash 是一個 string 類型的 field(字段) 和 value(值) 的映射表,hash 特別適合用于存儲對象。每個 hash 可以存儲 2 的三十二次方-1 鍵值對(40 多億)。

  • HDEL key field [field2 ] : 刪除一個或者多個哈希表字段

  • HEXISTS key field : 檢查存儲在哈希表的字段是否存在

  • HGET key field : 獲取哈希表字段的值

  • HGETALL key : 獲取哈希表的所有字段和值

  • HINCRBY key field increment : 為哈希表字段加 increment

  • HINCRBYFLOAT key field increment : 為哈希表字段加浮點 increment

  • HKEYS key : 獲取哈希表所有的字段

  • HLEN key : 獲取哈希表的字段數(shù)量

  • HMGET key field [field2 ] : 獲取哈希表指定的字段值

  • HMSET key field value [field1 value1] : 同時設(shè)置多個字段值給哈希表

  • HSET key field value : 設(shè)置字段屬性值給哈希表

  • HSETNX key field value : 當(dāng)哈希表中不存在字段 field 時,給 field 設(shè)置 value

  • HVALS key : 獲取哈希表所有的值

  • HSCAN key cursor MATCH pattern : 迭代哈希表中的鍵值對。

List

列表是簡單的字符串列表,按照插入順序排序。你可以添加一個元素到列表的頭部(左邊)或者尾部(右邊),一個列表最多可以包含 232 - 1 個元素 ( 4294967295, 每個列表超過 40 億個元素) 。

  • BLOPOP key [key1 ] timeout : 移出并獲取列表的最后一個元素,如果沒有則等待到可以彈出的元素或者等到超時時間

  • BRPOP key [key1 ] timeout : 移出并獲取列表的最后一個元素,如果沒有則等待到可以彈出的元素或者等到超時時間

  • BRPOPLPUSH source destination timeout : 從列表中彈出第一個值,將彈出的元素插入到另外一個列表中并返回它,如果列表沒有元素會阻塞列表直到等待超時或發(fā)現(xiàn)可彈出元素為止。

  • LINDEX key index : 通過索引的方式獲取列表中的元素

  • LINSERT key BEFORE|AGTER pivot value : 向列表的元素之前|之后插入一個元素

  • LLEN key : 獲取列表長度

  • LPOP key : 移出并獲取列表的第一個元素

  • LPUSH key vale1 [value2 ] : 將一個或者多個值插入列表頭部,先插入第一個,然后再插入第二個

Set

  • SADD key member1 [member2] : 向集合添加一個或者多個成員

  • SCARD key : 獲取集合中成員的個數(shù)

  • SDIFF key [key2] : 返回第一個集合和其他集合的差異

  • SDIFFSTORE destination key1 [key2] : 返回給定集合之家你的差集并存儲 destination

  • SINTER key1 [key2] ?: ?返回給定集合的交集

  • SINTERSTORE destination key1 [key2] : 返回給定所有集合的交集并存儲在 destination 中

  • SISMEMBER key member : 判斷 member 元素是否是集合 key 的成員

  • SMEMBERS key : 返回集合中的所有成員

  • SMOVE source destination member : 將 member 元素從 source 集合移動到 destination 集合

  • SPOP key : 移除并返回集合中的一個隨機元素

  • SRANDMEMBER key [count] : 返回集合中一個或多個隨機數(shù)

  • SREM key member1 [member2] : 移除集合中一個或多個成員

  • SUNION key1 [key2] : 返回所有給定集合的并集

  • SUNIONSTORE destination key1 [key2] : 所有給定集合的并集存儲在 destination 集合中

  • SSCAN key cursor [MATCH pattern] [COUNT count] : 迭代集合中的元素

Sorted Set

  • ZADD key score1 member1 [score2 member2] : 向有序集合添加一個或多個成員,或者更新已存在成員的分?jǐn)?shù)

  • ZCARD key : 獲取有序集合的成員數(shù)

  • ZCOUNT key min max : 計算在有序集合中指定區(qū)間分?jǐn)?shù)的成員數(shù)

  • ZINCRBY key increment member : 有序集合中對指定成員的分?jǐn)?shù)加上增量 increment

  • ZINTERSTORE destination numkeys key [key ...] : 計算給定的一個或多個有序集的交集并將結(jié)果集存儲在新的有序集合 destination 中

  • ZLEXCOUNT key min max : 在有序集合中計算指定字典區(qū)間內(nèi)成員數(shù)量

  • ZRANGE key start stop [WITHSCORES] : 通過索引區(qū)間返回有序集合指定區(qū)間內(nèi)的成員

  • ZRANGEBYLEX key min max [LIMIT offset count] : 通過字典區(qū)間返回有序集合的成員

  • ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] : 通過分?jǐn)?shù)返回有序集合指定區(qū)間內(nèi)的成員

  • ZRANK key member : 返回有序集合中指定成員的索引

  • ZREM key member [member ...] : 移除有序集合中的一個或多個成員

  • ZREMRANGEBYLEX key min max : 移除有序集合中給定的字典區(qū)間的所有成員

  • ZREMRANGEBYRANK key start stop : 移除有序集合中給定的排名區(qū)間的所有成員

  • ZREMRANGEBYSCORE key min max : 移除有序集合中給定的分?jǐn)?shù)區(qū)間的所有成員

  • ZREVRANGE key start stop [WITHSCORES] : 返回有序集中指定區(qū)間內(nèi)的成員,通過索引,分?jǐn)?shù)從高到低

  • ZREVRANGEBYSCORE key max min [WITHSCORES] : 返回有序集中指定分?jǐn)?shù)區(qū)間內(nèi)的成員,分?jǐn)?shù)從高到低排序

  • ZREVRANK key member : 返回有序集合中指定成員的排名,有序集成員按分?jǐn)?shù)值遞減(從大到小)排序

  • ZSCORE key member : 返回有序集中,成員的分?jǐn)?shù)值

  • ZUNIONSTORE destination numkeys key [key ...] : 計算給定的一個或多個有序集的并集,并存儲在新的 key 中

  • ZSCAN key cursor [MATCH pattern] [COUNT count] : 迭代有序集合中的元素(包括元素成員和元素分值)

事務(wù)

和MySQL事務(wù)基本一致,通過 MULTI 進行開啟事務(wù),然后執(zhí)行的命令都會添加到隊列中,等待執(zhí)行 EXEC 觸發(fā)事務(wù)的提交。

其他

  • 訂閱與發(fā)布

    • 消息不會進行持久化,如果出現(xiàn)網(wǎng)絡(luò)問題或者主機宕機等問題,就會出現(xiàn)數(shù)據(jù)丟失的情況。

  • Stream

    • 可以進行消息的持久化和消息的主備模式。

  • GEO

    • 主要用于存儲地理位置坐標(biāo)相關(guān)的信息

  • 腳本

    • 可以執(zhí)行一些 Lua 腳本,例如:分布式鎖

高級

備份和恢復(fù)

  • 數(shù)據(jù)備份用兩種方式做持久化:AOF和RDB

    • RDB

    • AOF

    1. 使用AOF 會讓你的Redis更加耐久: 你可以使用不同的fsync策略:無fsync,每秒fsync,每次寫的時候fsync。使用默認(rèn)的每秒fsync策略,Redis的性能依然很好(fsync是由后臺線程進行處理的,主線程會盡力處理客戶端請求),一旦出現(xiàn)故障,你最多丟失1秒的數(shù)據(jù)。

    2. AOF文件是一個只進行追加的日志文件,所以不需要寫入seek,即使由于某些原因(磁盤空間已滿,寫的過程中宕機等等)未執(zhí)行完整的寫入命令,你也也可使用redis-check-aof工具修復(fù)這些問題。

    3. Redis 可以在 AOF 文件體積變得過大時,自動地在后臺對 AOF 進行重寫: 重寫后的新 AOF 文件包含了恢復(fù)當(dāng)前數(shù)據(jù)集所需的最小命令集合。 整個重寫操作是絕對安全的,因為 Redis 在創(chuàng)建新 AOF 文件的過程中,會繼續(xù)將命令追加到現(xiàn)有的 AOF 文件里面,即使重寫過程中發(fā)生停機,現(xiàn)有的 AOF 文件也不會丟失。 而一旦新 AOF 文件創(chuàng)建完畢,Redis 就會從舊 AOF 文件切換到新 AOF 文件,并開始對新 AOF 文件進行追加操作。

    4. AOF 文件有序地保存了對數(shù)據(jù)庫執(zhí)行的所有寫入操作, 這些寫入操作以 Redis 協(xié)議的格式保存, 因此 AOF 文件的內(nèi)容非常容易被人讀懂, 對文件進行分析(parse)也很輕松。 導(dǎo)出(export) AOF 文件也非常簡單: 舉個例子, 如果你不小心執(zhí)行了 FLUSHALL 命令, 但只要 AOF 文件未被重寫, 那么只要停止服務(wù)器, 移除 AOF 文件末尾的 FLUSHALL 命令, 并重啟 Redis , 就可以將數(shù)據(jù)集恢復(fù)到 FLUSHALL 執(zhí)行之前的狀態(tài)。

    5. 對于相同的數(shù)據(jù)集來說,AOF 文件的體積通常要大于 RDB 文件的體積。

    6. 根據(jù)所使用的 fsync 策略,AOF 的速度可能會慢于 RDB 。 在一般情況下, 每秒 fsync 的性能依然非常高, 而關(guān)閉 fsync 可以讓 AOF 的速度和 RDB 一樣快, 即使在高負(fù)荷之下也是如此。 不過在處理巨大的寫入載入時,RDB 可以提供更有保證的最大延遲時間(latency)。

    1. RDB是一個非常緊湊的文件,它保存了某個時間點得數(shù)據(jù)集,非常適用于數(shù)據(jù)集的備份,比如你可以在每個小時報保存一下過去24小時內(nèi)的數(shù)據(jù),同時每天保存過去30天的數(shù)據(jù),這樣即使出了問題你也可以根據(jù)需求恢復(fù)到不同版本的數(shù)據(jù)集。

    2. RDB是一個緊湊的單一文件,很方便傳送到另一個遠(yuǎn)端數(shù)據(jù)中心或者亞馬遜的S3(可能加密),非常適用于災(zāi)難恢復(fù)。

    3. RDB在保存RDB文件時父進程唯一需要做的就是fork出一個子進程,接下來的工作全部由子進程來做,父進程不需要再做其他IO操作,所以RDB持久化方式可以最大化redis的性能。

    4. 與AOF相比,在恢復(fù)大的數(shù)據(jù)集的時候,RDB方式會更快一些。

    5. 耗時、耗性能。RDB 需要經(jīng)常fork子進程來保存數(shù)據(jù)集到硬盤上,當(dāng)數(shù)據(jù)集比較大的時候,fork的過程是非常耗時的,可能會導(dǎo)致Redis在一些毫秒級內(nèi)不能響應(yīng)客戶端的請求。如果數(shù)據(jù)集巨大并且CPU性能不是很好的情況下,這種情況會持續(xù)1秒,AOF也需要fork,但是你可以調(diào)節(jié)重寫日志文件的頻率來提高數(shù)據(jù)集的耐久度。

    6. 不可控、丟失數(shù)據(jù)。如果你希望在redis意外停止工作(例如電源中斷)的情況下丟失的數(shù)據(jù)最少的話,那么RDB不適合你。雖然你可以配置不同的save時間點(例如每隔5分鐘并且對數(shù)據(jù)集有100個寫的操作),是Redis要完整的保存整個數(shù)據(jù)集是一個比較繁重的工作,你通常會每隔5分鐘或者更久做一次完整的保存,萬一在Redis意外宕機,你可能會丟失幾分鐘的數(shù)據(jù)。

集群

  • 主備

    • 主節(jié)點:由于從節(jié)點需要向主節(jié)點同步數(shù)據(jù),所以主節(jié)點一定要進行持久化

    • 從節(jié)點:配置需要添加同步的主節(jié)點數(shù)據(jù) slaveof 主節(jié)點IP 主節(jié)點端口

    • 每個客戶端連接redis實例的時候都是指定了ip和端口號的,如果所連接的redis實例因為故障下線了,而主從模式也沒有提供一定的手段通知客戶端另外可連接的客戶端地址,因而需要手動更改客戶端配置重新連接

    • 主從模式下,如果主節(jié)點由于故障下線了,那么從節(jié)點因為沒有主節(jié)點而同步中斷,因而需要人工進行故障轉(zhuǎn)移工作

    • 無法實現(xiàn)動態(tài)擴容

    • 解決數(shù)據(jù)備份問題

    • 做到讀寫分離,提高服務(wù)器性能

    • 優(yōu)點

    • 缺點

    • 搭建

    • 哨兵

      • 如果是從節(jié)點下線了,sentinel是不會對其進行故障轉(zhuǎn)移的,連接從節(jié)點的客戶端也無法獲取到新的可用從節(jié)點

      • 無法實現(xiàn)動態(tài)擴容

      • Master 狀態(tài)監(jiān)測

      • 如果Master 異常,則會進行Master-slave 轉(zhuǎn)換,將其中一個Slave作為Master,將之前的Master作為Slave

      • Master-Slave切換后,master_redis.conf、slave_redis.conf和sentinel.conf的內(nèi)容都會發(fā)生改變,即master_redis.conf中會多一行slaveof的配置,sentinel.conf的監(jiān)控目標(biāo)會隨之調(diào)換

      • 優(yōu)點

      • 缺點

      • Cluster 集

        • 架構(gòu)比較新,最佳實踐較少

        • 為了性能提升,客戶端需要緩存路由表信息

        • 節(jié)點發(fā)現(xiàn)、reshard操作不夠自動化

        • 有效的解決了redis在分布式方面的需求

        • 遇到單機內(nèi)存,并發(fā)和流量瓶頸等問題時,可采用Cluster方案達(dá)到負(fù)載均衡的目的

        • 可實現(xiàn)動態(tài)擴容

        • P2P模式,無中心化

        • 通過Gossip協(xié)議同步節(jié)點信息

        • 自動故障轉(zhuǎn)移、Slot遷移中數(shù)據(jù)可用

        • 優(yōu)點:

        • 缺點

        實踐

        緩存穿透、緩存擊穿、緩存雪崩

        • 緩存穿透:指不經(jīng)過緩存,直接去數(shù)據(jù)庫獲取數(shù)據(jù),例如通過 ID 查詢時,ID的值為-1,此時次次去數(shù)據(jù)庫獲取數(shù)據(jù)。解決方案,判定好條件,或者也進行數(shù)據(jù)緩存,直接返回。可以采用布隆過濾器解決此問題

        • 緩存擊穿:緩存擊穿是指緩存中沒有但數(shù)據(jù)庫中有的數(shù)據(jù)(一般是緩存時間到期),這時由于并發(fā)用戶特別多,同時讀緩存沒讀到數(shù)據(jù),又同時去數(shù)據(jù)庫去取數(shù)據(jù),引起數(shù)據(jù)庫壓力瞬間增大,造成過大壓力??梢酝ㄟ^分布式鎖解決此問題

        • 緩存雪崩:緩存雪崩是指緩存中數(shù)據(jù)大批量到過期時間,而查詢數(shù)據(jù)量巨大,引起數(shù)據(jù)庫壓力過大甚至down機。和緩存擊穿不同的是, 緩存擊穿指并發(fā)查同一條數(shù)據(jù),緩存雪崩是不同數(shù)據(jù)都過期了,很多數(shù)據(jù)都查不到從而查數(shù)據(jù)庫。

        SpringBoot AOP 實現(xiàn)統(tǒng)一緩存處理

        仿照Spring Cache實現(xiàn)自定義注解,然后統(tǒng)一處理需要緩存的數(shù)據(jù),也可以實現(xiàn)主備、讀寫分離、布隆過濾等,以此來解決上述緩存穿透、緩存擊穿、緩存雪崩的問題。

        SpringBoot 緩存和數(shù)據(jù)庫的數(shù)據(jù)一致性

        • 延時雙刪

          1. 刪除緩存

          2. 更新數(shù)據(jù)庫

          3. 刪除緩存

        • 異步更新

          1. 更新數(shù)據(jù)庫

          2. 通過框架監(jiān)聽Mysql的binlog,實現(xiàn)異步刪除緩存。


        Redis 基礎(chǔ)知識的評論 (共 條)

        分享到微博請遵守國家法律
        施甸县| 海安县| 广东省| 平安县| 琼海市| 平南县| 丹阳市| 天气| 民丰县| 丹巴县| 西平县| 高青县| 海城市| 白银市| 洪雅县| 贵溪市| 邯郸县| 红原县| 永定县| 中山市| 东海县| 昌宁县| 花莲市| 增城市| 万荣县| 邵阳市| 文安县| 彝良县| 扎兰屯市| 柞水县| 绥化市| 天等县| 峨眉山市| 二连浩特市| 西乡县| 南康市| 长宁县| 古浪县| 阜新市| 阜阳市| 武城县|