您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“Redis數(shù)據(jù)結(jié)構(gòu)及簡單操作指令”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Redis數(shù)據(jù)結(jié)構(gòu)及簡單操作指令”吧!
1.Redis數(shù)據(jù)結(jié)構(gòu)及簡單操作指令
String、list、set、hash、zset(有序set)
總體來說redis都是通過Key-Value的形式來存儲數(shù)據(jù)的。只是不用數(shù)據(jù)類型Value的形式不同。
String:最簡單數(shù)據(jù)結(jié)構(gòu),比如我們將一個對象轉(zhuǎn)成json串來存儲
set key value 存放數(shù)據(jù)
get key 獲取數(shù)據(jù)
exists key 查看數(shù)據(jù)是否存在,存在返回1否則0
del key 刪除數(shù)據(jù) 返回操作成功的條數(shù)
mset key1 value1 key2 value2 key3 value3...存放多組數(shù)據(jù)
mget key1 ke2y key3... 獲取多個key的數(shù)據(jù),返回一個集合,類似Map的values方法
expire key second 設(shè)置key 過去時間,單位秒
setex key second value設(shè)置key 過去時間,單位秒(等價于先set,再expire)
setnx key value 如果key不存在就set 返回1.如果存在返回0(可以基于此實現(xiàn)分布式鎖)
List:并不是java里面的list,redis的list更像一個鏈表或者說隊列/棧的結(jié)構(gòu)。這就意味著它的刪除插入快,但是通過索引定位就比較慢了。當列表彈出了最后一個元素之后,該數(shù)據(jù)結(jié)構(gòu)自動被刪除,內(nèi)存被回收。
Redis 的列表結(jié)構(gòu)常用來做異步隊列使用。將需要延后處理的任務(wù)塞進 Redis 的列表,另一個線程從這個列表中輪詢數(shù)據(jù)進行處理。
rpush key value1 value2 value3... 插入list數(shù)據(jù)
llen key 查看長度
lpop key 按加入順序獲取(先進先出,類似隊列)
rpop key 后進先出,有點類似棧
列表取數(shù)據(jù),取完后整個列表都被回收了,就是說只能取一次數(shù)據(jù)。
Hash:類似java的hashMap,和字符串相比,我們存儲數(shù)據(jù)的時候可以只存儲對象的部分屬性,而字符串則需要完整將整個對象轉(zhuǎn)換。當然hash存儲結(jié)構(gòu)的消耗肯定是高于字符串的
hset redisKey hashKey1 value1
hset redisKey hashKey2 value2 插入數(shù)據(jù)
hgetall redisKey 獲取數(shù)據(jù),key value間隔出現(xiàn)
hlen redisKey 查看hash長度
hget redisKey hashKey 獲取hashKey 對應的value
hmset redisKey hashKey1 value1 hashKey2 value2 hashKey2 value3 批量插入值
Set : 類似HashSet,但是list類似,最后一個數(shù)據(jù)取完之后,該結(jié)構(gòu)會被清理,無法再次獲取數(shù)據(jù)
sadd key value
sadd key value1 value2 批量添加
smembers key 查看所有
sismember key value 查詢某個值是否存在,存在返回1
scard key 查看大小
spop key 獲取一個元素
原子計數(shù)操作
如果value是整數(shù)的話還可以實現(xiàn)自增操作(也可以用于實現(xiàn)分布式鎖,該增長有限,最大到long max,超過該值會直接報錯)
incr key 自增 如果key不存在默認從0自增1
incrby key step 設(shè)置增加步長step
2.redis持久化
雖然說redis都是內(nèi)存級別的操作,其實也是有持久化的。
一種是基于RDB快照,
Redis 將內(nèi)存數(shù)據(jù)庫快照保存在名字為 dump.rdb 的二進制文件中。
可以對 Redis 進行設(shè)置, 讓它在N 秒內(nèi)數(shù)據(jù)集至少有 M 個改動這一條件被滿足時, 自動保存一次數(shù)據(jù)集。
另一種是AOF(append-only file)
快照并不可靠,上次快照之后,還未到達下一次快照條件時,這時候服務(wù)出現(xiàn)了問題,那么這期間的數(shù)據(jù)是無法保存到快照版本中的。這個時候就需要AOF了,它將每一條指令都記錄進文件,當redis重啟的時候,重新執(zhí)行這個文件里面指令,就可以恢復所有的數(shù)據(jù)到內(nèi)存中了。
可以通過配置appendonly yes 來開啟AOF,默認是關(guān)閉的
AOF也有三種同步數(shù)據(jù)的策略,
每次有操作都去刷新文件,很慢,但安全
每秒同步刷新一次:可能會丟失一秒內(nèi)的數(shù)據(jù)
從不同步同步刷新:讓操作系統(tǒng)在需要的時候刷新數(shù)據(jù),不安全
默認的是每秒刷一次
混合持久化:
RDB快照數(shù)據(jù)恢復速度快,但是可能會有大量數(shù)據(jù)丟失,所以通常恢復數(shù)據(jù)還是用的AOF日志重放,但是AOF相對來說速度會很慢,尤其是在數(shù)據(jù)量大的時候。因此在4.0的時候帶來了混合持久化,也就是AOF在刷新的時候,先記錄上次的快照版本,然后記錄上次快照版本到現(xiàn)在的增量操作,然后合并成一個文件,覆蓋原來的appendonly.aof文件。Redis重啟的時候,先加載RDB快照的內(nèi)容,在重放AOF日志中增量操作的內(nèi)容就可以了。
開啟混合持久化:aof-use-rdb-preamble yes
混合持久化中appendonly.aof內(nèi)容格式,一部分是RDB文件內(nèi)容格式,另外的才是AOF文件的內(nèi)容格式。
3.緩存淘汰策略:
當 Redis 內(nèi)存超出物理內(nèi)存限制時,內(nèi)存的數(shù)據(jù)會開始和磁盤產(chǎn)生頻繁的交換 。會讓 Redis 的性能急劇下降,對于訪問量比較頻繁的 Redis 來說,這樣存取效率基本上等于不可用。
在生產(chǎn)環(huán)境中我們是不允許 Redis 出現(xiàn)交換行為的,為了限制最大使用內(nèi)存,Redis 提供了配置參數(shù) maxmemory 來限制內(nèi)存超出期望大小。
當實際內(nèi)存超出 maxmemory 時,Redis 提供了幾種可選策略 (maxmemory-policy) 來讓用戶自己決定該如何騰出新的空間以繼續(xù)提供讀寫服務(wù)。
noeviction 不會繼續(xù)處理寫請求 (del,read請求可以繼續(xù)進行)。這樣可以保證不會丟失數(shù)據(jù),但是會讓線上的寫相關(guān)的業(yè)務(wù)不能持續(xù)進行。這是默認的淘汰策略。
volatile-lru 嘗試淘汰設(shè)置了過期時間的 key,最少使用的 key 優(yōu)先被淘汰。沒有設(shè)置過期時間的 key 不會被淘汰,這樣可以保證需要持久化的數(shù)據(jù)不會突然丟失。
volatile-ttl 跟上面一樣,除了淘汰的策略不是 LRU,而是 key 的剩余壽命 ttl 的值,ttl 越小越優(yōu)先被淘汰。
volatile-random 跟上面一樣,不過淘汰的 key 是過期 key 集合中隨機的 key。
allkeys-lru 區(qū)別于 volatile-lru,這個策略要淘汰的 key 對象是全體的 key 集合,而不只是過期的 key 集合。這意味著沒有設(shè)置過期時間的 key 也會被淘汰。
allkeys-random 跟上面一樣,不過淘汰的策略是隨機的 key。
volatile-xxx 策略只會針對帶過期時間的 key 進行淘汰,allkeys-xxx 策略會對所有的 key 進行淘汰。如果你只是拿 Redis 做緩存,那應該使用 allkeys-xxx,客戶端寫緩存時不必攜帶過期時間。如果你還想同時使用 Redis 的持久化功能,那就使用 volatile-xxx 策略,這樣可以保留沒有設(shè)置過期時間的 key,它們是永久的 key 不會被 LRU 算法淘汰。
到此,相信大家對“Redis數(shù)據(jù)結(jié)構(gòu)及簡單操作指令”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學習!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。