redis創建資料庫
簡而言之,Redis是一種強大的key-value資料庫,之所以強大有兩點:響應速度快(所以數據內存存儲,只在必要時寫入磁碟),特性豐富(支持多種數據類型,以及各類型上的復雜操作)。
事實上,Redis的一個重要特性就是它並非通常意義上的資料庫,雖然稱之為資料庫是因為它可以為你存儲和維護數據,但它並不像關系資料庫那樣提供任何的sql方言。不過不用擔心,Redis並不是吞噬數據的黑洞,它只是不支持SQL及相關功能,但卻提供了穩健的協議用於與之交互。
在Redis中,沒有數據表的概念,也無須關心select、join、view等操作或功能,同時也不提供類似於int或varchar的數據欄位。你面對的將是相對原始的數據集合及數據類型。
探索之二:Available datatypes
下面我們深入看下這個奇怪的資料庫是如何工作的。如上所見,Redis是基於key-value範式存儲數據,所以先來重點看下"key"的概念。
key本質上就是簡單的字元串,諸如"username"、"password"等。在定義key時,除了不能使用空格,你可以隨意的使用普通的字元、數字等,像".",":","_"等在定義key時都能正常使用,所以像"user_name", "user:123:age", "user:123:username"都是不錯的key的定義方式。
不像RDBMS中的欄位名稱,這里的key是Redis中的重要組成部分,所以我們必須在處理key時多加小心。在下面的講述中,Redis並沒有table的概念,所以像"SELECT username from users WHERE user_id=123;"這種簡單任務都只能換種方式實現,為了達到這種目的,在Redis上,一種方式是通過key "user:123:username"來獲取結果value。如你所見,key的定義中攜帶了神秘信息(像user ids)。在Redis中,key的重要性可見一斑。(其他key-value資料庫中key的地位也是如此。)
㈡ 如何設置redis 的許可權密碼
redis作為一個高速資料庫,在互聯網上,必須有對應的安全機制來進行保護,方法有2,如下。
1.比較安全的辦法是採用綁定IP的方式來進行控制。
請在redis.conf文件找到如下配置
# If you want you can bind a single interface, if the bind option is not
# specified all the interfaces will listen for incoming connections.
#
# bind 127.0.0.1
把# bind 127.0.0.1前面的 注釋#號去掉,然後把127.0.0.1改成你允許訪問你的redis伺服器的ip地址,表示只允許該ip進行訪問
這種情況下,我們在啟動redis伺服器的時候不能再用:redis-server,改為:redis-server path/redis.conf 即在啟動的時候指定需要載入的配置文件,其中path/是你上面修改的redis配置文件所在目錄,這個方法有一點不太好,我難免有多台機器訪問一個redis服務。
2.設置密碼,以提供遠程登陸
打開redis.conf配置文件,找到requirepass,然後修改如下:
requirepass yourpassword
yourpassword就是redis驗證密碼,設置密碼以後發現可以登陸,但是無法執行命令了。
命令如下:
redis-cli -h yourIp -p yourPort//啟動redis客戶端,並連接伺服器
keys * //輸出伺服器中的所有key
報錯如下
(error) ERR operation not permitted
這時候你可以用授權命令進行授權,就不報錯了
命令如下:
auth youpassword
另外,在連接伺服器的時候就可以指定登錄密碼,避免單獨輸入上面授權命令
命令如下:
redis-cli -h yourIp-p yourPort -a youPassword
除了在配置文件redis.conf中配置驗證密碼以外,也可以在已經啟動的redis伺服器通過命令行設置密碼,但這種方式是臨時的,當伺服器重啟了密碼必須重設。命令行設置密碼方式如下:
config set requirepass yourPassword
有時候我們不知道當前redis伺服器是否有設置驗證密碼,或者忘記了密碼是什麼,我們可以通過命令行輸入命令查看密碼,命令如下:
config get requirepass
如果redis服務端沒有配置密碼,會得到nil,而如果配置了密碼,但是redis客戶端連接redis服務端時,沒有用密碼登錄驗證,會提示:operation not permitted,這時候可以用命令:auth yourpassword 進行驗證密碼,再執行 config set requirepass,就會顯示yourpassword
由於redis並發能力極強,僅僅搞密碼,攻擊者可能在短期內發送大量猜密碼的請求,很容易暴力破解,所以建議密碼越長越好,比如20位。(密碼在 conf文件里是明文,所以不用擔心自己會忘記)
㈢ Redis:redis不是內存資料庫么為什麼我把redis-server.exe關了重新啟動值還有呢
Redis並非純粹的內存資料庫。雖然它確實能夠將數據存儲在內存中以實現高效的數據訪問,但它也具備持久化機制來防止數據丟失。Redis默認採用的是RDB持久化方式,這種機制會在每隔一段時間自動創建一個內存快照,快照包含了當前內存中所有數據的狀態。
當您啟動Redis伺服器時,它會自動載入最近一次生成的內存快照文件(通常命名為.rdb文件),從而恢復到該快照時刻的數據狀態。因此,即使關閉並重啟Redis伺服器,之前保存的數據依然會被載入。
為了驗證這一過程,您可以手動操作Redis客戶端。比如,打開redis-client.exe並執行「flushdb」命令,這將清空當前資料庫中的所有數據。接著關閉Redis伺服器,然後重新啟動它,此時Redis會自動載入之前的.rdb文件,恢復數據。您也可以直接查看redis文件夾中的.rdb文件,以直觀地確認數據的持久化狀態。
因此,Redis雖然運行在內存中,但通過持久化機制確保了即使伺服器重啟,數據也不會丟失。這種設計既保證了數據的安全性,又兼顧了數據訪問的高效性。
值得注意的是,除了RDB持久化外,Redis還支持另一種持久化方式AOF(Append Only File),這種機制則是在每次寫入數據時都會將操作記錄到日誌文件中。通過這種方式,Redis同樣能夠保證數據的持久化。
㈣ redis,如何選擇性載入key數據
官方在2.6版本推出了一個新的功能-pipe mode,即將支持Redis協議的文本文件直接通過pipe導入到服務端。
說來拗口,具體實現步驟如下:
1. 新建一個文本文件,包含redis命令
SET Key0 Value0
SET Key1 Value1
...
SET KeyN ValueN
如果有了原始數據,其實構造這個文件並不難,譬如shell,python都可以
2. 將這些命令轉化成RedisProtocol。
因為Redis管道功能支持的是RedisProtocol,而不是直接的Redis命令。
如何轉化,可參考後面的腳本。
3. 利用管道插入
cat data.txt | redis-cli --pipe
Shell VSRedis pipe
下面通過測試來具體看看Shell批量導入和Redis pipe之間的效率。
測試思路:分別通過shell腳本和Redis pipe向資料庫中插入10萬相同數據,查看各自所花費的時間。
Shell
腳本如下:
#!/bin/bashfor ((i=0;i<100000;i++))doecho -en "helloworld" | redis-cli -x set name$i >>redis.log
done
每次插入的值都是helloworld,但鍵不同,name0,name1...name99999。
Redis pipe
Redis pipe會稍微麻煩一點
1> 首先構造redis命令的文本文件
在這里,我選用了python
#!/usr/bin/pythonfor i in range(100000): print 'set name'+str(i),'helloworld'
# python 1.py > redis_commands.txt
# head -2 redis_commands.txt
set name0 helloworld
set name1 helloworld
2>將這些命令轉化成RedisProtocol
在這里,我利用了github上一個shell腳本,
㈤ 史上最全Redis面試題,讓面試官問無可問(附答案)
Redis高性能緩存資料庫
1、什麼是 Redis?簡述它的優缺點?
Redis 是 Remote Dictionary.Server 的簡寫,是一種純內存的 Key-Value 類型資料庫,性能極高,每秒可處理超過 10 萬次讀寫操作。其主要優點包括:極高的性能、支持多種數據結構、數據持久化、內存數據集大小限制、數據淘汰策略等。缺點是資料庫容量受物理內存限制,不適於海量數據的高性能讀寫。
2、Redis 與 memcached 相比有哪些優勢?
Redis 在數據類型支持上更加豐富,除了基本的鍵值對存儲,還支持列表、集合、排序集合等復雜數據結構。同時,Redis 提供持久化功能,可以將內存中的數據保存到磁碟,防止數據丟失。
3、Redis 支持哪幾種數據類型?
Redis 支持 String、List、Set、Sorted Set、Hashes 等數據類型。
4、Redis 主要消耗什麼物理資源?
Redis 主要消耗內存資源。
5、Redis 有哪幾種數據淘汰策略?
Redis 提供了多種數據淘汰策略,包括 LFU(Least Frequently Used)、LRU(Least Recently Used)、TTL(Time To Live)等。
6、Redis 官方為什麼不提供 Windows 版本?
Redis 因為 Linux 版本穩定且用戶量大,無需特別開發 Windows 版本,以免引入兼容性問題。
7、一個字元串類型的值能存儲最大容量是多少?
一個字元串類型的值最大可存儲 512M。
8、為什麼 Redis 需要把所有數據放到內存中?
為了實現快速讀寫,Redis 將數據載入到內存中,並通過非同步方式將數據持久化到磁碟,以保持數據的持久性。
9、Redis 集群方案應該怎麼做?都有哪些方案?
Redis 集群方案包括主從復制、哨兵模式、集群模式等。
10、Redis 集群方案什麼情況下會導致整個集群不可用?
如果節點出現故障,導致集群缺少某個槽范圍,則整個集群可能會變得不可用。
11、MySQL 里有 2000w 數據,redis 中只存 20w 的數據,如何保證 redis 中的數據都是熱點數據?
當數據集過大時,Redis 會執行數據淘汰策略,保證存儲的都是熱點數據。
12、Redis 有哪些適合的場景?
適合會話緩存、全頁緩存、隊列、排行榜/計數器、發布/訂閱等。
13、Redis 支持的 java 客戶端都有哪些?官方推薦用哪個?
支持 Redisson、Jedis、lettuce 等客戶端,官方推薦使用 Redisson。
14、Redis 和 Redisson 有什麼關系?
Redisson 是 Redis 的分布式和可擴展的 Java 數據結構實現。
15、Jedis 與 Redisson 對比有什麼優缺點?
Jedis 是 Redis 的 Java 客戶端,功能全面;Redisson 側重於分布式和可擴展的數據結構,功能較為簡單。
16、說說 Redis 哈希槽的概念?
Redis 集群使用哈希槽概念,將數據均勻分布在集群節點上。
17、Redis 集群的主從復制模型是怎樣的?
Redis 集群使用主從復制模型,每個節點有 N-1 個復制節點。
18、Redis 集群會有寫操作丟失嗎?為什麼?
Redis 並不能保證數據強一致性,特定條件下可能會丟失寫操作。
19、Redis 集群之間是如何復制的?
Redis 集群復制採用非同步方式。
20、Redis 集群最大節點個數是多少?
Redis 集群最大節點數為 16384 個。
21、Redis 集群如何選擇資料庫?
Redis 集群默認在 0 資料庫。
22、Redis 中的管道有什麼用?
管道允許一次性發送多個命令,提高效率。
23、怎麼理解 Redis 事務?
Redis 事務將命令序列化並按順序執行,不會被其他命令打斷。
24、Redis 事務相關的命令有哪幾個?
事務相關的命令包括 MULTI、EXEC、DISCARD、WATCH。
25、Redis key 的過期時間和永久有效分別怎麼設置?
使用 EXPIRE 和 PERSIST 命令設置過期時間。
26、Redis 如何做內存優化?
使用散列表存儲數據,減少內存消耗。
27、Redis 回收進程如何工作的?
Redis 檢測內存使用情況,當超過限制時,根據策略回收內存。
28、加鎖機制
Redis 提供多種加鎖策略,如互斥鎖、分布式鎖等。
29、鎖互斥機制
確保同一時間只有一個客戶端操作數據。
30、watch dog 自動延期機制
監控 key 變化並自動延期鎖。
31、可重入加鎖機制
允許同一客戶端多次獲取同一鎖。
32、釋放鎖機制
通過特定命令釋放鎖。
33、上述 Redis 分布式鎖的缺點
可能存在死鎖、性能問題等。
34、使用過 Redis 分布式鎖么,它是怎麼實現的?有什麼缺點?
使用 setnx 和 expire 實現,缺點可能包括死鎖和性能問題。
35、使用過 Redis 做非同步隊列么,你是怎麼用的?有什麼缺點?
使用 list 結構實現,缺點可能包括並發控制和性能問題。
36、什麼是緩存穿透?如何避免?什麼是緩存雪崩?何如避免?
緩存穿透和雪崩的解決策略包括緩存空結果、二級緩存和合理設置過期時間。
37、redis 和 memcached 什麼區別?為什麼高並發下有時單線程的 redis 比多線程的 memcached 效率要高?
區別包括數據類型支持、持久化和並發模型;單線程的 Redis 在高並發下效率高,因為避免了線程切換的開銷。
38、使用 redis 如何設計分布式鎖?說一下實現思路?使用 zk 可以嗎?如何實現?這兩種有什麼區別?
實現分布式鎖,Redis 或 ZooKeeper 可以,ZooKeeper 通過選舉和監控實現,Redis 則通過互斥鎖實現。
39、知道 redis 的持久化嗎?底層如何實現的?有什麼優點缺點?
Redis 持久化通過 RDB 和 AOF 方式實現,優點包括恢復數據速度快、缺點包括數據丟失風險。
40、緩存穿透、緩存擊穿、緩存雪崩解決方案?
解決方案包括緩存空結果、二級緩存和合理設置過期時間。
41、在選擇緩存時,什麼時候選擇 redis,什麼時候選擇 memcached?
選擇 Redis 時考慮數據類型支持、持久化和並發模型,選擇 Memcached 時考慮簡單性和性能。
42、Redis 常見的性能問題和解決方案
性能問題包括內存管理、網路延遲等,解決方案包括優化內存使用、調整配置參數等。
43、Redis 的數據淘汰策略有哪些
包括 LFU、LRU、TTL 等。
44、Redis 當中有哪些數據結構
包括 String、List、Set、Sorted Set、Hashes。
45、使用 Redis 做過非同步隊列嗎,是如何實現的
使用 list 結構實現,通過 rpush 生產消息和 lpop 消費消息。
46、Redis 如何實現延時隊列
通過設定過期時間或使用定時任務實現。
面試題整理
收集了還有你不知道的其它面試題(springboot、mybatis、並發、java中高級面試總結等)