成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Redis你掌握多少了,來個查漏補缺?

運維 數據庫運維 Redis
Redis 并不僅僅有緩存這一種功能。比如它還能實現 簡單的消息隊列,解決Session共享,計數器,排行榜,好友關系處理 等等功能,可見 Redis 是一個非常強大工具,讓我們來學習它吧!

Redis 是什么

Redis 是 開源,內存 中的數據結構存儲系統,它可以用作數據庫、緩存和消息中間件。它支持多種類型的數據結構,如 字符串strings, 散列 hashes, 列表 lists, 集合 sets, 有序集合 sorted sets 與范圍查詢, bitmaps, hyperloglogs 和 地理空間(geospatial) 索引半徑查詢。

Redis 還內置了 復制(replication),LUA腳本(Lua scripting), LRU驅動事件(LRU eviction),事務(transactions) 和不同級別的 磁盤持久化(persistence), 并通過 Redis哨兵(Sentinel)和自動 分區(Cluster)提供高可用性(high availability)。

嗯,沒錯這就是 redis 中文官方網站上面的介紹,簡潔明了。

NoSQL 是什么

我們知道 redis 是一種非關系型數據庫 NoSQL 。而為什么出現 NoSQL?NoSQL 又是什么呢?

單機數據庫的年代

在一個網站訪問量不大的時候,我們使用一個數據庫就足以應對流量請求。

緩存 + 拆分

隨著訪問量的上升,一個數據庫已經不能滿足我們的需求了。為了更高的性能,我們在中間加上了一個緩存層并且將數據庫做了集群、結構優化和讀寫分離。

而這里的緩存就是 NoSQL,當然做緩存也只是 NoSQL 的一種功能,就像 Redis 并不僅僅有緩存這一種功能。比如它還能實現 簡單的消息隊列,解決Session共享,計數器,排行榜,好友關系處理 等等功能,可見 Redis 是一個非常強大工具,讓我們來學習它吧!

Redis 通用命令

首先我們拋開數據類型來講關于 Redis 的通用命令。

操作 key 和 value

Redis 是一種 key value 存儲的緩存數據庫,所有的數據都有一個自己唯一的key。

這里為了方便演示,我使用了字符串相關的設置命令

  •  keys [pattern] 獲取符合要求的所有key。時間復雜度為 O(n),一般在生產環境中不使用,因為 Redis 是單線程的,執行耗時的任務會阻塞其他任務。一般會使用 scan 命令替代(非阻塞)。

  •  dbsize 獲取當前存儲數據個數。
  •  exists key 判斷是否存在該key
  •  del key 刪除指定數據
  •  type key 獲取指定key的數據類型
  •  rename key newkey 重命名

過期時間

Redis 中很多數據都是用來作為緩存數據的,而作為緩存就需要有過期時間,在 Redis 中提供了很強大的過期時間設置功能。

  •  expire key seconds 為某個 key 設置過期時間。
  •  ttl key 查看某個 key 的剩余時間,返回正數代表剩余的時間,-1代表永久,-2代表已過期或不存在。

Redis 的五種基本數據類型

在上面我說到了很多 Redis 作為緩存能實現的其他功能,比如計數器,排行榜,好友關系等,這些實現的依據就是靠著 Redis 的數據結構。在整個 Redis 中一共有五種基本的數據結構(還有些高級數據結構以后會講),他們分別是 字符串strings, 散列 hashes, 列表 lists, 集合 sets, 有序集合 sorted sets。

字符串 string

在絕大部分編程語言中都有 String 字符串類型,對于作為數據庫的 Redis 也是必不可少的。

  •  set key value 設置值
  •  get key 獲取某個key的值
  •  mset key1 value1 key2 value2 批量設置并且是原子的,可以用來減少網絡時間消耗
  •  mget key1 key2 批量獲取并且是原子的,可以用來減少網絡時間消耗 

  •  incr key 自增指定key的值
  •  decr key 自減指定key的值
  •  incrby key value 自增指定數值
  •  decrby key value 自減指定數值
  •  incrbyfloat key floatvalue 增加指定浮點數,前面幾個操作就可以用來實現計數器的功能。

  •  setnx key value 如果不存在該key則可以設置成功,否則會失敗,加上過期時間限制,則是redis實現分布式鎖的一種方式(后面會提到)。
  •  set key value xx 與前面相反,如果存在則設置成功,否則失敗(相當于更新操作)

