redis與spring的整合一般分為spring-data-redis整合和jedis整合,先看看兩者的區別
1、引用的依賴不同:
spring-data-redis使用的依賴如下:
<dependency>?? ??????<groupid>org.springframework.data</groupid>?? ??????<artifactid>spring-data-redis</artifactid>?? ??????<version>1.8.9.RELEASE</version>?? </dependency>
jedis使用的依賴如下:
<dependency> ???????<groupid>redis.clients</groupid> ???????<artifactid>jedis</artifactid> ???????<version>2.9.0</version> ???????<type>jar</type> ???????<scope>compile</scope></dependency>
2、管理jedis實例方式、操作redis服務的不同:
spring-data-redis:
????通過org.springframework.data.redis.connection.jedis.JedisConnectionFactory來管理,即通過工廠類管理,然后通過配置的模版bean,操作redis服務,代碼段中充斥大量與業務無關的模版片段代碼,代碼冗余,不易維護,比如像下面的代碼:
protected?RedisTemplate<serializable>?redisTemplate; ? public?void?saveUser(User?user)?{ ????redisTemplate.execute(new?RedisCallback<object>()?{ ? ? ????????@Override ????????public?Object?doInRedis(RedisConnection?connection)?throws?DataAccessException?{ ????????????connection.set(redisTemplate.getStringSerializer().serialize("user.uid."?+?user.getId()), ???????????????????????????redisTemplate.getStringSerializer().serialize(user.getName())); ????????????return?null; ????????} ????}); } ? ? public?User?getUser(long?id)?{ ????return?redisTemplate.execute(new?RedisCallback<user>()?{ ????????@Override ????????public?User?doInRedis(RedisConnection?connection)?throws?DataAccessException?{ ????????????byte[]?key?=?redisTemplate.getStringSerializer().serialize("user.uid."?+?id); ????????????if?(connection.exists(key))?{ ????????????????byte[]?value?=?connection.get(key); ????????????????String?name?=?redisTemplate.getStringSerializer().deserialize(value); ????????????????User?user?=?new?User(); ????????????????user.setName(name); ????????????????user.setId(id); ????????????????return?user; ????????????} ????????????return?null; ????????} ????}); }</user></object></serializable>
RedisTemplate介紹
spring 封裝了 RedisTemplate 對象來進行對redis的各種操作,它支持所有的 redis 原生的 api。在RedisTemplate中提供了幾個常用的接口方法的使用,分別是:
private ValueOperations
RedisTemplate中定義了對5種數據結構操作
redisTemplate.opsForValue();//操作字符串 redisTemplate.opsForHash();//操作hash redisTemplate.opsForList();//操作list redisTemplate.opsForSet();//操作set redisTemplate.opsForZSet();//操作有序set StringRedisTemplate與RedisTemplate
兩者的關系是StringRedisTemplate繼承RedisTemplate。
兩者的數據是不共通的;也就是說StringRedisTemplate只能管理StringRedisTemplate里面的數據,RedisTemplate只能管理RedisTemplate中的數據。
SDR默認采用的序列化策略有兩種,一種是String的序列化策略,一種是JDK的序列化策略。
StringRedisTemplate默認采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。
RedisTemplate默認采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。
jedis方式:
通過redis.clients.jedis.JedisPool來管理,即通過池來管理,通過池對象獲取jedis實例,然后通過jedis實例直接操作redis服務,剔除了與業務無關的冗余代碼,如下面的代碼片段:
private?JedisPool?jedisPool; public?String?save(String?key,String?val)?{ Jedis?jedis?=?jedisPool.getResource(); return?jedis.set(key,?val); }
從工廠類到池的方式變化,就相當于mybatis連接mysql方變化是一樣的,代碼變得更簡潔,維護也更容易了。Jedis使用apache commons-pool2對Jedis資源池進行管理,所以在定義JedisPool時一個很重要的參數就是資源池GenericObjectPoolConfig,使用方式如下,其中有很多資源管理和使用的參數。
參數說明
JedisPool保證資源在一個可控范圍內,并且提供了線程安全,但是一個合理的GenericObjectPoolConfig配置能為應用使用Redis保駕護航,下面將對它的一些重要參數進行說明和建議:
在當前環境下,Jedis連接就是資源,JedisPool管理的就是Jedis連接。
1、資源設置和使用
maxTotal:資源池中最大連接數;默認值:8 設置建議見下節
maxIdle:資源池允許最大空閑的連接數;默認值:8;使用建議:設置建議見下節
minIdle:資源池確保最少空閑的連接數;默認值:0;使用建議:設置建議見下節
blockWhenExhausted:當資源池用盡后,調用者是否要等待。只有當為true時,下面的maxWaitMillis才會生效;默認值:true;使用建議:建議使用默認值
maxWaitMillis:當資源池連接用盡后,調用者的最大等待時間(單位為毫秒) -1:表示永不超時;使用建議:不建議使用默認值
testOnBorrow:向資源池借用連接時是否做連接有效性檢測(ping),無效連接會被移除;默認值:false;使用建議:業務量很大時候建議設置為false(多一次ping的開銷)。
testOnReturn:向資源池歸還連接時是否做連接有效性檢測(ping),無效連接會被移除;默認值:false;使用建議:業務量很大時候建議設置為false(多一次ping的開銷)。
jmxEnabled:是否開啟jmx監控,可用于監控;默認值:true;使用建議:建議開啟,但應用本身也要開啟
2、空閑資源監測
空閑Jedis對象檢測,下面四個參數組合來完成,testWhileIdle是該功能的開關。
testWhileIdle:是否開啟空閑資源監測;默認值:false;使用建議:true
timeBetweenEvictionRunsMillis:空閑資源的檢測周期(單位為毫秒);默認值:-1:不檢測;使用建議:建議設置,周期自行選擇,也可以默認也可以使用下面JedisPoolConfig中的配置
minEvictableIdleTimeMillis:資源池中資源最小空閑時間(單位為毫秒),達到此值后空閑資源將被移除;默認值:1000 60 30 = 30分鐘;使用建議:可根據自身業務決定,大部分默認值即可,也可以考慮使用下面JeidsPoolConfig中的配置
numTestsPerEvictionRun:做空閑資源檢測時,每次的采樣數;默認值:3;使用建議:可根據自身應用連接數進行微調,如果設置為-1,就是對所有連接做空閑監測
更多Redis相關知識,請訪問Redis使用教程欄目!