❶ Redis --- 八種數據類型(基本命令)
String、Hash、List、Set和Zset。
等同於java中的, Map<String,String> string 是redis裡面的最基本的數據類型,一個key對應一個value。
應用場景 :String是最常用的一種數據類型,普通的key/value存儲都可以歸為此類,如用戶信息,登錄信息和配置信息等;
實現方式 :String在redis內部存儲默認就是一個字元串,被redisObject所引用,當遇到incr、decr等操作(自增自減等原子操作)時會轉成數值型進行計算,此時redisObject的encoding欄位為int。
Redis雖然是用C語言寫的,但卻沒有直接用C語言的字元串,而是自己實現了一套字元串。目的就是為了提升速度,提升性能。 Redis構建了一個叫做簡單動態字元串(Simple Dynamic String),簡稱SDS。
Redis的字元串也會遵守C語言的字元串的實現規則,即 最後一個字元為空字元。然而這個空字元不會被計算在len里頭。
Redis動態擴展步驟:
Redis字元串的性能優勢
常用命令 :set/get/decr/incr/mget等,具體如下;
ps:計數器(字元串的內容為整數的時候可以使用),如 set number 1。
補充:
等同於java中的: Map<String,Map<String,String>> ,redis的hash是一個string類型的field和value的映射表, 特別適合存儲對象。 在redis中,hash因為是一個集合,所以有兩層。第一層是key:hash集合value,第二層是hashkey:string value。所以判斷是否採用hash的時候可以參照有兩層key的設計來做參考。並且注意的是, 設置過期時間只能在第一層的key上面設置。
應用場景 :我們要存儲一個用戶信息對象數據,其中包括用戶ID、用戶姓名、年齡和生日,通過用戶ID我們希望獲取該用戶的姓名或者年齡或者生日;
實現方式 :Redis的Hash實際是內部存儲的Value為一個HashMap,並提供了直接存取這個Map成員的介面。如,Key是用戶ID, value是一個Map。 這個Map的key是成員的屬性名,value是屬性值 。這樣對數據的修改和存取都可以直接通過其內部Map的Key(Redis里稱內部Map的key為field), 也就是通過 key(用戶ID) + field(屬性標簽) 就可以操作對應屬性數據。 當前HashMap的實現有兩種方式 :當HashMap的成員比較少時Redis為了節省內存會採用類似一維數組的方式來緊湊存儲,而不會採用真正的HashMap結構,這時對應的value的redisObject的encoding為zipmap,當成員數量增大時會自動轉成真正的HashMap,此時redisObject的encoding欄位為int。
常用命令 :hget/hset/hgetall等,具體如下:
等同於java中的 Map<String,List<String>> ,list 底層是一個鏈表,在redis中,插入list中的值,只需要找到list的key即可,而不需要像hash一樣插入兩層的key。 list是一種有序的、可重復的集合。
應用場景 :Redis list的應用場景非常多,也是Redis最重要的數據結構之一,比如twitter的關注列表,粉絲列表等都可以用Redis的list結構來實現;
實現方式 :Redis list的實現為一個 雙向鏈表 ,即可以支持反向查找和遍歷,更方便操作,不過帶來了部分額外的內存開銷,Redis內部的很多實現,包括 發送緩沖隊列 等也都是用的這個數據結構。
常用命令 :lpush/rpush/lpop/rpop/lrange等,具體如下:
性能總結 :
它是一個字元串鏈表,left、right都可以插入添加。
等同於java中的 Map<String,Set<String>> ,Set 是一種無序的,不能重復的集合。並且在redis中,只有一個key它的底層由hashTable實現的,天生去重。
應用場景 :Redis set對外提供的功能與list類似是一個列表的功能,特殊之處在於set是可以自動去重的,當你需要存儲一個列表數據,又不希望出現重復數據時,set是一個很好的選擇,並且 set提供了判斷某個成員是否在一個set集合內的重要介面 ,這個也是list所不能提供的;如保存一些標簽的名字。標簽的名字不可以重復,順序是可以無序的。
實現方式 :set 的內部實現是一個 value永遠為null的HashMap,實際就是通過計算hash的方式來快速排重的,這也是set能提供判斷一個成員是否在集合內的原因。
常用命令 :sadd/spop/smembers/sunion等,具體如下:
ZSet(Sorted Set:有序集合) 每個元素都會關聯一個double類型的分數score,分數允許重復,集合元素按照score排序( 當score相同的時候,會按照被插入的鍵的字典順序進行排序 ),還可以通過 score 的范圍來獲取元素的列表。
應用場景 :Redis sorted set的使用場景與set類似,區別是set不是自動有序的,而sorted set可以 通過用戶額外提供一個優先順序(score)的參數來為成員排序,並且是插入有序的,即自動排序。 當你需要一個有序的並且不重復的集合列表,那麼可以選擇sorted set數據結構,比如twitter 的public timeline可以以發表時間作為score來存儲,這樣獲取時就是自動按時間排好序的。
底層實現 : zset 是 Redis 提供的一個非常特別的數據結構,常用作排行榜等功能,以用戶 id 為 value ,關注時間或者分數作為 score 進行排序。實現機制分別是 zipList 和 skipList 。規則如下:
zipList:滿足以下兩個條件
skipList:不滿足以上兩個條件時使用跳錶、組合了hash和skipList
為什麼用skiplist不用平衡樹?
主要從內存佔用、對范圍查找的支持和實現難易程度這三方面總結的原因。
拓展:mysql為什麼不用跳錶?
常用命令 :zadd/zrange/zrem/zcard等;
官網地址: https://redis.io/commands/geoadd
可以用來推算兩地之間的距離,方圓半徑內的人。
關於經度緯度的限制: https://www.redis.net.cn/order/3685.html
一般我們使用Hyperloglog做基數統計。
什麼是基數?就是一個集合中不重復的數的個數。
集合A:{1,3,5,7,9,7}
集合B:{1,3,5,7,9}
AB集合的基數都是5
應用:統計網站的訪問量(一個人訪問網站很多次仍然算作一次)。
優點:佔用的內存是固定的,找2^64次方個數的基數,只需要12KB內存。
缺點:有0.81%的錯誤率,可以忽略不計
概述: bitmap 存儲的是連續的二進制數字(0 和 1),通過 bitmap, 只需要一個 bit 位來表示某個元素對應的值或者狀態,key 就是對應元素本身 。 我們知道 8 個 bit 可以組成一個 byte,所以 bitmap 本身會極大的節省儲存空間。
應用場景: 適合需要保存狀態信息(比如是否簽到、是否登錄...)並需要進一步對這些信息進行分析的場景。比如用戶簽到情況、活躍用戶情況、用戶行為統計(比如是否點贊過某個視頻)。
針對上面提到的一些場景,這里進行進一步說明。
使用場景一:用戶行為分析 很多網站為了分析你的喜好,需要研究你點贊過的內容。
使用場景二:統計活躍用戶
使用時間作為 key,然後用戶 ID 為 offset,如果當日活躍過就設置為 1
那麼我該如果計算某幾天/月/年的活躍用戶呢(暫且約定,統計時間內只有有一天在線就稱為活躍),有請下一個 redis 的命令
使用場景三:用戶在線狀態
對於獲取或者統計用戶在線狀態,使用 bitmap 是一個節約空間效率又高的一種方法。
只需要一個 key,然後用戶 ID 為 offset,如果在線就設置為 1,不在線就設置為 0。
補充 :
巨人的肩膀:
https://www.cnblogs.com/Small-sunshine/p/11687809.html
https://mp.weixin.qq.com/s/CMu7oXVIKp2s-PXTdMlimA
❷ java操作redis有哪些方法
電腦安裝Redis,然後通過JRedis(jar包)下的JRedis redis = new JRedis(address,port);就可以操作了,比連接資料庫還簡單,如果是windows的話 建議裝虛擬機用linux安裝redis,其他的只要你懂redis,用java操作redis太簡單了
❸ 怎樣使用redis緩存,java代碼
應用Redis實現數據的讀寫,同時利用隊列處理器定時將數據寫入mysql。
同時要注意避免沖突,在redis啟動時去mysql讀取所有表鍵值存入redis中,往redis寫數據時,對redis主鍵自增並進行讀取,若mysql更新失敗,則需要及時清除緩存及同步redis主鍵。
這樣處理,主要是實時讀寫redis,而mysql數據則通過隊列非同步處理,緩解mysql壓力,不過這種方法應用場景主要基於高並發,而且redis的高可用集群架構相對更復雜,一般不是很推薦。
❹ 怎麼在java中實現redis的添加數據
通過jedis這個第三方的jar包實現,這個是redis客戶端方法的java實現,不需要自己再寫了。
❺ redis緩存怎麼結合java使用
redis針對java有一個客戶端,叫做jedis。可以使用jedis來連接redis伺服器,將常用數據放到redis中,用時取出就好了。
❻ java操作redis有哪些方法
電腦安裝Redis,然後通過JRedis(jar包)下的JRedis redis = new JRedis(address,port);就可以操作了,比連接資料庫還簡單,如果是windows的話 建議裝虛擬機用linux安裝redis,其他的只要你懂redis,用java操作redis太簡單了
❼ 怎麼在java中實現redis的添加數據
需要確保已經安裝了redis服務及Javaredis驅動(jedis.jar)
importredis.clients.jedis.Jedis;
publicclassRedisStringJava{
publicstaticvoidmain(String[]args){
//連接本地的Redis服務
Jedisjedis=newJedis("localhost");
System.out.println("連接成功");
//設置redis字元串數據
jedis.set("str","字元串");
//獲取存儲的數據並輸出
System.out.println("redis存儲的字元串為:"+jedis.get("str"));
}}
❽ 如何在java中使用redis
publicclassRedisListJava{
publicstaticvoidmain(String[]args){
//連接本地的Redis服務
Jedisjedis=newJedis("localhost");
System.out.println("Connectiontoserversucessfully");
//存儲數據到列表中
jedis.lpush("tutorial-list","Redis");
jedis.lpush("tutorial-list","Mongodb");
jedis.lpush("tutorial-list","Mysql");
//獲取存儲的數據並輸出
List<String>list=jedis.lrange("tutorial-list",0,5);
for(inti=0;i<list.size();i++){
System.out.println("Storedstringinredis::"+list.get(i));
}
}
}
❾ 如何用java redis hbase
比如 MongoDB 和 CouchDB。每個數據存儲都有其優勢和劣勢,特別是當應用於特定領域時。 本期的 Java 開發 2.0 關注的是 Redis,一種輕量級鍵值對數據存儲。多數 NoSQL 實現本質上都是鍵值對,但是 Redis 支持非常豐富的值集,其中包括字元串、列表、集以及散列。因此,Redis 通常被稱為數據結構伺服器。Redis 也以異常快速而聞名,這使得它成為某一特定類型使用案例的最優選擇。 當我們想要了解一種新事物時,將其同熟知的事物進行比較可能會有所幫助,因此,我們將通過對比其與 memcached 的相似性以開啟 Redis 探索之旅。接著我們將介紹 Redis 的主要功能,這些功能可以使其在某些應用場景可以勝過 memcached。最後我將向您展示如何將 Redis 作為一個傳統數據存儲用於模型對象。Redis 和 memcached Memcached 是一個眾所周知的內存對象緩存系統,通過將目標鍵和值導入內存緩存運行。因此,Memcached 能迴避讀取磁碟時發生的 I/O 成本問題。在 Web 應用程序和資料庫之間粘貼 memcached 時會產生更好的讀取性能。因此,對於那些需要快速數據查詢的應用程序,Memcached 是一個不錯的選擇。其中的一個例子為股票查詢服務,需要另外訪問資料庫獲取相對靜態數據,如股票名稱或價格信息。 MemcacheDB 將Redis 與 memcached 相比較並不公平,它與 MemcacheDB 相比要好的多,MemcacheDB 是一個分布式鍵值對存儲系統,專為數據持久化而設計。MemcacheDB 與 Redis 較為相似,其新增優勢可以使其輕松地與 memcached 實現的客戶端進行通信。 但是memcached 也有其局限性,其中一個事實就是它所有的值均是簡單的字元串。Redis 作為 memcached 的替代者,支持更加豐富的功能集。一些基準 (benchmarks) 也表明 Redis 的速度要比 memcached 快很多。Redis 提供的豐富數據類型使其可以在內存中存儲更為復雜的數據,這是使用 memcached 無法實現的。同 memcached 不一樣,Redis 可以持久化其數據。 Redis 解決了一個重大的緩存問題,而其豐富的功能集又為其找到了其他用途。由於 Redis 能夠在磁碟上存儲數據以及跨節點復制數據,因而可以作為數據倉庫用於傳統數據模式(也就是說,您可以使用 Redis,就像使用 RDBMS 一樣)。Redis 還經常被用作隊列系統。在本用例中,Redis 是備份和工作隊列持久化存儲(利用 Redis 的列表類型)的基礎。GitHub 是以此種方法使用 Redis 的大規模基礎架構示例准備好 Redis,立即開始! 要開始使用 Redis,您需要訪問它,可以通過本地安裝或者託管供應商來實現訪問。如果您使用的 MAC,安裝過程可能就不那麼簡單。
❿ java開發中如何巧妙的使用Redis提高性能
樓主您好
把Redis作為緩存,將一些熱點數據放到Redis中,讀取時先讀redis,載讀db。
至於減少內存,注意:Redis中數據的過期策略;選擇合適的數據結構,例如:選擇hash而非string;數據存儲進redis前使用序列化工具壓縮,推薦MsgPack。
推薦知乎:https://www.hu.com/question/29548367