Redis對象和五種常用數據類型

Redisobject 對象

對象分為鍵對象和值對象

鍵對象一般是string類型

值對象可以是string,list,set,zset,hash

q:redisobj的結構

typedef struct redisObject {  //類型  unsigned type:4;  //編碼  unsigned encoding:4;  //指向底層實現數據結構的指針  void *ptr;  //引用計數,垃圾回收的時候使用int refcount;//最近被使用的時間,內存淘汰的時候用unsigned lru; 
} robj;

q:數據類型,編碼和數據結構之間的對應 關系?

在這里插入圖片描述

Redis對象和數據結構的關系
image.png

image.png

鍵總是一個字符串對象
而值可以是五種中的一種

type 命令 得到的結果就是值的類型

image.png
image.png

可以用object encoding命令查看編碼

list數據類型的編碼由linkedlist和ziplist編碼合并成了quicklist編碼

q: 通用數據類型命令

keys *  //查看當前庫所有key    (匹配:keys *1)exists key //判斷某個key是否存在,如果鍵存在則返回1,不存在則返回0:type key //查看你的key是什么類型del key  //刪除指定的key數據,del是一個通用命令,無論值是什么數據結構類型,del命令都可以將其 刪除,返回結果為成功刪除鍵的個數,假設刪除一個不存在的鍵,就會返回 0unlink key   //根據value選擇非阻塞刪除,僅將keys從keyspace元數據中刪除,真正的刪除會在后續異步操作。expire key 10   //10秒鐘:為給定的key設置過期時間ttl key //查看還有多少秒過期,-1表示永不過期,-2表示已過期select number //命令切換數據庫dbsize //查看當前數據庫的key的數量flushdb //清空當前庫flushall //通殺全部庫

命令在執行前都會判斷 參數是否是自己可以接收,否則會返回錯誤

數據類型

string 字符串

q: 特點

其value是字符串,不過根據字符串的格式不同,又可以分為3類:

  • string:普通字符串

  • int:整數類型,可以做自增、自減操作

  • float:浮點類型,可以做自增、自減操作

q: 適用場景?

String 的常見應用場景如下:

  • 常規數據(比如 session、token、序列化后的對象、圖片的路徑)的緩存;
  • 計數比如用戶單位時間的請求數(簡單限流可以用到)、頁面單位時間的訪問數;
  • 分布式鎖(利用 SETNX key value 命令可以實現一個最簡易的分布式鎖);

q:常用命令?

 set  <key> <value> //添加鍵值對*NX:當數據庫中key不存在時,可以將key-value添加數據庫*XX:當數據庫中key存在時,可以將key-value添加數據庫,與NX參數互斥*EX:key的超時秒數*PX:key的超時毫秒數,與EX互斥get  <key> //查詢對應鍵值append <key> <value> //將給定的<value> 追加到原值的末尾,返回長度strlen <key> //獲得值的長度setnx <key> <value> //只有在 key 不存在時  設置 key 的值incr <key> //將 key 中儲存的數字值增1  只能對數字值操作,如果為空,新增值為1decr <key> //將 key 中儲存的數字值減1  只能對數字值操作,如果為空,新增值為-1incrby / decrby <key> <步長> //將 key 中儲存的數字值增減。自定義步長。mset <key1><value1><key2><value2> ..... //同時設置一個或多個 key-value對 mget <key1><key2><key3> .....  //同時獲取一個或多個 value msetnx <key1><value1><key2><value2> .....  //同時設置一個或多個 key-value 對,當且僅當所有給定 key 都不存在。 原子性,有一個失敗則都失敗getrange <key><起始位置><結束位置>  //得值的范圍,類似java中的substring,前包,后包setrange <key><起始位置><value>  //<value> 覆寫<key>所儲存的字符串值,從<起始位置>開始(索引從0開始)。setex <key><過期時間><value>  //設置鍵值的同時,設置過期時間,單位秒。getset <key><value> //以新換舊,設置了新值同時獲得舊值。

q:底層編碼方式和數據結構?

image.png

  • 當存儲的是long 數字的時候,使用int編碼,prt直接存儲數字

不包括浮點數

  • 當存儲的字符串小于44個字節的時候,使用embstr編碼,字符串和redisobject存儲在一起
  • 當存儲的字符串大于44個字節的時候,使用raw編碼,prt存儲的是sds的地址指針

