http://blog.csdn.net/tzszhzx/article/details/44590871html
一、maven依賴配置java
[html] view plain copyredis
- <dependency>
- <groupId>org.springframework.data</groupId>
- <artifactId>spring-data-redis</artifactId>
- <version>1.4.1.RELEASE</version>
- </dependency>
- <dependency>
- <groupId>redis.clients</groupId>
- <artifactId>jedis</artifactId>
- <version>2.6.2</version>
- </dependency>
- <dependency>
- <groupId>org.apache.commons</groupId>
- <artifactId>commons-lang3</artifactId>
- <version>3.3.2</version>
- </dependency>
二、redis.propertiesspring
[plain] view plain copyapache
- # Redis settings
- #sentinel1的IP和端口
- im.hs.server.redis.sentinel1.host=192.168.62.154
- im.hs.server.redis.sentinel1.port=26379
- #sentinel2的IP和端口
- im.hs.server.redis.sentinel2.host=192.168.62.153
- im.hs.server.redis.sentinel2.port=26379
- #sentinel的鑑權密碼
- im.hs.server.redis.sentinel.masterName=155Master
- im.hs.server.redis.sentinel.password=hezhixiong
- #最大閒置鏈接數
- im.hs.server.redis.maxIdle=500
- #最大鏈接數,超過此鏈接時操做redis會報錯
- im.hs.server.redis.maxTotal=5000
- im.hs.server.redis.maxWaitTime=1000
- im.hs.server.redis.testOnBorrow=true
- #最小閒置鏈接數,spring啓動的時候自動創建該數目的鏈接供應用程序使用,不夠的時候會申請。
- im.hs.server.redis.minIdle=300
三、spring-redis.xml併發
[html] view plain copyapp
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
- xmlns:aop="http://www.springframework.org/schema/aop"
- xsi:schemaLocation="
- http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
- http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
-
- <!-- Spring自動將該包目錄下標記爲@Service的全部類做爲spring的Bean -->
- <context:component-scan base-package="com.gaojiasoft.test.redis" />
-
- <context:property-placeholder location="classpath:conf/redis/redis.properties" />
-
- <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
- <property name="maxTotal" value="${im.hs.server.redis.maxTotal}" />
- <property name="minIdle" value="${im.hs.server.redis.minIdle}" />
- <property name="maxWaitMillis" value="${im.hs.server.redis.maxWaitTime}" />
- <property name="maxIdle" value="${im.hs.server.redis.maxIdle}" />
- <property name="testOnBorrow" value="${im.hs.server.redis.testOnBorrow}" />
- <property name="testOnReturn" value="true" />
- <property name="testWhileIdle" value="true" />
- </bean>
-
- <bean id="sentinelConfiguration"
- class="org.springframework.data.redis.connection.RedisSentinelConfiguration">
- <property name="master">
- <bean class="org.springframework.data.redis.connection.RedisNode">
- <property name="name" value="${im.hs.server.redis.sentinel.masterName}"></property>
- </bean>
- </property>
- <property name="sentinels">
- <set>
- <bean class="org.springframework.data.redis.connection.RedisNode">
- <constructor-arg name="host"
- value="${im.hs.server.redis.sentinel1.host}"></constructor-arg>
- <constructor-arg name="port"
- value="${im.hs.server.redis.sentinel1.port}"></constructor-arg>
- </bean>
- <bean class="org.springframework.data.redis.connection.RedisNode">
- <constructor-arg name="host"
- value="${im.hs.server.redis.sentinel2.host}"></constructor-arg>
- <constructor-arg name="port"
- value="${im.hs.server.redis.sentinel2.port}"></constructor-arg>
- </bean>
- </set>
- </property>
- </bean>
-
- <bean id="connectionFactory"
- class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:password="${im.hs.server.redis.sentinel.password}">
- <constructor-arg name="sentinelConfig" ref="sentinelConfiguration"></constructor-arg>
- <constructor-arg name="poolConfig" ref="poolConfig"></constructor-arg>
- </bean>
-
- <bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
- <property name="connectionFactory" ref="connectionFactory" />
- </bean>
- </beans><strong>
- </strong>
四、RedisServiceImpl.javamaven
[java] view plain copyide
- package com.gaojiasoft.test.redis;
-
- import java.util.concurrent.LinkedBlockingQueue;
- import java.util.concurrent.ThreadPoolExecutor;
- import java.util.concurrent.TimeUnit;
-
- import org.apache.commons.lang3.concurrent.BasicThreadFactory;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.dao.DataAccessException;
- import org.springframework.data.redis.connection.RedisConnection;
- import org.springframework.data.redis.core.RedisCallback;
- import org.springframework.data.redis.core.RedisTemplate;
- import org.springframework.stereotype.Service;
-
- @Service("redisService")
- public class RedisServiceImpl {
-
- private Logger logger = LoggerFactory.getLogger("RedisServiceImpl");
-
- @Autowired
- RedisTemplate<?, ?> redisTemplate;
-
- // 線程池
- private static final ThreadPoolExecutor executor = new ThreadPoolExecutor(
- 256, 256, 30L, TimeUnit.SECONDS,
- new LinkedBlockingQueue<Runnable>(),
- new BasicThreadFactory.Builder().daemon(true)
- .namingPattern("redis-oper-%d").build(),
- new ThreadPoolExecutor.CallerRunsPolicy());
-
- public void set(final String key, final String value) {
- redisTemplate.execute(new RedisCallback<Object>() {
- @Override
- public Object doInRedis(RedisConnection connection)
- throws DataAccessException {
- connection.set(
- redisTemplate.getStringSerializer().serialize(key),
- redisTemplate.getStringSerializer().serialize(value));
- logger.debug("save key:" + key + ",value:" + value);
- return null;
- }
- });
- }
-
- public String get(final String key) {
- return redisTemplate.execute(new RedisCallback<String>() {
- @Override
- public String doInRedis(RedisConnection connection)
- throws DataAccessException {
- byte[] byteKye = redisTemplate.getStringSerializer().serialize(
- key);
- if (connection.exists(byteKye)) {
- byte[] byteValue = connection.get(byteKye);
- String value = redisTemplate.getStringSerializer()
- .deserialize(byteValue);
- logger.debug("get key:" + key + ",value:" + value);
- return value;
- }
- logger.error("valus does not exist!,key:"+key);
- return null;
- }
- });
- }
-
- public void delete(final String key) {
- redisTemplate.execute(new RedisCallback<Object>() {
- public Object doInRedis(RedisConnection connection) {
- connection.del(redisTemplate.getStringSerializer().serialize(
- key));
- return null;
- }
- });
- }
-
- /**
- * 線程池併發操做redis
- *
- * @param keyvalue
- */
- public void mulitThreadSaveAndFind(final String keyvalue) {
- executor.execute(new Runnable() {
- @Override
- public void run() {
- try {
- set(keyvalue, keyvalue);
- get(keyvalue);
- } catch (Throwable th) {
- // 防護性容錯,避免高併發下的一些問題
- logger.error("", th);
- }
- }
- });
- }
- }
五、RedisTest.java (Junit測試用例)高併發
[java] view plain copy
- package com.gaojiasoft.test.redis;
-
- import org.junit.Test;
- import org.springframework.context.ConfigurableApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
-
- public class RedisTest {
-
- private static ConfigurableApplicationContext context;
-
- RedisServiceImpl service;
-
- @Test
- public void testSave() throws InterruptedException {
- context = new ClassPathXmlApplicationContext(
- "classpath:conf/redis/spring-redis.xml");
- service = (RedisServiceImpl) context.getBean("redisService");
-
- int i = 1;
- while (true) {
- Thread.sleep(1);
- try {
- service.mulitThreadSaveAndFind("" + i);
- } catch (Exception e) {
- e.printStackTrace();
- }
- i++;
- }
- }
- }