redis實(shí)戰(zhàn)

主要用作緩存功能,不用來(lái)做數(shù)據(jù)庫(kù)和消息服務(wù)器

我們提供的服務(wù)有:網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、八步ssl等。為數(shù)千家企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的八步網(wǎng)站制作公司

單點(diǎn)服務(wù)器搭建

1:下載release包:
wget http://download.redis.io/releases/redis-4.0.11.tar.gz
解壓:tar -zxvf
2:進(jìn)入目錄后編譯:make,需要安裝c:yum install gcc-c++
編譯時(shí):jemalloc/jemalloc.h: No such file or directory
jemalloc重載了LInux的ANSI C的malloc和free函數(shù):make的時(shí)候指定參數(shù):
make MALLOC=libc
編譯后文件都在src中
3:?jiǎn)?dòng)服務(wù)器:
src/redis-server
4:連接服務(wù)器:src/redis-cli

集群搭建

使用的是4.0以上的環(huán)境,利用自帶的ruby腳本搭建redis cluster,需要至少6個(gè)節(jié)點(diǎn),三主三從
1:分別在多個(gè)節(jié)點(diǎn)上安裝單服務(wù)器,然后修改redis.conf文件
最小化配置:
port 7000
cluster-enabled yes
cluster-config-file nodes.conf //啟動(dòng)的時(shí)候會(huì)由redis生成和管理
cluster-node-timeout 5000
appendonly yes
bind 10.99.32.16 //需要綁定自己節(jié)點(diǎn)的ip,否則外部不能訪問(wèn)
2:?jiǎn)?dòng)時(shí)使用src/redis-server ./redis.conf
多臺(tái)實(shí)例分別啟動(dòng)
3:如果已經(jīng)安裝ruby則不需要執(zhí)行這一步
安裝ruby的過(guò)程:
下載release包:
wget https://cache.ruby-lang.org/pub/ruby/2.5/ruby-2.5.1.tar.gz
解壓,./configure && make && make install
安裝完畢后即可以使用gem install redis
安裝過(guò)程可能會(huì)報(bào)錯(cuò),自行解決。
4:src/redis-trib.rb create --replicas 1 10.99.32.16:6379 10.99.32.17:6379 10.99.32.18:6379 10.99.32.20:6379 10.99.32.22:6379 10.99.32.23:6379
最少需要6個(gè)節(jié)點(diǎn)
出現(xiàn)[OK] All 16384 slots covered.即為成功
5:追加新節(jié)點(diǎn)
1:先啟動(dòng)節(jié)點(diǎn)實(shí)例
2:使用redis-trib.rb
./redis-trib.rb add-node myNewNodeIp:port
追加副本節(jié)點(diǎn):
./redis-trib.rb add-node --slave 127.0.0.1:7006 127.0.0.1:7000
給新副本節(jié)點(diǎn)指定master節(jié)點(diǎn):
./redis-trib.rb add-node --slave --master-id 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 127.0.0.1:7006 127.0.0.1:7000
6:移除節(jié)點(diǎn)
./redis-trib del-node myip:port mynodeId

一些概念

集群端口:
每一個(gè)redis集群節(jié)點(diǎn)需要開啟兩個(gè)tcp連接。一個(gè)是客戶端連接,例如默認(rèn)6379,plus端口通過(guò)增加10000來(lái)獲取數(shù)據(jù)端口,例如16379
另一個(gè)端口是集群總線,這是節(jié)點(diǎn)對(duì)節(jié)點(diǎn)的通信通道,使用二進(jìn)制傳輸協(xié)議。節(jié)點(diǎn)通過(guò)集群總線來(lái)偵測(cè)故障,配置更新和故障轉(zhuǎn)移授權(quán)和更多。客戶端不應(yīng)該使用集群總線端口進(jìn)行通信,但可以使用redis命令端口。

集群數(shù)據(jù)分片:把數(shù)據(jù)分散到各個(gè)節(jié)點(diǎn)進(jìn)行保存。redis集群不會(huì)使用始終如一的hashing,但每個(gè)分片一個(gè)key的形式,稱之為hash slot。redis有16384個(gè)hash slot,并且計(jì)算出hash slot的key。例如有3個(gè)節(jié)點(diǎn)
NodeA包含 hash slot 0-5500
NodeB包含5501-11000
NodeC包含11011-16383

redis cluster不保證強(qiáng)一致性