hash

其實我們可以理解 hash 為 小型 Redis ,Redis 在底層實現上和 Java 中的 HashMap 差不多,都是使用 數組 + 鏈表 的二維結構實現的。

不同的是,在 Redis 中字典的值只能是字符串,而且他們 rehash 的方式不一樣,在 Redis 中使用的是 漸進式rehash 。

在 rehash 的時候會保留新舊兩個 hash 字典,在數據遷移的時候會將舊字典中的內容一點一點遷移到新字典中,查詢的同時會查詢兩個 hash 字典,等數據全部遷移完成才會將新字典代替就字典。

下面我們來看一下關于 hash 的基本操作。

  •  hset key field value 設置字典中某個key的值
  •  hsetnx key field value 設置字典中某個key的值(不存在的)
  •  hmset key field1 value1 field2 value2 … 批量設置
  •  hget key field 獲取字典中某個key的值
  •  hmget key field1 field2 批量獲取
  •  hgetall key 獲取全部   

  •  hdel key field 刪除某個key
  •  hexists key field 判斷是否存在
  •  hlen key 獲取指定key對應的字典中的存儲個數
  •  hvals key 返回所有的value
  •  hkeys key 返回所有的key   

  • hincrby key field increValue 增加某個value的值(也可以增加負數)
  • hincrbyfloat key field floatValue 增加某個value的值(浮點數)

list

Redis 中的列表相當于 Java 中的 LinkedList(雙向鏈表) ,也就是底層是通過 鏈表 來實現的,所以對于 list 來說 插入刪除操作很快,但 索引定位非常慢。

Redis 提供了許多對于 list 的操作,如出,入等操作,你可以充分利用它們來實現一個 棧 或者 隊列。

下面我們來看一下關于 list 的基本操作。

  •  lpush key item1 item2 item3… 從左入棧
  •  rpush key item1 item2 item3… 從右入棧
  •  lpop key 從左出棧
  •  rpop key 從右出棧
  •  lindex key index 獲取指定索引的元素 O(n)謹慎使用
  •  lrange key start end 獲取指定范圍的元素 O(n)謹慎使用   

  • linsert key before|after item newitem 在指定元素的前面或者后面添加新元素
  • lrem key count value 刪除指定個數值為value的元素
    •   count = 0 :刪除所有值為value的元素
    •   count > 0 :從左到右刪除 count 個值為 value 的元素
    •   count < 0 :從右到做刪除 |count| 個值為 value 的元素
  •  ltrim key start end 保留指定范圍的元素
  •  lset key index newValue 更新某個索引的值

  •  blpop key timeout 沒有則阻塞(timeout指定阻塞時間 為0代表永久)
  •  brpop key timeout 沒有則阻塞(timeout指定阻塞時間 為0代表永久) 這兩個可以用來實現消費者生產者

總結來說我們可以使用 左入又出或者右入左出 來實現隊列,左入左出或者右入右出 來實現棧。

set

Redis 中的 set 相當于 Java 中的 HashSet(無序集合),其中里面的元素不可以重復,我們可以利用它實現一些去重的功能。我們還有對幾個集合進行取交集,取并集等操作,這些操作就可以獲取不同用戶之間的共同好友,共同愛好等等。

下面我們就來看一下關于 set 的一些基本操作。

  •  sadd key value 添加元素
  •  sdel key value 刪除某個元素
  •  sismember key value 判斷是否是集合中的元素
  •  srandmember key count 隨機獲取指定個數的元素(不會影響集合結構)
  •  spop key count 從集合中隨機彈出元素(會破壞結合結構)
  •  smembers key 獲取集合所有元素 O(n)復雜度
  •  scard key 獲取集合個數

  •  sinter set1 set2 … 獲取所有集合中的交集
  •  sdiff set1 set2 … 獲取所有集合中的差集
  •  sunion set1 set2 … 獲取所有集合中的并集

zset

Redis 中的 zset 是一個 有序集合,通過它可以實現很多有意思的功能,比如學生成績排行榜,視頻播放量排行榜等等。

