1.redis
c語言編寫的一個開源軟件,使用字典結構存儲數據,支持多種類型數據類型
數據類型:字符串,字典,列表,集合,有序集合
2.redis特點
速度快:c語言實現的,所有數據都存儲在計算機內存中
持久化:他會將數據定期保存到文件系統中,但redis節點故障時,數據文件可以從redis數據文件恢復
支持多種數據結構:字典,集合,列表,有序集合,字符串
支持多種語言的API:JAVA,C,php,python,Ruby,node.js,C++等
功能齊全:支持事物,發佈/訂閱,LUA腳本等功能
主從複製:主服務器(master)執行添加、修改、刪除,從服務器執行查詢
高可用及分佈式:2.8版本支持高可用,3.0支持分佈式
3.Memcached和Redis對比
1.性能上:Redis只使用單核,而Memcached可以使用多核,所以平均每一個核上Redis在存儲小數據時比Memcached性能更高。而在100k以上的數據中,Memcached性能要高於Redis。
2.內存空間和數據量大小:Memcached可以修改最大內存,採用LRU算法。Memcached單個key-value大小有限,一個value最大隻支持1MB,而Redis最大支持512MB
3.操作便利上:Memcached數據結構單一,而Redis支持更加豐富的數據類型
4.可靠性:MemCached不支持數據持久化,斷電或重啓後數據消失。Redis支持數據持久化和數據恢復和集羣,允許單點故障
5.應用場景:
Memcached:動態系統中減輕數據庫負載,提升性能;做緩存,適合多讀少寫,大數據量的情況(如人人網大量查詢用戶信息、好友信息、文章信息等)
Redis:適用於對讀寫效率要求都很高,數據處理業務複雜和對安全性要求較高的系統(如新浪微博的計數和微博發佈部分系統,對數據安全性、讀寫要求都很高)
4.redis的持久化策略
RDB:每隔一段時間對redis進行一次持久化。
- 缺點:數據不完整 - 優點:速度快
AOF:把所有命令保存起來,如果想到重新生成到redis,那麼就要把命令重新執行一次。
- 缺點:速度慢,文件比較大 - 優點:數據完整
5.其他常見問題
如果redis中的某個列表中的數據量非常大,如果實現循環顯示每一個值?
- 如果一個列表在redis中保存了10w個值,我需要將所有值全部循環並顯示,請問如何實現? 一個一個取值,列表沒有iter方法,但能自定義 def list_scan_iter(name,count=3): start = 0 while True: result = conn.lrange(name, start, start+count-1) start += count if not result: break for item in result: yield item for val in list_scan_iter('num_list'): print(val) 場景:投票系統,script-redis
redis如何實現主從複製以及數據同步?
# 實現主從複製 '創建6379和6380配置文件' redis.conf:6379爲默認配置文件,作爲Master服務配置; redis_6380.conf:6380爲同步配置,作爲Slave服務配置; '配置slaveof同步指令' 在Slave對應的conf配置文件中,添加以下內容: slaveof 127.0.0.1 6379 # 數據同步步驟: (1)Slave服務器連接到Master服務器. (2)Slave服務器發送同步(SYCN)命令. (3)Master服務器備份數據庫到文件. (4)Master服務器把備份文件傳輸給Slave服務器. (5)Slave服務器把備份文件數據導入到數據庫中. 優勢: - 高可用 - 分擔主壓力 注意: - slave設置只讀
redis中sentinel的作用?
幫助我們自動在主從之間進行切換(哨兵) 檢測主從中 主是否掛掉,且超過一半的sentinel檢測到掛了之後才進行進行切換。 如果主修復好了,再次啓動時候,會變成從。 啓動主redis: redis-server /etc/redis-6379.conf 啓動主redis redis-server /etc/redis-6380.conf 啓動從redis 在linux中: 找到 /etc/redis-sentinel-8001.conf 配置文件,在內部: - 哨兵的端口 port = 8001 - 主redis的IP,哨兵個數的一半/1 找到 /etc/redis-sentinel-8002.conf 配置文件,在內部: - 哨兵的端口 port = 8002 - 主redis的IP, 1 啓動兩個哨兵
實現redis集羣
#基於【分片】來完成。 - 集羣是將你的數據拆分到多個Redis實例的過程 - 可以使用很多電腦的內存總和來支持更大的數據庫。 - 沒有分片,你就被侷限於單機能支持的內存容量。 #redis將所有能放置數據的地方創建了 16384 個哈希槽。 #如果設置集羣的話,就可以爲每個實例分配哈希槽: - 192.168.1.20【0-5000】 - 192.168.1.21【5001-10000】 - 192.168.1.22【10001-16384】 #以後想要在redis中寫值時:set k1 123 - 將k1通過crc16的算法轉換成一個數字,然後再將該數字和16384求餘, - 如果得到的餘數 3000,那麼就將該值寫入到 192.168.1.20 實例中。 #集羣方案: - redis cluster:官方提供的集羣方案。 - codis:豌豆莢技術團隊。 - tweproxy:Twiter技術團隊。
redis中默認的哈希槽
#redis中默認有 16384 個哈希槽。
redis支持的過期策略(6個)
# 數據集(server.db[i].expires) a、voltile-lru: #從已設置過期時間的數據集中,挑選最近頻率最少數據淘汰 b、volatile-ttl: #從已設置過期時間的數據集中,挑選將要過期的數據淘汰 c、volatile-random:#從已設置過期時間的數據集中,任意選擇數據淘汰 d、allkeys-lru: #從數據集中,挑選最近最少使用的數據淘汰 e、allkeys-random: #從數據集中,任意選擇數據淘汰 f、no-enviction(驅逐):#禁止驅逐數據
MySQL 裏有 2000w 數據,redis 中只存 20w 的數據,如何保證 redis 中都是熱點數據?
# 限定Redis佔用的內存,根據自身數據淘汰策略,淘汰冷數據,把熱數據加載到內存。 # 計算一下 20W 數據大約佔用的內存,然後設置一下Redis內存限制即可。
什麼是codis及其作用?
Codis 是一個分佈式 Redis 解決方案, 對於上層的應用來說, 連接到 Codis-Proxy(redis代理服務)和連接原生的 Redis-Server 沒有明顯的區別, 上層應用可以像使用單機的 Redis 一樣使用, Codis 底層會處理請求的轉發, 不停機的數據遷移等工作, 所有後邊的一切事情, 對於前面的客戶端來說是透明的, 可以簡單的認爲後邊連接的是一個內存無限大的 Redis 服務.
什麼是twemproxy機器及其作用?
# 什麼是Twemproxy 是Twtter開源的一個 Redis 和 Memcache 代理服務器, 主要用於管理 Redis 和 Memcached 集羣,減少與Cache服務器直接連接的數量。 他的後端是多臺REDIS或memcached所以也可以被稱爲分佈式中間件。 # 作用 通過代理的方式減少緩存服務器的連接數。 自動在多臺緩存服務器間共享數據。 通過配置的方式禁用失敗的結點。 運行在多個實例上,客戶端可以連接到首個可用的代理服務器。 支持請求的流式與批處理,因而能夠降低來回的消耗。
redis中的watch命令的作用?
用於監視一個或多個key, 如果在事務執行之前這個/些key被其他命令改動,那麼事務將被打斷
基於redis商城商品數量計數器(使用watch命令)
import redis conn = redis.Redis(host='192.168.1.41',port=6379) conn.set('count',1000) with conn.pipeline() as pipe: # 先監視,自己的值沒有被修改過 conn.watch('count') # 事務開始 pipe.multi() old_count = conn.get('count') count = int(old_count) if count > 0: # 有庫存 pipe.set('count', count - 1) # 執行,把所有命令一次性推送過去 pipe.execute()
redis分佈式鎖heredlock實現機制
實現 - 寫值並設置超時時間 - 超過一半的redis實例設置成功,就表示加鎖完成。 - 使用:安裝redlock-py from redlock import Redlock dlm = Redlock( [ {"host": "localhost", "port": 6379, "db": 0}, {"host": "localhost", "port": 6379, "db": 0}, {"host": "localhost", "port": 6379, "db": 0}, ] ) # 加鎖,acquire my_lock = dlm.lock("my_resource_name",10000) if my_lock: # 進行操作 # 解鎖,release dlm.unlock(my_lock) else: print('獲取鎖失敗')
一致性哈希概念
# 一致性哈希 一致性hash算法(DHT)可以通過減少影響範圍的方式,解決增減服務器導致的數據散列問題,從而解決了分佈式環境下負載均衡問題; 如果存在熱點數據,可以通過增添節點的方式,對熱點區間進行劃分,將壓力分配至其他服務器,重新達到負載均衡的狀態。 # 模塊:hash_ring
如何高效的找到redis中所有以zhugc開頭的key?
可以使用keys命令來加速查找
# 語法:KEYS pattern # 說明:返回與指定模式相匹配的所用的keys。 該命令所支持的匹配模式如下: 1、?:用於匹配單個字符。例如,h?llo可以匹配hello、hallo和hxllo等; 2、*:用於匹配零個或者多個字符。例如,h*llo可以匹配hllo和heeeello等; 2、[]:可以用來指定模式的選擇區間。例如h[ae]llo可以匹配hello和hallo,但是不能匹配hillo。同時,可以使用“/”符號來轉義特殊的字符 # 注意 KEYS 的速度非常快,但如果數據太大,內存可能會崩掉, 如果需要從一個數據集中查找特定的key,最好還是用Redis的集合結構(set)來代替。
如何基於redis實現發佈和訂閱?
# 發佈和訂閱,只要有任務就所有訂閱者每人一份。 發佈者: #發佈一次 import redis conn = redis.Redis(host='127.0.0.1',port=6379) conn.publish('104.9MH', "hahahahahaha") 訂閱者: #'while True'一直在接收 import redis conn = redis.Redis(host='127.0.0.1',port=6379) pub = conn.pubsub() pub.subscribe('104.9MH') while True: msg= pub.parse_response() print(msg)
詳細介紹鏈接:redis爲什麼這麼快