直接運(yùn)行redis服務(wù)器時(shí)會(huì)在前端運(yùn)行,如果需要在后臺(tái)運(yùn)行:
后臺(tái)運(yùn)行redis:把配置文件redis.conf的 daemonize改成yes

-
配置集群時(shí),如果出現(xiàn)卡著一直不懂,可能之前配置過(guò)一些節(jié)點(diǎn),關(guān)閉了再重新運(yùn)行腳本。如果運(yùn)行腳本報(bào):Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in databas
解決:刪除appendonly.aof文件和nodes.conf文件

-
緩存key的設(shè)計(jì):
1:最長(zhǎng)是1024字節(jié),不要太長(zhǎng),不要太短,key比對(duì)耗時(shí)
2:使用schema來(lái)標(biāo)識(shí),例如com.payment.User:id
二進(jìn)制安全字符:不會(huì)解析一些特殊字符,例如轉(zhuǎn)義符號(hào)等
Redis key:是二進(jìn)制安全的,這意味著你可以使用任意二進(jìn)制序列作為一個(gè)key,從一個(gè)字符串像foo到一個(gè)jpeg文件的內(nèi)容??兆址瑯邮呛戏ǖ膋ey
key的少量其他規(guī)則:
1:非常長(zhǎng)的key不是一個(gè)好主意,1024byte的key不好
2:太短的key也不好

數(shù)據(jù)類型

數(shù)據(jù)類型:
String:最基礎(chǔ)的數(shù)據(jù)類型,是二進(jìn)制安全的,意味著,Redis字符串可以包含任何類型的數(shù)據(jù),
一個(gè)String值可以最大512M
1:可以使用String作為原子計(jì)數(shù)器,使用INCR,DECR,INCRBY
2:字符串追加,使用APPEND命令
3:使用字符串作為隨機(jī)訪問(wèn)vector
4:對(duì)大量數(shù)據(jù)進(jìn)行編碼,壓縮進(jìn)小空間

List:按插入順序排序。頭部或者尾部tail,left或者right
list最大長(zhǎng)度是2的32次方-1
redis的list主要的功能是支持常量時(shí)間插入和刪除頭部和尾部的元素。即使很多插入的數(shù)據(jù)
訪問(wèn)兩端的元素是非常快速的,但如果想訪問(wèn)中間的元素會(huì)很慢,是O(N)的操作。
主要用途:
1:建立社交網(wǎng)絡(luò)時(shí)間軸模型,使用lpush插入,然后使用lrange來(lái)獲取少量最近插入的數(shù)據(jù)
2:可以使用lpush和ltrim來(lái)創(chuàng)建一個(gè)永遠(yuǎn)不會(huì)超出給定數(shù)量的list,但要記住最新的N個(gè)元素。
3:list可以用來(lái)作為原始消息傳遞
4:可以做大量?jī)?nèi)容

set:不排序的字符串集合,執(zhí)行O(1)。
Redis Set不允許重復(fù)的成員,添加相同的成員會(huì)導(dǎo)致有一個(gè)獨(dú)立的副本。實(shí)際上著意味著添加成員不需要檢查是否已經(jīng)存在。
可以在服務(wù)器端做聯(lián)合操作
set的長(zhǎng)度是2的32次方-1
主要用途:
1:可以跟蹤唯一內(nèi)容,例如想要知道所有帖子的唯一ip地址,簡(jiǎn)單地使用SADD來(lái)處理一個(gè)頁(yè)面,這樣可以確保沒(méi)有重復(fù)的ip唄添加
2:能夠很好地標(biāo)識(shí)關(guān)聯(lián)關(guān)系??梢詣?chuàng)建一個(gè)標(biāo)簽系統(tǒng)。這樣可以添加所有有指定標(biāo)簽的對(duì)象的id到集合中。
3:可以使用set來(lái)抽取元素,spop,srandmember

hash:一個(gè)map類型,字段和值,用來(lái)表示對(duì)象,例如user:1 userObj
一個(gè)帶有少量字段的hash可以使用很少的空間來(lái)存儲(chǔ)。,因此可以存儲(chǔ)百萬(wàn)級(jí)對(duì)象在一個(gè)很小的redis實(shí)例中。hash主要用來(lái)標(biāo)識(shí)對(duì)象,他們能存儲(chǔ)許多元素,因此你可能夠使用hash來(lái)保存其他內(nèi)容
每個(gè)hashkey存儲(chǔ)2的32次方-1個(gè)key-value對(duì),多于4億對(duì)

