日韩性视频-久久久蜜桃-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的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: www.日韩一区| 久久久综合久久久 | 少妇做爰xxxⅹ性视频 | 国产成人aaaa | 99热这里只 | 国产天堂| 色小妹av | 少妇一级1淫片 | 天天操网址 | 亚洲视频网站在线 | 欧洲精品在线播放 | 91大神视频在线播放 | 国产成人精 | 亚洲综合狠狠 | 一本加勒比波多野结衣 | 欧美色图视频在线 | 国产网站大全 | 播播激情网 | 波多野结衣潜藏淫欲 | www.99re7.com| 日本国产三级xxxxxx | 黄页在线播放 | 国产天堂av在线 | 亚洲精品中文字幕在线观看 | 日本在线有码 | 精品黄色片 | 精品久久久国产 | 亚洲女人的天堂 | 免费小视频在线观看 | 久久精品一区二区三区四区 | 欧美综合视频在线 | 欧美巨大荫蒂茸毛毛人妖 | 国产在线拍揄自揄拍无码视频 | 亚洲精品综合精品自拍 | 日韩精品在线观看一区二区三区 | 国产人妻久久精品一区二区三区 | 日日爽夜夜爽 | 男女午夜网站 | 激情一区二区 | 久久一区二区电影 | 黄色成人影视 | 国产精品久久久久久久久久久久午夜片 | av999| 经典三级视频 | 天天爽夜夜爽视频 | 深夜视频在线播放 | 手机av网址 | 中文文字幕一区二区三三 | 午夜激情在线视频 | 久久美女精品 | 999zyz玖玖资源站永久 | 97视频入口 | 中文字幕无码毛片免费看 | 黄网在线观看免费 | 91九色在线播放 | 欧美黄色网络 | 天天操天天干天天操 | 亚洲成人精品视频 | 日本乱淫视频 | 国产精品.www| 日韩高清精品免费观看 | 激情综合av | 中国毛片在线观看 | 毛片看看 | www夜色| 肮脏的交易在线观看 | 手机在线成人 | 91av免费 | 黄色一级图片 | 日韩av男人的天堂 | 99精品欧美一区二区三区 | aaa日韩 | 亚洲AV成人无码网站天堂久久 | 天天射夜夜撸 | 亚洲1页 | 欧美人与禽zozzozzo | 黄色日本视频 | 男人午夜视频 | 天堂网视频 | 台湾佬美性中文娱乐网 | 黄色三级a | www日本xxx | 开心色站 | 91视频福利 | 国产欧美日韩在线观看 | 久久99国产精品 | 激情小视频| 国产美女福利在线 | 黄色av免费看 | 91av视频在线播放 | 美女精品一区 | 99免费在线 | 天天插夜夜操 | 中文字幕素人 | 成人中文字幕在线观看 | 丰满熟女一区二区三区 | 亚洲666| 色就色综合| 日韩第四页 |