set 集合

q: 特點

  • 無序

  • 元素不可重復

  • 查找快

  • 支持交集、并集、差集等功能

q: 適用場景?

應用場景:

  • 需要存放的數據不能重復的場景
    • 不可重復下單
    • 點贊
  • 需要獲取多個數據源交集、并集和差集的場景
    • 共同好友(交集)、共同粉絲(交集)、共同關注(交集)、好友推薦(差集)、音樂推薦(差集)、訂閱號推薦(差集+交集) 等場景。
  • 需要隨機獲取數據源中的元素的場景
    • 抽獎系統、隨機點名等場景。
    • 相關命令:SPOP(隨機獲取集合中的元素并移除,適合不允許重復中獎的場景)、SRANDMEMBER(隨機獲取集合中的元素,適合允許重復中獎的場景)。

q:常用命令?

sadd <key><value1><value2> .....  //將一個或多個 member 元素加入到集合 key 中,已經存在的 member 元素將被忽略smembers <key>  //取出該集合的所有值。sismember <key><value> //判斷集合<key>是否為含有該<value>值,有1,沒有0scard<key> //返回該集合的元素個數。srem <key><value1><value2> .... //刪除集合中的某個元素。spop <key> //隨機從該集合中吐出一個值。srandmember <key><n> //隨機從該集合中取出n個值。不會從集合中刪除 。smove <source><destination>value //把集合中一個值從一個集合移動到另一個集合sinter <key1><key2> //返回兩個集合的交集元素。sunion <key1><key2> //返回兩個集合的并集元素。sdiff <key1><key2> //返回兩個集合的差集元素(key1中的,不包含key2中的)

q:底層編碼方式和數據結構?

  • 當存儲的所有數據都是整數,元素數量不超過set-max-intset-entries時,Set會采用IntSet編碼,以節省內存,底層數據結構是intset
  • 當存儲的所有數據不都是整數,或元素數量超過set-max-intset-entries時,set采用hashtable編碼,底層是Dict中的key用來存儲元素,value統一為null。
    image.png

hash 哈希

q: 特點

hash也叫散列, 是一個鍵值對集合。

q: 適用場景?

hash特別適合用于存儲對象。

image.png

q:常用命令?

hset <key><field><value> <field2><value2>  //<key>集合中的 <field>鍵賦值<value>hget <key1><field> //<key1>集合<field>取出 valuehmset <key1><field1><value1><field2><value2>... //批量設置hash的值,hmset被棄用,可以用hset做到hexists<key1><field> //查看哈希表 key 中,給定域 field 是否存在。hkeys <key> //列出該hash集合的所有fieldhvals <key> //列出該hash集合的所有valuehincrby <key><field><increment> //為哈希表 key 中的域 field 的值加上增量 1  -1hsetnx <key><field><value> //將哈希表 key 中的域 field 的值設置為 value ,當且僅當域 field 不存在 .

q:底層編碼方式和數據結構?

  • Hash結構默認采用ZipList編碼,用以節省內存。 ZipList中相鄰的兩個entry 分別保存field和value;底層數據結構式ziplist

  • 當數據量較大時,Hash結構會轉為hashtable編碼,底層數據結構是Dict,觸發條件有兩個:

    • ZipList中的元素數量超過了hash-max-ziplist-entries(默認512)
    • ZipList中的任意entry大小超過了hash-max-ziplist-value(默認64字節)

節點過多,或單個節點過大

image.png

zset/sorted set 有序集合

q: 特點

  • 無重復
  • 有序

每個成員都關聯了一個評分(score),這個評分(score)被用來按照從最低分到最高分的方式排序集合中的成員。
集合的成員是唯一的,但是評分可以是重復了 。

q: 適用場景?

適合范圍或者排序的應用場景:

  • 排行榜

q:常用命令?

zadd <key><score1><value1><score2><value2>//將一個或多個 member 元素及其 score 值加入到有序集 key 當中。zrange <key><start><stop> [WITHSCORES] //返回有序集 key 中,下標在<start><stop>之間的元素,帶WITHSCORES,可以讓分數一起和值返回到結果集。zrangebyscore key minmax [withscores] [limit offset count] //返回有序集 key 中,所有 score 值介于 min 和 max 之間(包括等于 min 或 max )的成員。有序集成員按 score 值遞增(從小到大)次序排列。 zrevrangebyscore key maxmin [withscores] [limit offset count]        //同上,改為從大到小排列。 zincrby <key><increment><value>  // 為元素的score加上增量zrem <key><value> //刪除該集合下,指定值的元素 zcount <key><min><max> //統計該集合,分數區間內的元素個數 zrank <key><value> //返回該值在集合中的排名,從0開始。

