日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

和redis_Redis 缓存

發(fā)布時(shí)間:2023/12/20 数据库 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 和redis_Redis 缓存 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

使用場景#

  • Redis 通常用作web應(yīng)用的內(nèi)存緩存,和Django,Ruby-on-Rails,Node.js以及Flask框架結(jié)合
  • Redis在存儲(chǔ)新的數(shù)據(jù)的過程中可以清除陳舊的數(shù)據(jù)。
  • Redis使用Less Recently Used(LRU)策略,可以為每個(gè)健設(shè)置過期時(shí)間
  • Redis 存儲(chǔ)指標(biāo)數(shù)據(jù)用于量化網(wǎng)站的使用情況和用戶行為數(shù)據(jù)
  • Redis可用作不同系統(tǒng)之間的通訊層,通過訂閱推送消息模型

數(shù)據(jù)模型#

  • 字符串 簡單動(dòng)態(tài)字符串,Redis底層使用的一種簡單動(dòng)態(tài)字符串的抽象類型。
struct sdshdr { in length: # 記錄buf中已使用字節(jié)的數(shù)量 int free; # 記錄bug數(shù)組中未使用的字節(jié)的數(shù)量 char buf[]; # 字節(jié)數(shù)組保存字符串}

優(yōu)點(diǎn):

  • 可以O(shè)(1)獲取存儲(chǔ)的鍵值的長度
  • 杜絕緩沖區(qū)溢出
  • 減少修改字符串帶來的內(nèi)存重分配次數(shù)【【【【【【【
  • 列表 列表的底層實(shí)現(xiàn)就是一個(gè)鏈表,鏈表的每個(gè)節(jié)點(diǎn)保存一個(gè)鍵值。
typedef struct listNode { struct listNode *prev; #前置節(jié)點(diǎn) struct listNode *next; #后置節(jié)點(diǎn) void *value; #節(jié)點(diǎn)的值} listNodetypedef struct list { listNode *head; #頭節(jié)點(diǎn) listNode *tail; #尾節(jié)點(diǎn) unsigned long len; #節(jié)點(diǎn)數(shù)量 void *(*dup)(void *ptr); #節(jié)點(diǎn)復(fù)制函數(shù) void (*free)(void *ptr); #節(jié)點(diǎn)釋放函數(shù) int (*match)(void *ptr, void *key) #節(jié)點(diǎn)值對比函數(shù)}

示例:

127.0.0.1:6379> RPUSH integers 0 1 2 3 4 5 6(integer) 7127.0.0.1:6379> LLEN integers(integer) 7127.0.0.1:6379> LRANGE integers 0 101) "0"2) "1"3) "2"4) "3"5) "4"6) "5"7) "6"
  • 字典 Redis的字典使用哈希表作為底層實(shí)現(xiàn),一個(gè)哈希表里可以有多個(gè)哈希表節(jié)點(diǎn),每個(gè)哈希表節(jié)點(diǎn)就保存了字典中的 一個(gè)鍵值對。
typedef struct dictht { dictEntry **table; #哈希表數(shù)組 unsigned long size; #哈希表大小 unsigned long sizemask; #哈希表大小掩碼 unsigned long used; #該哈希表已有節(jié)點(diǎn)的數(shù)量}dicthttypedef struct dictEntry { void *key; union { void *val; uint64_tu64; int64_ts64; } v; struct dictEntry next;}dictEntrytypedef struct dict { dictType * type; # 類型特定函數(shù) void *privatedata; # 私有數(shù)據(jù) dictht ht[2]; # 哈希表 int rehashidx; #rehash 索引}

當(dāng)有一個(gè)新的鍵值對添加到字典中時(shí),字典會(huì)對鍵進(jìn)行哈希,得到哈希值后在和掩碼進(jìn)行與運(yùn)算得到最終的哈希值 當(dāng)有兩個(gè)以上的鍵被分配到同一個(gè)哈希表數(shù)組的同一個(gè)索引上時(shí),此時(shí)會(huì)產(chǎn)生鍵沖突。一般解決沖突有兩種方法, 一種是Rehash,一種是鏈地址法。

  • 鏈地址法: 每個(gè)哈希表都有一個(gè)next指針,多個(gè)哈希表節(jié)點(diǎn)可以用next指針構(gòu)成一個(gè)單向鏈表,被分配到同一個(gè) 索引上的多個(gè)節(jié)點(diǎn)可以用這個(gè)單向鏈表連接起來
  • Rehash: 隨著哈希表中鍵值對增多和減少,為了使負(fù)載因子維持在一個(gè)合理的范圍,需要對哈希表進(jìn)行Rehash - 擴(kuò)展,申請ht[1]的大小為大于ht[0].used*2的第一個(gè)2的次方的數(shù),收縮,ht[1]為ht[0].used的第一個(gè)2的N次方的數(shù)。 - 執(zhí)行rehash將ht[0]中的數(shù)值映射到ht[1]上 - 將ht[1]設(shè)置為ht[0],ht[1]新建一個(gè)空白哈希表
  • 跳躍表 跳躍表是一種有序數(shù)據(jù)結(jié)構(gòu),它通過在每個(gè)節(jié)點(diǎn)中維持多個(gè)指向其他節(jié)點(diǎn)的指針,從而達(dá)到快速訪問節(jié)點(diǎn)的目.Redis使用跳躍表來實(shí)現(xiàn)有序集合鍵,和集群節(jié)點(diǎn)中的內(nèi)部數(shù)據(jù)結(jié)構(gòu). redis使用的是zskiplist結(jié)構(gòu)

zskiplist包含以下屬性: header: 指向跳躍表的表頭節(jié)點(diǎn) tail: 指向跳躍表的表尾節(jié)點(diǎn) level: 記錄目前跳躍表內(nèi),層數(shù)最大的那個(gè)節(jié)點(diǎn)的層數(shù) length: 記錄跳躍表的長度即跳躍表目前包含的節(jié)點(diǎn)的數(shù)量

typedef struct zskiplistNode { struct zskiplistLevel { struct zskiplistNode *forward; unsigned int span; } level[]; struct zskiplistNode *backward; double score; robj *obj} zskiplistNodetypedef struct zskiplist{ structz skiplistNode *header, *tail; unsigned long length; int level;} zskiplist;

常用命令#

在設(shè)計(jì)Redis存儲(chǔ)結(jié)構(gòu)的時(shí)候,主要要考慮鍵和數(shù)據(jù)結(jié)構(gòu)兩方面 如果使用SET或者GETSET命令去更新鍵值, 鍵值的過期時(shí)間會(huì)被清除

127.0.0.1:6379> EXPIRE tea/1/box1/bag/8 300(integer) 1127.0.0.1:6379> TTL tea/1/box1/bag/8(integer) 260127.0.0.1:6379> SET tea/1/box1/bag/8 brewOK127.0.0.1:6379> TTL tea/1/box1/bag/8(integer) -1

總結(jié)

以上是生活随笔為你收集整理的和redis_Redis 缓存的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。