项目作者: fangzy

项目描述 :
jedis plugin for spring
高级语言: Java
项目地址: git://github.com/fangzy/spring-redis-plugin.git
创建时间: 2015-01-14T06:29:38Z
项目社区:https://github.com/fangzy/spring-redis-plugin

开源协议:Apache License 2.0

下载


spring-redis-plugin Build Status Release

本项目是Jedis基于spring的增强版,实现了自动获取连接和关闭连接,提供基于redis的分布式锁实现.

1 Maven POM 配置

使用Jitpack仓库

1.1 添加仓库地址

  1. <repositories>
  2. <repository>
  3. <id>jitpack.io</id>
  4. <url>https://jitpack.io</url>
  5. </repository>
  6. </repositories>

1.2 添加依赖

  1. <dependency>
  2. <groupId>com.github.fangzy</groupId>
  3. <artifactId>spring-redis-plugin</artifactId>
  4. <version>1.5.1</version>
  5. </dependency>

1.3 依赖spring-context项目

  1. <dependency>
  2. <groupId>org.springframework</groupId>
  3. <artifactId>spring-context</artifactId>
  4. <version>4.X.X.RELEASE</version>
  5. <exclusions>
  6. <exclusion>
  7. <groupId>commons-logging</groupId>
  8. <artifactId>commons-logging</artifactId>
  9. </exclusion>
  10. </exclusions>
  11. </dependency>

2 Jedis使用方法

2.1 Spring Configuration配置文件

直接使用默认配置

  1. @Configuration
  2. @PropertySource("classpath:redisPool.properties")
  3. @Import(DefaultRedisConfiguration.class)
  4. public class RedisConfig {
  5. }

自定义配置参见DefaultRedisConfigurationDefaultShardedRedisConfiguration

2.2 Spring XML配置文件

  1. <context:property-placeholder location="classpath:your-redis-settings.properties" file-encoding="UTF-8"></context:property-placeholder>
  2. <!--redis pool-->
  3. <bean id="jedisPoolFactoryConfig" class="redis.clients.jedis.JedisPoolConfig">
  4. <property name="maxTotal" value="${redis.maxTotal}"></property>
  5. <property name="maxIdle" value="${redis.maxIdle}"></property>
  6. <property name="maxWaitMillis" value="${redis.maxWait}"></property>
  7. <property name="minIdle" value="${redis.minIdle}"></property>
  8. <property name="numTestsPerEvictionRun" value="${redis.numTestsPerEvictionRun}"></property>
  9. <property name="testOnBorrow" value="${redis.testOnBorrow}"></property>
  10. <property name="testOnReturn" value="${redis.testOnReturn}"></property>
  11. <property name="testWhileIdle" value="${redis.testWhileIdle}"></property>
  12. </bean>
  13. <bean id="default" class="redis.clients.jedis.JedisPool" destroy-method="destroy">
  14. <constructor-arg ref="jedisPoolFactoryConfig" name="poolConfig"></constructor-arg>
  15. <constructor-arg value="${redis.ip}" name="host" type="java.lang.String"></constructor-arg>
  16. <constructor-arg value="${redis.port}" name="port" type="int"></constructor-arg>
  17. </bean>
  18. <bean id="jedisPool6380" class="redis.clients.jedis.JedisPool" destroy-method="destroy">
  19. <constructor-arg ref="jedisPoolFactoryConfig" name="poolConfig"></constructor-arg>
  20. <constructor-arg value="${redis.ip}" name="host" type="java.lang.String"></constructor-arg>
  21. <constructor-arg value="6380" name="port" type="int"></constructor-arg>
  22. </bean>
  23. <!-- shard redis -->
  24. <bean id="jedisShardInfo1" class="redis.clients.jedis.JedisShardInfo">
  25. <constructor-arg value="${redis.ip}" name="host" type="java.lang.String"></constructor-arg>
  26. <constructor-arg value="${redis.port}" name="port" type="int"></constructor-arg>
  27. </bean>
  28. <bean id="jedisShardInfo2" class="redis.clients.jedis.JedisShardInfo">
  29. <constructor-arg value="${redis.ip}" name="host" type="java.lang.String"></constructor-arg>
  30. <constructor-arg value="6380" name="port" type="int"></constructor-arg>
  31. </bean>
  32. <bean id="shardedJedisPool" class="redis.clients.jedis.ShardedJedisPool" destroy-method="destroy">
  33. <constructor-arg ref="jedisPoolFactoryConfig" name="poolConfig"></constructor-arg>
  34. <constructor-arg name="shards">
  35. <list>
  36. <ref bean="jedisShardInfo1"></ref>
  37. <ref bean="jedisShardInfo2"></ref>
  38. </list>
  39. </constructor-arg>
  40. </bean>
  41. <context:component-scan base-package="org.reindeer.reids" ></context:component-scan>
  42. <!--使用@Redis注解时必须加上-->
  43. <aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>