q:底層編碼方式和數據結構?

  • 當滿足下面條件時,采用ziplist編碼,底層數據結構是ziplist
    • 元素數量小于zset_max_ziplist_entries,默認值128
    • 每個元素都小于zset_max_ziplist_value字節,默認值64

ziplist本身沒有排序功能,而且沒有鍵值對的概念,因此需要有zset通過編碼實現:
- ZipList是連續內存,因此score和element是緊挨在一起的兩個entry, element在前,score在后
- score越小越接近隊首,score越大越接近隊尾,按照score值升序排列
image.png

  • 否則采用zset編碼,底層是zset數據結構,zset的數據結構又指向skiplist和dict

image.png

  • SkipList:可以排序,并且可以同時存儲score和ele值(member)
  • Dict:可以鍵值存儲,并且可以根據key找value,實現O(1)的查找

二者實際上共用對象,不會造成內存的浪費

list 列表

q: 特點

雙向鏈表結構。既可以支持正向檢索和也可以支持反向檢索。

特征也與LinkedList類似:

  • 單鍵多值
  • 有序
  • 元素可以重復
  • 插入和刪除快
  • 查詢速度一般

q: 適用場景?

應用場景:

  • 常用來存儲一個有序數據,例如:朋友圈點贊列表,評論列表等。
  • 可以用來做消息隊列,只是功能過于簡單且存在很多缺陷,不建議這樣做。

q:常用命令?

lpush/rpush <key><value1><value2><value3>  //.... 從左邊/右邊插入一個或多個值。lpush是頭插法lpop/rpop <key> //從左邊/右邊吐出一個值。值在鍵在,值光鍵亡。rpoplpush <key1><key2><key1> //列表右邊吐出一個值,插到<key2>列表左邊。lrange <key><start><stop> //按照索引下標獲得元素(從左到右)lrange <key> 0 -1  //0左邊第一個,-1右邊第一個,(0 -1表示獲取所有)lindex <key><index> //按照索引下標獲得元素(從左到右)llen <key> //獲得列表長度 linsert <key> before/after <value><newvalue> //<value>的前面、后面插入<newvalue>插入值lrem <key><n><value> //從左邊刪除n個value(從左到右)lset<key><index><value> //將列表key下標為index的值替換成value

q:底層編碼方式和數據結構?

  • List的編碼方式是quicklist,底層數據結構為快速鏈表quickList,quicklist的節點又指向了ziplist

Redis 3.2 之前,List 底層實現是 LinkedList 或者 ZipList。 Redis 3.2 之后,引入了 LinkedList 和 ZipList 的結合 QuickList,List 的底層實現變為 QuickList。

image.png

首先在列表元素較少的情況下會使用一塊連續的內存存儲,這個結構是ziplist,也即是壓縮列表。(它將所有的元素緊挨著一起存儲,分配的是一塊連續的內存。)

當數據量比較多的時候才會改成quicklist。

因為普通的鏈表需要的附加指針空間太大,會比較浪費空間。比如這個列表里存的只是int類型的數據,結構上還需要兩個額外的指針prev和next。

image.png

Redis將鏈表和ziplist結合起來組成了quicklist。也就是將多個ziplist使用雙向指針串起來使用。這樣既滿足了快速的插入刪除性能,又不會出現太大的空間冗余。

數據結構

sds 簡單動態字符串

q:sds的結構

sds的結構

struct sdshdr { 
//記錄buf數組中已使用字節的數量 
//等于SDS所保存字符串的長度 
int len; 
//記錄buf數組中未使用字節的數量
int free;
//字節數組,用于保存字符串
char buf[];
};

image.png

q: sds和c字符串的區別

image.png

相同點:

  • 都是用char數組來記錄字符,最后都有一個\0來代表字符串結束

sds最后也用\0代表結束,是為了重用c語言字符串的一些函數,例如printf打印,而不用重寫所有的函數

不同點

