redis

   redis是Remote Dictionary Server(遠程數據服務)的縮寫,由意大利人antirez(Salvatore Sanfilippo)開發的一款內存高速緩存數據庫,該軟件使用C語言編寫,它的數據模型爲key-value。


Mysql是多線程

redis是單線程

內存的讀寫性能大概是磁盤的1-2個數量級,所以這裏從本質上決定了Redis的讀寫性能高於Mysql。


操作都是原子性的(要麼執行成功,要麼不執行)

【用途】

1、緩存mysql

2、保存session

3、nosql數據庫

4、消息隊列




高可用、集羣 Redis發展過程中的三種模式:1.x版主從、2.x版哨兵、3.x版集羣

多實例

調優

監控

排錯



【概念】

1)默認端口6379

2)redis有五種數據類型:

  string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)、hash(哈希類型)

3)redis的單線程,導致所有IO也是串行化的,當單條數據太大,IO等待會費掉時間,而不是程序本身性能或者複雜度。



6)redis和memcache比較
1、數據支持類型

Redis不僅僅支持簡單的k/v類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。

2、redis支持master-slave(主-從)模式應用

3、存儲方式

數據都是緩存在內存中

memecache把數據全部存在內存之中,斷電後會掛掉,數據不能超過內存大小。

redis會週期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,並且在此基礎上實現了master-slave(主從)同步。

4、Redis單個value的最大限制是1GB,memcached只能保存1MB的數據。

memcached,對於緩存對象大小有要求,單個對象不得大於1MB,且不支持複雜的數據類型,譬如SET等。


安裝

yum install -y epel-release

yum install -y redis (yum install epel* -y)


#源碼

cd /usr/local/src/

wget sha1sum hash redis-3.2.0.tar.gz sha1 0c1820931094369c8cc19fc1be62f598bc5961ca http://download.redis.io/releases/redis-3.2.0.tar.gz

#完整性:與 redis-hashes 對照

tar zxvf redis-3.2.0.tar.gz

cd redis-3.2.0


#啓動

systemctl start redis.service

systemctl stop redis.service

systemctl status redis.service

systemctl restart redis.service

#隨系統啓動服務

systemctl enable redis.service

查看狀態 :

ss -nlp|grep redis

或者

ps -ef | grep redis



#使用redis

redis-cli

redis-cli -h 127.0.0.1 -p 6379

redis-cli -h 127.0.0.1 -p 6379 -a password


6、Redis開啓遠程登錄連接
原來是redis默認只能localhost登錄,所以需要開啓遠程登錄。解決方法如下:
在redis的配置文件redis.conf中,找到bind localhost註釋掉。
註釋掉本機,局域網內的所有計算機都能訪問。
band localhost 只能本機訪問,局域網內計算機不能訪問。
bind 局域網IP 只能局域網內IP的機器訪問, 本地localhost都無法訪問。
我沒有註釋掉bind 127.0.0.1,而是將bind 127.0.0.1 改成了bind 0.0.0.0。

然後要配置防火牆 開放端口6379


啓用redis的密碼驗證功能requirepass參數即可

【監控】

操作命令

get

set

info查看性能


https://blog.csdn.net/magicianofcodes/article/details/81870646

查看服務文件配置

cat /lib/systemd/system/redis.service //顯示 [Unit]Description=Redis persistent key-value databaseAfter=network.target [Service]ExecStart=/usr/bin/redis-server /etc/redis.conf --supervised systemdExecStop=/usr/libexec/redis-shutdownType=notifyUser=redisGroup=redisRuntimeDirectory=redisRuntimeDirectoryMode=0755 [Install]WantedBy=multi-user.target


集羣搭建】

搭建一個最簡單的Redis集羣,那麼至少需要6個節點:3個Master和3個Slave。爲什麼需要3個Master呢?如果你瞭解過Hadoop/Storm/Zookeeper這些的話,你就會明白一般分佈式要求基數個節點,這樣便於選舉(少數服從多數的原則)



通過MySQL自動同步刷新Redis,原文地址

緩存最要注意的就是一致性問題。


redis 本身有持久化,爲什麼還要寫進 mysql 呢?

