1. 程式人生 > >Redis設計與優化的幾點建議

Redis設計與優化的幾點建議

Redis+Spring jedis:設計與優化的幾點建議

1.  設計:

a)   Redis適用的場合為需要快速的存取資料,資料之間的關係不是很緊密,因此資料結構設計時儘量設計為獨立。

b)   Redis不適合對值的查詢,如果不可避免會使用到,應該設計輔助的key值來幫助查詢

c)   Key設計的儘量簡單明瞭

d)   一般來說redis更適合儲存實時的資料,對需要持久儲存的資料建議使用資料庫進行儲存。可在初始化redis時從資料庫獲取此類資料。

2.  優化:

從兩個方面來談談優化:

2.1配置: 

a)   配置Spring jedis時其IP配置為本機的真實ip而不使用127.0.0.1和localhost因為最終會對映成為真實的ip這樣對效率影響極大。

b)   此外spring中對jedis的其它一些配置也可以達到優化的效果,例如:連線數的配置,等待時間的配置等。

2.2程式碼:

c)   儘量不使用keys以及key操作,這個操作的時間效率為O(n)隨著redis中的資料增加時間會呈現線性增長,這會導致系統越來越慢。如果一定要使用這樣的操作,建議使用set來代替即使用一個set儲存這部分的key值。

d)   對於一系列的redis操作我們可以使用事務代替,這樣的好處是減少redis的連線從而達到優化效果。

e)   對於批處理事件我們可以自己寫批處理程式碼並通過事務來優化處理過程

f)   Redis分很多個庫我們可以採用分庫的處理方式來處理超大量的資料,根據實際情況來進行分庫處理例如:我們可以將變化很小的資料放置到一個庫中,這樣我們對其資料的操作也會變快,還有一個庫中的資料過大我們也可以將其分開一個庫保特定的資料。

g)   基於redis一般用於儲存實時資料因此建議設定資料超時的時間,這樣可以避免redis資料會持續增加從而導致效能問題。

h)   此外spring jedis中有很多預設的設定,比如RedisTemplate的各類值的序列化方式,比如它的普通Value以及HashValued等都是預設為JdkSerializationRedis的序列方式。它的反序列方式也是這樣的,然而我們有時候不想使用這個方式,進而對其進行設定,這樣往往會導致程式的錯誤。當然我們通過排查程式碼可以解決這個問題。但是你會發現我們會花上一部分工作去設定這些方式,因此我個人建議統一進行此類設定(全部使用預設配置亦或在獲取RedisTemplate統一設定成一類序列化方式)。這樣我們的程式碼會更加整潔,效率也會有對應的提升。

i)   最後spring jedis以及redis的新版本會加入一些新的更有效的方法,因此如果我們是新開的專案那麼建議你使用更新更穩定的版本這樣同樣可以解決一些效能問題,且付出的代價是極小的。

在這裡對設計的上對效能影響的點談的不是很多,因為本人在設計方面實踐的工作還不是很多,如果你有更好的建議,歡迎你留言。

此外附上幾個關於redis學習的網站:

SpringData Redis: http://projects.spring.io/spring-data-redis/