肯定是c語言字符串存在一定的缺陷,redis才會重寫,那么這些既是redis和c語言字符串的不同點,也是redis sds的優點

  • 常數級別獲取字符串長度,sds獲取字符串長度的時間復雜度是O(1),c語言是O(n),通過len的冗余存儲來實現
  • 杜絕緩沖區溢出,字符串在拼接之前可以做內存檢查,確保空間充足,否則進行擴充;不會像c語言一樣造成內存溢出
  • 減少修改字符串時帶來的內存重分配次數,預分配空間free,來減少內存重分配的次數,可以提升性能
  • 二進制安全,c語言字符串通過\0空字符來標志字符串結束,因此不能包含空字符;而sds通過len來表示字符串結束,可以包含空字符,可以存儲圖片等二進制信息,因此是二進制安全的

q: 容量擴充機制?

如圖中所示,內部為當前字符串實際分配的空間capacity一般要高于實際字符串長度len。

  • 當字符串長度小于1M時,擴容都是加倍現有的空間
  • 如果超過1M,擴容時一次只會多擴1M的空間。需要注意的是字符串最大長度為512M。

intset 正數集合

q: intset的結構

typedef struct intset {  //編碼方式  uint32_t encoding;  //集合包含的元素數量  uint32_t length;  //保存元素的數組  int8_t contents[];  
} intset;
  • 數組升序排列
  • 沒有重復
    image.png

q: 如何升級?

當新元素很大的時候,集合要升級成更大的編碼方式
升級整數集合并添加新元素共分為三步進行:
1)根據新元素的類型,擴展整數集合底層數組的空間大小,并為新元素分配空間。
2)將底層數組現有的所有元素都轉換成與新元素相同的類型,并將類型轉換后的元素放置到正確的位上,而且在放置元素的過程中,需要繼續維持底層數組的有序性質不變。
3)將新元素添加到底層數組里面。

image.png
image.png

?升級操作為整數集合帶來了操作上的靈活性,并且盡可能地節約了內存。
?整數集合只支持升級操作,不支持降級操作。

dictht 哈希表

typedef struct dictht {  //哈希表數組  dictEntry **table;  //哈希表大小  unsigned long size;  //哈希表大小掩碼,用于計算索引值  //總是等于size-1  unsigned long sizemask;  //該哈希表已有節點的數量  unsigned long used;  
} dictht;

哈希表結點

typedef struct dictEntry {  //鍵  void *key;  //值  union{  void *val;  uint64_tu64;  int64_ts64;  } v;  //指向下個哈希表節點,形成鏈表  struct dictEntry *next;  
} dictEntry;

image.png

q:如何解決哈希沖突?

用拉鏈法的頭插法解決哈希沖突
image.png

dict 字典

typedef struct dict {  //類型特定函數  dictType *type;  //私有數據  void *privdata;  //哈希表  dictht ht[2];  // rehash索引  //當rehash不在進行時,值為-1  in trehashidx; /* rehashing not in progress if rehashidx == -1 */  
} dict;

image.png

ht有兩個,一般只使用第一個,第二個哈希表只在rehash的時候用

插入數據的時候,先計算哈希值,再計算索引值,再插入到指定位置

q : 如何rehash?

隨著操作的不斷執行,哈希表保存的鍵值對會逐漸地增多或者減少,為了讓哈希表的負載因子(load factor)維持在一個合理的范圍之內,當哈希表保存的鍵值對數量太多或者太少時,程序需要對哈希表的大小進行相應的擴展或者收縮。

擴展和收縮哈希表的工作可以通過執行rehash(重新散列)操作來完成,Redis對字典的哈希表執行rehash的步驟如下:

1)為字典的ht[1]哈希表分配空間,這個哈希表的空間大小取決于要執行的操作,以及ht[0]當前包含的鍵值對數量(也即是ht[0].used屬性的值):
?如果執行的是擴展操作,那么ht[1]的大小為第一個大于等于ht[0].used*2的2 n(2的n次方冪);
?如果執行的是收縮操作,那么ht[1]的大小為第一個大于等于ht[0].used的2 n。

2)將保存在ht[0]中的所有鍵值對rehash到ht[1]上面:rehash指的是重新計算鍵的哈希值和索引值,然后將鍵值對放置到ht[1]哈希表的指定位置上。