1. 場景不一樣, redis 的持久化是附加功能, mysql 的持久化是核心功能 
2. redis 的 flushdb 、 flushall 太犀利了,用 redis 來持久化數據總感覺不靠譜 
3. 持久化機制不一樣,舉個例子來說,當數據量達到 10G 的時候,你改了幾條數據, mysql 只增量地持久化這幾條數據;而 redis 只知道自己該持久化了,然後把 10G 數據完整地從內存 dump 到磁盤,是不是很過癮

4.redis 的持久化,特別是 AOF 一點也不靠譜,對性能影響太大, 開過之後再也不想開了. RDB 會丟數據.

5.mysql做一些後期統計

redis是高性能內存緩存,容量依賴於物理內存。如果你物理內存只有2G,卻想用Redis存20G的東西,這是錯誤的用法。

而mysql對內存依賴沒Redis嚴重,但mysql對硬盤會有一定程度的依賴。如果硬盤性能不好,mysql在保存大於物理內存數量的數據時,性能也不會好。


我的看法是:因爲redis存儲在內存中,如果存儲在內存中,存儲容量肯定要比磁盤少很多,那麼要存儲大量數據,只能花更多的錢去購買內存,造成在一些不需要高性能的地方是相對比較浪費的,所以目前基本都是mysql(主) + redis(輔),在需要性能的地方使用redis,在不需要高性能的地方使用mysql,好鋼用在刀刃上


一、 mySQL裏有2000w數據,redis中只存20w的數據,如何保證redis中的數據都是熱點數據

相關知識: redis 內存數據集大小上升到一定大小的時候,就會施行數據淘汰策略。redis 提供 6種數據淘汰策略: 
volatile-lru:從已設置過期時間的數據集(server.db[i].expires)中挑選最近最少使用的數據淘汰

volatile-ttl:從已設置過期時間的數據集(server.db[i].expires)中挑選將要過期的數據淘汰

volatile-random:從已設置過期時間的數據集(server.db[i].expires)中任意選擇數據淘汰

allkeys-lru:從數據集(server.db[i].dict)中挑選最近最少使用的數據淘汰

allkeys-random:從數據集(server.db[i].dict)中任意選擇數據淘汰

no-enviction(驅逐):禁止驅逐數據

三、 Redis 常見的性能問題都有哪些?如何解決?

1).Master寫內存快照,save命令調度rdbSave函數,會阻塞主線程的工作,當快照比較大時對性能影響是非常大的,會間斷性暫停服務,所以Master最好不要寫內存快照。

2).Master AOF持久化,如果不重寫AOF文件,這個持久化方式對性能的影響是最小的,但是AOF文件會不斷增大,AOF文件過大會影響Master重啓的恢復速度。Master最好不要做任何持久化工作,包括內存快照和AOF日誌文件,特別是不要啓用內存快照做持久化,如果數據比較關鍵,某個Slave開啓AOF備份數據,策略爲每秒同步一次。

3).Master調用BGREWRITEAOF重寫AOF文件,AOF在重寫的時候會佔大量的CPU和內存資源,導致服務load過高,出現短暫服務暫停現象。

4). Redis主從複製的性能問題,爲了主從複製的速度和連接的穩定性,Slave和Master最好在同一個局域網內

四、請用Redis和任意語言實現一段惡意登錄保護的代碼,限制1小時內每用戶Id最多隻能登錄5次。具體登錄函數或功能用空函數即可,不用詳細寫出。

用列表實現:列表中每個元素代表登陸時間,只要最後的第5次登陸時間和現在時間差不超過1小時就禁止登陸.用Python寫的代碼如下:#!/usr/bin/env python3import redis  
import sys  
import timer = redis.StrictRedis(host=’127.0.0.1′, port=6379, db=0)  
try:  
    id = sys.argv[1]
except:  
    print(‘input argument error’)
    sys.exit(0)if r.llen(id) >= 5 and time.time() – float(r.lindex(id, 4)) <= 3600:  
    print(“you are forbidden logining”)else:  
    print(‘you are allowed to login’)
    r.lpush(id, time.time())    # login_func()

排錯

1)Failed to start Redis persistent key-value database.

原因:密碼配置錯誤requirepass "password",

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