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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

Redis从入门到放弃系列(一) String

發布時間:2025/7/14 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Redis从入门到放弃系列(一) String 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Redis從入門到放棄系列(一) String

本文例子基于:5.0.4 字符串是Redis中最常見的數據結構,底層是采用SDS,是可以修改的字符串,類似ArrayList,采用預分配冗余空間的方式來減少內存的頻繁分配。

首先讓我們來看一下該如何在redis里面使用字符串這種類型

// 將字符串 value 關聯到 key // 如果key 已經有值了,直接覆蓋 emmmm.跟我們使用HashMap是不是很像~ // 如果已經存在一個帶有過期時間的key,我們重新set會將原先的過期時間清除 (重點) >set key value [expiration EX seconds|PX milliseconds] [NX|XX] 復制代碼
可選參數:[expiration EX seconds|PX milliseconds] [NX|XX]

我們發現 set 方法存在兩個可選參數 [expiration EX seconds|PX milliseconds] 跟 [NX|XX]

>EX seconds:將鍵的過期時間設置為 seconds 秒。 執行 SET key value EX seconds 的效果等同于執行 SETEX key seconds value >PX milliseconds:將鍵的過期時間設置為 milliseconds 毫秒。 執行 SET key value PX milliseconds 的效果等同于執行 PSETEX key milliseconds value >NX:只在鍵不存在時, 才對鍵進行設置操作。 執行 SET key value NX 的效果等同于執行 SETNX key value >XX:只在鍵已經存在時, 才對鍵進行設置操作 復制代碼

##代碼示例:

//對不存在的健設置 >set name "black-search" OK >get name "black-search" ---------------------------------- //對已經存在的值設置 >set name "new-black-search" OK >get name "new-black-search" ---------------------------------- //使用 ex seconds >set name "black-search" ex 10 OK >get name "black-search" //獲取key的有效時間 >ttl name (integer) 6 //稍微等一會再執行下面的命令 >get name (nil) ---------------------------------- // 使用nx >set name "black-search" nx OK >set name "black-search" nx (nil) ---------------------------------- // 使用xx >set name "new-black-search" xx OK //讓我們設置一個不存在的key >set key value xx (nil) 復制代碼

至此,redisset的用法先告一段落.


debug object key

我們在使用redis進行普通的set處理的時候,我們會使用一下這樣子的方式去設置:

>set name "black-search" OK // redis提供的調試 api >debug object name Value at:0x179d060 refcount:1 encoding:embstr serializedlength:13 lru:14160370 lru_seconds_idle:17 復制代碼

從上面的輸出我們重點關注一下serializedlength:13,我們輸入的明明長度就只有12,為嘛會輸出13呢~ 其實是redis里面幫我們做了處理,redis會在字符的結尾使用'\0'結尾

因為傳統C字符串符合ASCII編碼,這種編碼的操作的特點就是:遇零則止 。即,當讀一個字符串時,只要遇到’\0’結尾,就認為到達末尾,就忽略’\0’結尾以后的所有字符。因此,如果傳統字符串保存圖片,視頻等二進制文件,操作文件時就被截斷了 所以在這里讀者是不是也像我一樣去實踐了?

127.0.0.1:6379> set name "ssssssss\0 asdasdasdasd" OK 127.0.0.1:6379> get name "ssssssss0 asdasdasdasd" 127.0.0.1:6379> set name "asdasdasd \\0 asdasdasdasd " OK 127.0.0.1:6379> get name "asdasdasd \\0 asdasdasdasd " 127.0.0.1:6379> set name "asdasdasd'\0' asdasdasdasdasd" OK 127.0.0.1:6379> get name "asdasdasd'0' asdasdasdasdasd" 127.0.0.1:6379> set name "asdasdasd '\\0'asdasdasd" OK 127.0.0.1:6379> get name "asdasdasd '\\0'asdasdasd" 復制代碼

哈哈,其實這里redis已經做了過濾了呢~

sds sdscatrepr(sds s, const char *p, size_t len) {s = sdscatlen(s,"\"",1);while(len--) {switch(*p) {case '\\':case '"':s = sdscatprintf(s,"\\%c",*p);break;case '\n': s = sdscatlen(s,"\\n",2); break;case '\r': s = sdscatlen(s,"\\r",2); break;case '\t': s = sdscatlen(s,"\\t",2); break;case '\a': s = sdscatlen(s,"\\a",2); break;case '\b': s = sdscatlen(s,"\\b",2); break;default:if (isprint(*p))s = sdscatprintf(s,"%c",*p);elses = sdscatprintf(s,"\\x%02x",(unsigned char)*p);break;}p++;}return sdscatlen(s,"\"",1); } 復制代碼

回到開頭

我們說字符串類似Java的ArrayList,那么它每次是怎樣擴容呢?

//sds.h #define SDS_MAX_PREALLOC (1024*1024) //sds.c sds sdsMakeRoomFor(sds s, size_t addlen) {void *sh, *newsh;size_t avail = sdsavail(s);size_t len, newlen;char type, oldtype = s[-1] & SDS_TYPE_MASK;int hdrlen;/* Return ASAP if there is enough space left. */if (avail >= addlen) return s;len = sdslen(s);sh = (char*)s-sdsHdrSize(oldtype);newlen = (len+addlen);if (newlen < SDS_MAX_PREALLOC)newlen *= 2;elsenewlen += SDS_MAX_PREALLOC;type = sdsReqType(newlen);/* Don't use type 5: the user is appending to the string and type 5 is* not able to remember empty space, so sdsMakeRoomFor() must be called* at every appending operation. */if (type == SDS_TYPE_5) type = SDS_TYPE_8;hdrlen = sdsHdrSize(type);if (oldtype==type) {newsh = s_realloc(sh, hdrlen+newlen+1);if (newsh == NULL) return NULL;s = (char*)newsh+hdrlen;} else {/* Since the header size changes, need to move the string forward,* and can't use realloc */newsh = s_malloc(hdrlen+newlen+1);if (newsh == NULL) return NULL;memcpy((char*)newsh+hdrlen, s, len+1);s_free(sh);s = (char*)newsh+hdrlen;s[-1] = type;sdssetlen(s, len);}sdssetalloc(s, newlen);return s; } 復制代碼

從上面的代碼可以看到,當字符串長度小于 1M 時,擴容都是加倍現有的空間,如果超過 1M,擴容時一次只會多擴 1M 的空間。(字符串最大長度為 512M)

應用場景

1.儲存業務數據

>set user:1 '{"id":1,"name":"黑搜丶D","wechat":"black-search"}' 復制代碼

2.自增ID 當 value的值為整數類型時,redis可以把它當做是整數一樣進行自增(incr)自減(decr)操作。由于 redis 所有的操作都是原子性的,所以不必擔心多客戶端連接時可能出現的事務問題。

總結

以上是生活随笔為你收集整理的Redis从入门到放弃系列(一) String的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。