持久化

redis提供持久化選項(xiàng):
1:RDB:執(zhí)行某個(gè)時(shí)間點(diǎn)的快照
2:AOF:記錄所有服務(wù)器收到的寫操作,可以在服務(wù)器重啟的時(shí)候重新執(zhí)行,構(gòu)造原始的數(shù)據(jù)集。使用追加方式。redis能夠在日志很大的時(shí)候在后臺(tái)重寫。
3:可以禁止持久化,數(shù)據(jù)只在服務(wù)器運(yùn)行的時(shí)候存在
4:在同一個(gè)實(shí)例中組合AOF,RDB。在這種情況下,當(dāng)redis重新啟動(dòng),AOF文件就會(huì)被用來(lái)構(gòu)造原始數(shù)據(jù),

RDB優(yōu)點(diǎn):
1:RDB是一個(gè)非常緊湊的獨(dú)立文件,代表redis某個(gè)時(shí)間點(diǎn)的數(shù)據(jù)。rdb文件優(yōu)先用來(lái)做備份。例如,你可以每小時(shí)壓縮你的RDB文件,然后每天保存一個(gè)RDB的快照。這樣可以很容易恢復(fù)不同版本的數(shù)據(jù)。
2:RDB是一個(gè)非常好的災(zāi)難恢復(fù),作為單獨(dú)的壓縮文件,可以傳輸?shù)綌?shù)據(jù)中心
3:RDB最大化redis的性能,因?yàn)閞edis父進(jìn)程只需要進(jìn)行分配,而子進(jìn)程則完成其余的內(nèi)容。
4:RDB允許快速啟動(dòng),而AOF則不能

RDB缺點(diǎn):
1:如果需要盡可能少的數(shù)據(jù)丟失,RDB不是一個(gè)好的方式。你需要配置很多個(gè)保存點(diǎn)才能保證數(shù)據(jù)少丟失。
2:RDB需要經(jīng)常fork來(lái)使子進(jìn)程能夠進(jìn)行持久化數(shù)據(jù)。

AOF優(yōu)點(diǎn):
1:使用AOF,redis更持久化,可以使用不同的fsync策略。使用這些fsync策略,每秒寫執(zhí)行都會(huì)在一個(gè)后臺(tái)程序中保存。
2:AOF是一個(gè)僅追加日志
3:redis能夠在AOF文件過(guò)大的時(shí)候自動(dòng)重寫,重寫是安全的。
4:AOF包含了所有操作的日志

AOF缺點(diǎn):
1:AOF文件比RDB文件大
2:AOF比RDB慢,fsync策略會(huì)每秒執(zhí)行一次記錄
3:bug

分布式唯一ID

采用41bit存放時(shí)間:精確到毫秒
12bit存放節(jié)點(diǎn)分片的ID:最大值為4095
10bit存放自增ID:
比如GTM時(shí)間 Fri Mar 13 10:00:00 CST 2015 ,它的距1970年的毫秒數(shù)是 1426212000000,假定分片ID是53,自增長(zhǎng)序列是4,則生成的ID是:
5981966696448054276 = 1426212000000 << 22 + 53 << 10 + 4

結(jié)合spring進(jìn)行緩存操作

spring boot里面使用的是Lettuce客戶端連接
1:引入依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2:配置redis服務(wù)器
spring.redis.host=redis-cs
spring.redis.port=6379
spring.redis.timeout=60000
這里是簡(jiǎn)單的配置,還可以配置連接密碼
3:配置連接工廠


@Resource
private LettuceConnectionFactory myLettuceConnectionFactory;
@Bean
    public RedisTemplate<String, Serializable> redisTemplate() {
            RedisTemplate<String, Serializable> template = new RedisTemplate<>();
            template.setKeySerializer(new StringRedisSerializer());
            template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
            template.setConnectionFactory(myLettuceConnectionFactory);
            return template;
}

4:注入RedisTemplate

@Autowired
private RedisTemplate<String, String> redisTemplate;

標(biāo)題名稱:redis實(shí)戰(zhàn)
網(wǎng)頁(yè)地址:http://bm7419.com/article42/ijpsec.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁(yè)設(shè)計(jì)公司、網(wǎng)站建設(shè)、小程序開發(fā)、電子商務(wù)、靜態(tài)網(wǎng)站自適應(yīng)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁(yè)設(shè)計(jì)