3)當ht[0]包含的所有鍵值對都遷移到了ht[1]之后(ht[0]變為空表),釋放ht[0],將ht[1]設置為ht[0],并在ht[1]新創建一個空白哈希表,為下一次rehash做準備。

為ht[1]分配空間,復制ht[0]的數據到ht[1],釋放ht[0],把ht[1]設為ht[0],ht[1]創建一個空哈希表
image.png
image.png
image.png
image.png

q:什么時候rehash

哈希表的擴展與收縮
哈希表的擴展與收縮當以下條件中的任意一個被滿足時,程序會自動開始對哈希表執行擴展操作:
1)服務器目前沒有在執行BGSAVE命令或者BGREWRITEAOF命令,并且哈希表的負載因子大于等于1。
2)服務器目前正在執行BGSAVE命令或者BGREWRITEAOF命令,并且哈希表的負載因子大于等于5。

為什么rehash是漸進式?

如果ht[0]的數據非常多,那么把數據全部轉移到ht[1]將會非常耗費時間,因此這個過程是分多次,漸進式完成的
rehashidx記錄了正在轉移的索引下標,當轉移完成,會置為-1

image.png
image.png
image.png
image.png
因為在進行漸進式rehash的過程中,字典會同時使用ht[0]和ht[1]兩個哈希表,所以在漸進式rehash進行期間,字典的刪除(delete)、查找(find)、更新(update)等操作會在兩個哈希表上進行。例如,要在字典里面查找一個鍵的話,程序會先在ht[0]里面進行查找,如果沒找到的話,就會繼續到ht[1]里面進行查找,諸如此類。

另外,在漸進式rehash執行期間,新添加到字典的鍵值對一律會被保存到ht[1]里面,而ht[0]則不再進行任何添加操作,這一措施保證了ht[0]包含的鍵值對數量會只減不增,并隨著rehash操作的執行而最終變成空表。

ziplist 壓縮列表

q: ziplist的結構?

image.png
每個壓縮列表節點可以保存一個字節數組或者一個整數值

image.png

q: ziplist過大的時候有什么缺點?

當ziplist變得很?的時候,它有如下幾個缺點:

  • 每次插?或修改引發的realloc操作會有更?的概率造成內存拷貝,從而降低性能。
  • ?旦發生內存拷貝,內存拷貝的成本也相應增加,因為要拷貝更?的?塊數據。
  • 當ziplist數據項過多的時候,在它上?查找指定的數據項就會性能變得很低,因為ziplist上的查找需要進行遍歷。

skiplist 跳表

skiplist是多層級不同跨度的鏈表

q: skiplist的結構?

image.png

zsikpList

typedef struct zskiplist {  //表頭節點和表尾節點  structz skiplistNode *header, *tail;  //表中節點的數量  unsigned long length;  //表中層數最大的節點的層數  int level;  
} zskiplist;

zskipListNode

typedef struct zskiplistNode {  //層  struct zskiplistLevel {  //前進指針  struct zskiplistNode *forward;  //跨度  unsigned int span;  } level[];  //后退指針  struct zskiplistNode *backward;  //分值  double score;  //成員對象  robj *obj;  
} zskiplistNode;

每個結點的成員對象是唯一的,但是分值可以相同,分值相同就按照成員對象由小到大排序,整個鏈表都是按照分值由小到大排序

image.png

q: skiplist如何遍歷?

遍歷:
首先遍歷高層級跨度大的指針,如果過大,就遍歷下一層級

zset

q:zset的結構?

typedef struct zset {  zskiplist *zsl;  dict *dict;  
} zset;

image.png

  • SkipList:可以排序,并且可以同時存儲score和ele值(member)
  • Dict:可以鍵值存儲,并且可以根據key找value,實現O(1)的查找

二者實際上共用對象,不會造成內存的浪費

quicklist 快表

q:quicklist的結構

quicklist 實際上是 zipList 和 linkedList 的混合體,它將 linkedList 按段切分,每一段使用 zipList 來緊湊存儲,多個 zipList 之間使用雙向指針串接起來。

image.png