zset 中是使用 跳表 來實現的,我們知道只有數組這種連續的空間才能使用二分查找進行快速的定位,而鏈表是不可以的。跳表幫助鏈表查找的時候節省了很多時間(使用跳的方式來遍歷索引來進行有序插入),如果不了解跳表的同學可以補習一下。

Redis 中的事務和管道

管道 Pipeline

在某些場景下我們在一次操作中可能需要執行多個命令,而如果我們只是一個命令一個命令去執行則會浪費很多網絡消耗時間,如果將命令一次性傳輸到 Redis 中去再執行,則會減少很多開銷時間。

但是需要注意的是 pipeline 中的命令并不是原子性執行的,也就是說管道中的命令到達 Redis 服務器的時候可能會被其他的命令穿插。

事務

關系型數據庫具有 ACID 特性,Redis 能保證A(原子性)和I(隔離性),D(持久性)看是否有配置 RDB或者 AOF 持久化操作,但無法保證一致性,因為 Redis 事務不支持回滾。

我們可以簡單理解為 Redis 中的事務只是比 Pipeline 多了個原子性操作,也就是不會被其他命令給分割,如上圖。

  •  multi 事務開始的標志
  •  exec 事務執行

  •  discard 清除在這個事務中放入隊列的所有命令,即解除整個事務。
  •  watch key 在事務開始前監控某個元素,如果在提交事務的時候發現這個元素的值被其他客戶端更改了則事務會運行失敗。
  •  unwatch key 解除監控

Redis常用命令總結

大圖:https://user-gold-cdn.xitu.io/2019/11/8/16e49e23acdfe101

好了,這就是這篇文章全部的內容了,對于 Redis 你還有多少遺忘的或者沒學習到的呢? 

 

責任編輯:龐桂玉 來源: 數據庫開發
相關推薦

2022-02-17 10:56:33

Redis數據系統

2022-09-21 16:25:17

Redis性能

2018-12-05 10:44:41

Redis缺點程序員

2021-03-08 08:03:44

注解Spring配置

2023-10-09 08:31:19

2024-02-26 09:36:10

toggleAPIweb

2021-03-17 13:44:14

隱私信息安全手機

2021-03-04 08:26:17

synchronizeReentrantLojava

2018-04-04 09:00:00

區塊鏈X即服務微軟

2019-09-24 09:46:35

Tomcat連接器Lifecycle

2021-03-17 10:20:14

網絡安全網絡安全技術周刊

2018-02-02 16:41:01

程序員編程Web

2022-06-24 08:20:04

CAP網絡通信

2020-05-19 13:49:43

C語言Java語言

2019-09-29 15:30:58

JavaScript框架V8

2024-04-17 08:35:04

Lua腳本Redis數據結構

2010-08-04 15:01:00

2022-11-21 18:37:40

漏測BugSOP

2021-07-18 10:40:53

大數據大數據技術

2020-10-19 08:53:08

Redis性能指標監控
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品亚洲第一区在线暖暖韩国 | 日韩欧美视频网站 | 九九久久国产 | 97国产精品视频人人做人人爱 | 中文字幕乱码一区二区三区 | 91av在线免费播放 | 色综合中文 | 国产重口老太伦 | 人人天天操 | av成人在线观看 | 日本精品一区二区 | 一区二区亚洲 | 鲁一鲁资源影视 | 国产精品久久久久久久久久三级 | 精品乱子伦一区二区三区 | 午夜精品久久久久久不卡欧美一级 | 久久久久久久综合色一本 | 亚洲精品成人 | 欧美啪啪| av一区二区三区四区 | 欧美日韩国产高清视频 | 一区二区三区欧美 | 精品国产视频 | 自拍视频网站 | 国产9 9在线 | 中文 | 激情黄色在线观看 | 欧美一区二区三 | 久久精品一区 | 成人在线精品视频 | 在线欧美亚洲 | 波多野结衣先锋影音 | 精品久久久久国产 | 一本色道精品久久一区二区三区 | 国产精品不卡 | 成人免费看电影 | www.国产一区 | 欧美综合一区二区三区 | 日韩三级一区 | 亚洲免费人成在线视频观看 | 夜夜摸天天操 | 久久精品成人 |