请按照需要选择配置

2.3 依赖注入

  1. @Service
  2. public class JedisDemo {
  3. @Autowired
  4. private Jedis jedis;
  5. public void setAndGet(String key,int times) {
  6. for (int i=0;i<times;i++) {
  7. jedis.set(key, "test1");
  8. jedis.get(key);
  9. }
  10. jedis.del(key);
  11. }
  12. }

如果需要使用pipelined,watch,unwatch,multi 方法必须开启注解,详见2.4

2.4 使用注解

jedisPool的default为默认数据源,必须存在

  1. @Service
  2. public class JedisDemo {
  3. @Autowired
  4. private Jedis jedis;
  5. @Redis
  6. public void incr(String key,int times) {
  7. Pipeline pipeline = jedis.pipelined();
  8. pipeline.set(key, "1");
  9. for (int i = 0; i < times; i++) {
  10. pipeline.incr(key);
  11. }
  12. Response<String> response = pipeline.get(key);
  13. pipeline.sync();
  14. jedis.del(key);
  15. }
  16. }

2.5 使用JedisProxy

  1. public class JedisDemo {
  2. public static void setAndGet(String key,int times) {
  3. Jedis jedis = JedisProxy.create();
  4. for (int i=0;i<times;i++) {
  5. jedis.set(key, "test1");
  6. jedis.get(key);
  7. }
  8. jedis.del(key);
  9. }
  10. }

JedisProxy 通常用于静态方法,但是需要在spring容器全部加载完毕后使用
如果需要使用pipelined,watch,unwatch,multi 方法必须开启注解,详见2.4

2.6 使用多数据源

  1. @Service
  2. public class JedisDemo {
  3. @Autowired
  4. private Jedis jedis;
  5. @Redis("anotherRedis")
  6. public void incr(String key,int times) {
  7. Pipeline pipeline = jedis.pipelined();
  8. pipeline.set(key, "1");
  9. for (int i = 0; i < times; i++) {
  10. pipeline.incr(key);
  11. }
  12. Response<String> response = pipeline.get(key);
  13. pipeline.sync();
  14. jedis.del(key);
  15. }
  16. }

java config 使用@Bean(name="anotherRedis")来定义数据源名称

  1. @Configuration
  2. public class RedisConfiguration {
  3. @Bean(name = "default", destroyMethod = "destroy")
  4. public JedisPool defaultJedisPool() {
  5. return new JedisPool(defaultJedisPoolConfig(),
  6. env.getProperty("redis.host", "127.0.0.1"),
  7. env.getProperty("redis.port", Integer.class, 6379),
  8. Protocol.DEFAULT_TIMEOUT,
  9. StringUtils.isEmpty(env.getProperty("redis.password")) ? null : env.getProperty("redis.password"));
  10. }
  11. @Bean(name = "anotherRedis", destroyMethod = "destroy")
  12. public JedisPool testJedisPool() {
  13. return new JedisPool(defaultJedisPoolConfig(),
  14. env.getProperty("redis.host2", "127.0.0.1"),
  15. env.getProperty("redis.port2", Integer.class, 6379),
  16. Protocol.DEFAULT_TIMEOUT,
  17. StringUtils.isEmpty(env.getProperty("redis.password2")) ? null : env.getProperty("redis.password2"));
  18. }
  19. }