typedef struct quicklist {  quicklistNode *head;  quicklistNode *tail;  unsigned long count;        /* total count of all entries in all ziplists */  unsigned long len;           
} quicklist;
typedef struct quicklistNode {  struct quicklistNode *prev; //上一個node節點  struct quicklistNode *next; //下一個node  unsigned char *zl;            //保存的數據 壓縮前ziplist 壓縮后壓縮的數據  unsigned int sz;             /* ziplist size in bytes */  unsigned int count : 16;     /* count of items in ziplist */  } quicklistNode;

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/40254.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/40254.shtml
英文地址,請注明出處:http://en.pswp.cn/news/40254.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

webrtc Thread 和 TaskQueue 的 應用和思考

webrtc Thread 和 TaskQueue 的 應用和思考 Thread #include "rtc_base/thread.h"void FunctionToRunOnThread() {// Your threaded logic here.printf("Function running on the thread!\n"); }int main() {rtc::Thread* thread rtc::Thread::Create()…

WebService—XFire配置筆記

在學習之前,一直以為WebService就是一個工具,在兩個服務器之間建立一個通信,幫我們把需要傳輸的數據組織成規范的XML數據并發送到目的地,實際情況也確實是這樣的,不過更高級一點的是,XFire不但可以幫我們生成XML發送,而且可以在接收了xml之后還可以直接返回對象給我們用…

iptabels路由轉發

要配置iptables進行路由轉發&#xff0c;需要執行以下步驟&#xff1a; 確保系統已經開啟了IP轉發功能。可以通過執行以下命令來檢查&#xff1a; sysctl net.ipv4.ip_forward如果返回的值為1&#xff0c;表示已經開啟了IP轉發功能。如果返回的值為0&#xff0c;可以通過執行…

神經網絡基礎-神經網絡補充概念-29-為什么使用深層表示

概念 深層表示&#xff08;Deep Representation&#xff09;是指在深度神經網絡的多個隱藏層中逐層提取和學習數據的特征表示。 使用深層表示的原因 高維特征提取&#xff1a;深層神經網絡可以從原始數據中自動學習高維抽象特征。每個隱藏層都對數據進行一些變換&#xff0c…

“深入探索JVM內部機制:解密Java虛擬機的奧秘“

標題&#xff1a;深入探索JVM內部機制&#xff1a;解密Java虛擬機的奧秘 摘要&#xff1a;本文將深入探索Java虛擬機&#xff08;JVM&#xff09;的內部機制&#xff0c;介紹JVM的基本原理、運行時數據區域以及垃圾回收機制&#xff0c;并通過示例代碼解釋這些概念。 正文&am…

PG-DBA培訓14:PostgreSQL數據庫升級與遷移

一、風哥PG-DBA培訓14&#xff1a;PostgreSQL數據庫升級與遷移 課程目標&#xff1a; 本課程由風哥發布的基于PostgreSQL數據庫的系列課程&#xff0c;本課程屬于PostgreSQL備份恢復與遷移升級階段之PostgreSQL數據庫升級與遷移&#xff0c;學完本課程可以PostgreSQL數據庫升…

炒股票怎么加杠桿_融資融券賬戶怎么開通

炒股票作為一種投資方式&#xff0c;可以帶來不錯的回報。然而&#xff0c;對于那些希望以較小的資金獲得更高收益的投資者來說&#xff0c;加杠桿炒股票是一個值得考慮的選擇。本文將為您介紹加杠桿炒股票的意義&#xff0c;以及如何開通融資融券賬戶。 加杠桿炒股票的意義&a…

Centos8安裝docker并配置Kali Linux圖形化界面

鑒于目前網上沒有完整的好用的docker安裝kali桌面連接的教程&#xff0c;所以我想做一個。 準備工作 麻了&#xff0c;這服務器供應商提供的鏡像是真的純凈&#xff0c;純凈到啥都沒有。 問題一&#xff1a;Centos8源有問題 Error: Failed to download metadata for repo ap…

vue入門(增查改!)

<template><div><!-- 搜索欄 --><el-card id"search"><el-row><el-col :span"20"><el-input v-model"searchModel.name" placeholder"根據名字查詢"></el-input><el-input v-mode…

STM32 FLASH 讀寫數據

1. 《STM32 中文參考手冊》&#xff0c;需要查看芯片數據手冊&#xff0c;代碼起始地址一般都是0x8000 0000&#xff0c;這是存放整個項目代碼的起始地址 2. 編譯信息查看代碼大小&#xff0c;修改代碼后第一次編譯后會有這個提示信息 2.1 修改代碼后編譯&#xff0c;會有提示…

python3.73安裝教程,python3.10安裝教程

大家好&#xff0c;小編來為大家解答以下問題&#xff0c;python3.73安裝教程&#xff0c;python3.10安裝教程&#xff0c;現在讓我們一起來看看吧&#xff01; Python目前已支持所有主流操作系統&#xff0c;在Linux,Unix,Mac系統上自帶Python環境&#xff0c;一般默認裝的是P…

你敢信?代碼小白30min就能搭建一套酷炫級的駕駛艙!

大量研究結果表明&#xff0c;人類通過圖像獲取信息的速度比通過閱讀文字獲取信息的速度要快很多。 近幾年&#xff0c;數據可視化在企業中越發“流行”&#xff0c;將數字以可視化的形式展示&#xff0c;不僅清晰明了地展現企業真正的實力&#xff0c;也能讓管理者快速了解細節…

PG-DBA培訓12:PostgreSQL物理備份與恢復實戰

一、風哥PG-DBA培訓12&#xff1a;PostgreSQL物理備份與恢復實戰 課程目標&#xff1a; 本課程由風哥發布的基于PostgreSQL數據庫的系列課程&#xff0c;本課程屬于PostgreSQL備份恢復與遷移升級階段之PostgreSQL物理備份與恢復實戰&#xff0c;學完本課程可以掌握&#xff1…

Linux6.39 Kubernetes Pod控制器

文章目錄 計算機系統5G云計算第三章 LINUX Kubernetes Pod控制器一、Pod控制器及其功用二.pod控制器有多種類型1.ReplicaSet2.Deployment3.DaemonSet4.StatefulSet5.Cronjob 三、Pod與控制器之間的關系1.Deployment2.SatefulSet1&#xff09;為什么要有headless2&#xff09;為…

gulimall-緩存-緩存使用

文章目錄 前言一、本地緩存與分布式緩存1.1 使用緩存1.2 本地緩存1.3 本地模式在分布式下的問題1.4 分布式緩存 二、整合redis測試2.1 引入依賴2.2 配置信息2.3 測試 三、改造三級分類業務3.1 代碼改造 四、高并發下緩存失效問題4.1 緩存穿透4.2 緩存雪崩4.3 緩存擊穿 五、分布…

C++學習第十二天----指針

1.自動存儲&#xff0c;靜態存儲和動態存儲 c有3種管理數據內存的方式&#xff1a;自動存儲&#xff0c;靜態存儲和動態存儲&#xff08;有時也叫自由存儲空間或堆&#xff09;&#xff1b;C其實還有第4種類型----線程存儲&#xff1b; 第一&#xff0c;自動存儲&#xff0c;在…

Talk | ICCV‘23 HumanMAC:簡潔易拓展的人體動作預測新框架

? 本期為TechBeat人工智能社區第522期線上Talk&#xff01; 北京時間8月16日(周三)20:00&#xff0c;清華大學博士生—陳凌灝的Talk已準時在TechBeat人工智能社區開播&#xff01; 他與大家分享的主題是: “HumanMAC-簡潔易拓展的人體動作預測新框架”&#xff0c;介紹了人體動…

linux 學習————LNMP之分布式部署

目錄 一、概述 二、LNMP環境部署 三、配置nginx 四、 配置php使nginx能夠解析.php 五、配置mysql 六、配置discuz進行登錄論壇訪問測試 一、概述 LNMP代表 Linux、Nginx、MySQL、PHP&#xff0c;是一種常用的服務器架構。它由以下組件組成&#xff1a; Linux&#xff1a;作…

【js】js中apply()、bind()、call()用法

這三個方法的作用基本上相同&#xff0c;用法上有一些不同&#xff0c;下面先對比一下它們的用法&#xff1a; apply&#xff1a;調用一個具有給定 this 值的函數&#xff0c;以及以一個數組&#xff08;或一個類數組對象&#xff09;的形式提供的參數。 語法&#xff1a; ap…

Metasploitable2靶機漏洞復現

一、信息收集 nmap掃描靶機信息 二、弱口令 1.系統弱口令 在Kali Linux中使用telnet遠程連接靶機 輸入賬號密碼msfadmin即可登錄 2.MySQL弱口令 使用mysql -h 靶機IP地址即可連接 3.PostgreSQL弱密碼登錄 輸入psql -h 192.168.110.134 -U postgres 密碼為postgres 輸入\…