Redis--String和Hash

String類型
在Redis中value可以爲整數、浮點數、字符串,如果設置的爲整數、字符串,Redis會自動轉爲整數和浮點數,
可以執行自增自減操作,如果對一個字符串執行自增自減,那麼會返回異常。

  • set命令
    做數據緩存,比如耗死是數據查詢,可以通過sql進行哈希後的值作爲key,值作爲value。緩解數據庫壓力。

  • setnx
    不存在則設置值,返回1,存在則直接返回0,作爲分佈式鎖的核心命令。

  • getset
    返回之前的值,將key設置爲新的值。

value最大存儲的數據爲512MB。

背後的數據結構
在這裏插入圖片描述
如圖中,如果一個值比較小,即爲embstr,如果比較大,大於39(redis4爲40個字節),那麼爲raw,如果能確定爲數值型,那麼即爲integer。

Hash
Redis中的hash數據結構,類似於一個map結構,可以存儲結構化的數據,入用戶信息,key爲用戶id,fiedl爲userName,
value爲名字。非常適合存儲相關聯的數據在一起。

  • hgetall
    keyfieldvaluerediskeyfieldvalue\color{#FF0000}{ 獲取key中所有的field和value,需要注意的是redis是單線程模型,如果一個key中存儲着很多個field和value,}
    hkeysfieldvaluehscan\color{#FF0000}{那麼執行的時候會很耗時,可以採用hkeys命令獲取所有的field,然後分批去取value。或者用hscan}
    hscan使用如下
		Set<String> fileds = redisTemplate.execute((RedisCallback<Set<String>>) connection -> {
			Set<String> fields = new HashSet<>();

			JedisCommands commands = (JedisCommands) connection.getNativeConnection();
			ScanParams scanParams = new ScanParams();
			scanParams.count(1000);
			ScanResult<Map.Entry<String, String>> scan = commands.hscan(hashKey, "0", scanParams);
			int count = 0;
			while (scan.getStringCursor() != null) {
				count++;
				for (Map.Entry<String, String> entry : scan.getResult()) {
					fields.add(entry.getKey());
				}
				if (Objects.equals("0", scan.getStringCursor())) {
					//掃描完成
					break;
				} else {
					//繼續下一次掃描
					scan = commands.hscan(hashKey, scan.getStringCursor(), scanParams);
				}
			}
			System.out.println(count);
			return fields;
		});
		System.out.println(fileds.size());

案例,存儲熱用戶數據,
方案一:採用key爲用戶id,value爲序列化的用戶pojo。序列化需要耗時,所有屬性爲一個整體,修改較爲麻煩。
方案二:採用hash,key爲用戶id,field爲屬性名,value爲屬性值。各個屬性爲單獨的個體,修改較爲方便,

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章