xml配置

  1. <bean id="default" class="redis.clients.jedis.JedisPool" destroy-method="destroy">
  2. <constructor-arg ref="jedisPoolFactoryConfig" name="poolConfig"></constructor-arg>
  3. <constructor-arg value="${redis.ip}" name="host" type="java.lang.String"></constructor-arg>
  4. <constructor-arg value="${redis.port}" name="port" type="int"></constructor-arg>
  5. </bean>
  6. <bean id="anotherRedis" class="redis.clients.jedis.JedisPool" destroy-method="destroy">
  7. <constructor-arg ref="jedisPoolFactoryConfig" name="poolConfig"></constructor-arg>
  8. <constructor-arg value="${redis.ip}" name="host" type="java.lang.String"></constructor-arg>
  9. <constructor-arg value="6380" name="port" type="int"></constructor-arg>
  10. </bean>

jedisPool的default为默认数据源,必须存在

2.7 使用shard

  1. @Service
  2. public class ShardedJedisDemo {
  3. @Autowired
  4. private ShardedJedis shardedJedis;
  5. @Redis(shard = true)
  6. public void incr(String key, int times) {
  7. ShardedJedisPipeline pipeline = shardedJedis.pipelined();
  8. for (int i = 0; i < times; i++) {
  9. pipeline.incr(key + i);
  10. }
  11. Response<String> response = pipeline.get(key + 1);
  12. pipeline.sync();
  13. LOGGER.info(response.get());
  14. }
  15. }

java config配置

  1. @Configuration
  2. public class RedisConfiguration {
  3. @Bean(destroyMethod = "destroy")
  4. public ShardedJedisPool defaultShardedJedisPool() {
  5. String hoststr = env.getProperty("redis.sharded.hosts", "127.0.0.1");
  6. String portstr = env.getProperty("redis.sharded.ports", "6379");
  7. List<String> hosts = Arrays.asList(hoststr.split(","));
  8. List<Integer> ports = Stream.of(portstr.split(",")).map(Integer::new).collect(Collectors.toList());
  9. List<JedisShardInfo> list = IntStream.range(0, hosts.size()).mapToObj(i -> new JedisShardInfo(hosts.get(i), ports.get(i))).collect(Collectors.toList());
  10. return new ShardedJedisPool(defaultJedisPoolConfig(), list);
  11. }
  12. }

xml配置

  1. <bean id="jedisShardInfo1" class="redis.clients.jedis.JedisShardInfo">
  2. <constructor-arg value="${redis.ip}" name="host" type="java.lang.String"></constructor-arg>
  3. <constructor-arg value="${redis.port}" name="port" type="int"></constructor-arg>
  4. </bean>
  5. <bean id="jedisShardInfo2" class="redis.clients.jedis.JedisShardInfo">
  6. <constructor-arg value="${redis.ip}" name="host" type="java.lang.String"></constructor-arg>
  7. <constructor-arg value="6380" name="port" type="int"></constructor-arg>
  8. </bean>
  9. <bean id="shardedJedisPool" class="redis.clients.jedis.ShardedJedisPool" destroy-method="destroy">
  10. <constructor-arg ref="jedisPoolFactoryConfig" name="poolConfig"></constructor-arg>
  11. <constructor-arg name="shards">
  12. <list>
  13. <ref bean="jedisShardInfo1"></ref>
  14. <ref bean="jedisShardInfo2"></ref>
  15. </list>
  16. </constructor-arg>
  17. </bean>

3 JLock分布式锁

  • void waitLock(String key) 一直等待解锁
  • boolean getLock(String key) 获得锁,超时退出
  • boolean checkLock(String key) 检查锁是否存在,立即返回
  • void releaseLock(String key) 手动释放锁