`
truelove12358
  • 浏览: 77619 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

Redis实战之Redis + Jedis

 
阅读更多

Memcached,对于缓存对象大小有要求,单个对象不得大于1MB,且不支持复杂的数据类型,譬如SET

等。基于这些限制,有必要考虑Redis

相关链接:

Redis实战

Redis实战之Redis + Jedis

Redis实战之征服 Redis + Jedis + Spring (一)

Redis实战之征服 Redis + Jedis + Spring (二)

Redis实战之征服 Redis + Jedis + Spring (三)

言归正传,目前Redis大概有3中基于Java语言的Client:

  • Jredis
  • Jedis
  • Redis4J

这里只说Jedis,因为它是官方提供的唯一Redis Client ForJavaProvider!

一、简单使用Jedis

需要Jedis就从Maven获取吧!
Maven Pom.xml

Xml代码
  1. <dependency>
  2. <groupId>redis.clients</groupId>
  3. <artifactId>jedis</artifactId>
  4. <version>2.1.0</version>
  5. <type>jar</type>
  6. <scope>compile</scope>
  7. </dependency>
  1. <dependency>
  2. <groupId>redis.clients</groupId>
  3. <artifactId>jedis</artifactId>
  4. <version>2.1.0</version>
  5. <type>jar</type>
  6. <scope>compile</scope>
  7. </dependency>

如果只是简单使用Jedis,以下这么几行代码足够:

Java代码
  1. Jedisjedis=newJedis("10.11.20.140");
  2. Stringkeys="name";
  3. //删数据
  4. jedis.del(keys);
  5. //存数据
  6. jedis.set(keys,"snowolf");
  7. //取数据
  8. Stringvalue=jedis.get(keys);
  9. System.out.println(value);
  1. Jedisjedis=newJedis("10.11.20.140");
  2. Stringkeys="name";
  3. //删数据
  4. jedis.del(keys);
  5. //存数据
  6. jedis.set(keys,"snowolf");
  7. //取数据
  8. Stringvalue=jedis.get(keys);
  9. System.out.println(value);

二、池化使用Jedis

Jedis使用commons-pool完成池化实现。

先做个配置文件:

Properties代码
  1. #最大分配的对象数
  2. redis.pool.maxActive=1024
  3. #最大能够保持idel状态的对象数
  4. redis.pool.maxIdle=200
  5. #当池内没有返回对象时,最大等待时间
  6. redis.pool.maxWait=1000
  7. #当调用borrowObject方法时,是否进行有效性检查
  8. redis.pool.testOnBorrow=true
  9. #当调用returnObject方法时,是否进行有效性检查
  10. redis.pool.testOnReturn=true
  11. #IP
  12. redis.ip=10.11.20.140
  13. #Port
  14. redis.port=6379

在静态代码段中完成初始化:

Java代码
  1. privatestaticJedisPoolpool;
  2. static{
  3. ResourceBundlebundle=ResourceBundle.getBundle("redis");
  4. if(bundle==null){
  5. thrownewIllegalArgumentException(
  6. "[redis.properties]isnotfound!");
  7. }
  8. JedisPoolConfigconfig=newJedisPoolConfig();
  9. config.setMaxActive(Integer.valueOf(bundle
  10. .getString("redis.pool.maxActive")));
  11. config.setMaxIdle(Integer.valueOf(bundle
  12. .getString("redis.pool.maxIdle")));
  13. config.setMaxWait(Long.valueOf(bundle.getString("redis.pool.maxWait")));
  14. config.setTestOnBorrow(Boolean.valueOf(bundle
  15. .getString("redis.pool.testOnBorrow")));
  16. config.setTestOnReturn(Boolean.valueOf(bundle
  17. .getString("redis.pool.testOnReturn")));
  18. pool=newJedisPool(config,bundle.getString("redis.ip"),
  19. Integer.valueOf(bundle.getString("redis.port")));
  20. }
  1. privatestaticJedisPoolpool;
  2. static{
  3. ResourceBundlebundle=ResourceBundle.getBundle("redis");
  4. if(bundle==null){
  5. thrownewIllegalArgumentException(
  6. "[redis.properties]isnotfound!");
  7. }
  8. JedisPoolConfigconfig=newJedisPoolConfig();
  9. config.setMaxActive(Integer.valueOf(bundle
  10. .getString("redis.pool.maxActive")));
  11. config.setMaxIdle(Integer.valueOf(bundle
  12. .getString("redis.pool.maxIdle")));
  13. config.setMaxWait(Long.valueOf(bundle.getString("redis.pool.maxWait")));
  14. config.setTestOnBorrow(Boolean.valueOf(bundle
  15. .getString("redis.pool.testOnBorrow")));
  16. config.setTestOnReturn(Boolean.valueOf(bundle
  17. .getString("redis.pool.testOnReturn")));
  18. pool=newJedisPool(config,bundle.getString("redis.ip"),
  19. Integer.valueOf(bundle.getString("redis.port")));
  20. }

然后,修改前面那段jedis操作Redis

Java代码
  1. //从池中获取一个Jedis对象
  2. Jedisjedis=pool.getResource();
  3. Stringkeys="name";
  4. //删数据
  5. jedis.del(keys);
  6. //存数据
  7. jedis.set(keys,"snowolf");
  8. //取数据
  9. Stringvalue=jedis.get(keys);
  10. System.out.println(value);
  11. //释放对象池
  12. pool.returnResource(jedis);
  1. //从池中获取一个Jedis对象
  2. Jedisjedis=pool.getResource();
  3. Stringkeys="name";
  4. //删数据
  5. jedis.del(keys);
  6. //存数据
  7. jedis.set(keys,"snowolf");
  8. //取数据
  9. Stringvalue=jedis.get(keys);
  10. System.out.println(value);
  11. //释放对象池
  12. pool.returnResource(jedis);

改为从对象池中,获取Jedis实例:

Java代码
  1. //从池中获取一个Jedis对象
  2. Jedisjedis=pool.getResource();
  1. //从池中获取一个Jedis对象
  2. Jedisjedis=pool.getResource();

切记,最后使用后,释放Jedis对象:

Java代码
  1. //释放对象池
  2. pool.returnResource(jedis);
  1. //释放对象池
  2. pool.returnResource(jedis);

三、一致性哈希

Memcached完全基于分布式集群,而RedisMaster-Slave,如果想把Reids,做成集群模式,无外乎多做几套Master-Slave,每套Master-Slave完成各自的容灾处理,通过Client工具,完成一致性哈希。

PS:Memcached是在Server端完成ShardingRedis只能依靠各个ClientSharding。可能会在Redis 3.0系列支持ServerSharding

保留前面的JedisPoolConfig,新增两个Redis的IP(redis1.ip,redis2.ip),完成两个JedisShardInfo实例,并将其丢进List中:

Java代码
  1. JedisShardInfojedisShardInfo1=newJedisShardInfo(
  2. bundle.getString("redis1.ip"),Integer.valueOf(bundle.getString("redis.port")));
  3. JedisShardInfojedisShardInfo2=newJedisShardInfo(
  4. bundle.getString("redis2.ip"),Integer.valueOf(bundle.getString("redis.port")));
  5. List<JedisShardInfo>list=newLinkedList<JedisShardInfo>();
  6. list.add(jedisShardInfo1);
  7. list.add(jedisShardInfo2);
  1. JedisShardInfojedisShardInfo1=newJedisShardInfo(
  2. bundle.getString("redis1.ip"),Integer.valueOf(bundle.getString("redis.port")));
  3. JedisShardInfojedisShardInfo2=newJedisShardInfo(
  4. bundle.getString("redis2.ip"),Integer.valueOf(bundle.getString("redis.port")));
  5. List<JedisShardInfo>list=newLinkedList<JedisShardInfo>();
  6. list.add(jedisShardInfo1);
  7. list.add(jedisShardInfo2);

初始化ShardedJedisPool代替JedisPool:

Java代码
  1. ShardedJedisPoolpool=newShardedJedisPool(config,list);
  1. ShardedJedisPoolpool=newShardedJedisPool(config,list);

改由ShardedJedis,获取Jedis对象:

Java代码
  1. //从池中获取一个Jedis对象
  2. ShardedJedisjedis=pool.getResource();
  3. Stringkeys="name";
  4. Stringvalue="snowolf";
  5. //删数据
  6. jedis.del(keys);
  7. //存数据
  8. jedis.set(keys,value);
  9. //取数据
  10. Stringv=jedis.get(keys);
  11. System.out.println(v);
  12. //释放对象池
  13. pool.returnResource(jedis);
  1. //从池中获取一个Jedis对象
  2. ShardedJedisjedis=pool.getResource();
  3. Stringkeys="name";
  4. Stringvalue="snowolf";
  5. //删数据
  6. jedis.del(keys);
  7. //存数据
  8. jedis.set(keys,value);
  9. //取数据
  10. Stringv=jedis.get(keys);
  11. System.out.println(v);
  12. //释放对象池
  13. pool.returnResource(jedis);

四、Spring封装参考

Ok,完成上述代码足够完成简单任务,如果有必要,可以用spring封装初始化:

Xml代码
  1. <context:property-placeholderlocation="classpath:redis.properties"/>
  2. <bean
  3. id="jedisPoolConfig"
  4. class="redis.clients.jedis.JedisPoolConfig"
  5. >
  6. <property
  7. name="maxActive"
  8. value="${redis.pool.maxActive}"/>
  9. <property
  10. name="maxIdle"
  11. value="${redis.pool.maxIdle}"/>
  12. <property
  13. name="maxWait"
  14. value="${redis.pool.maxWait}"/>
  15. <property
  16. name="testOnBorrow"
  17. value="${redis.pool.testOnBorrow}"/>
  18. </bean>
  19. <bean
  20. id="shardedJedisPool"
  21. class="redis.clients.jedis.ShardedJedisPool"
  22. >
  23. <constructor-arg
  24. index="0"
  25. ref="jedisPoolConfig"/>
  26. <constructor-argindex="1">
  27. <list>
  28. <beanclass="redis.clients.jedis.JedisShardInfo">
  29. <constructor-arg
  30. index="0"
  31. value="${redis1.ip}"/>
  32. <constructor-arg
  33. index="1"
  34. value="${redis.port}"
  35. type="int"/>
  36. </bean>
  37. <beanclass="redis.clients.jedis.JedisShardInfo">
  38. <constructor-arg
  39. index="0"
  40. value="${redis2.ip}"/>
  41. <constructor-arg
  42. index="1"
  43. value="${redis.port}"
  44. type="int"/>
  45. </bean>
  46. </list>
  47. </constructor-arg>
  48. </bean>
  1. <context:property-placeholderlocation="classpath:redis.properties"/>
  2. <bean
  3. id="jedisPoolConfig"
  4. class="redis.clients.jedis.JedisPoolConfig"
  5. >
  6. <property
  7. name="maxActive"
  8. value="${redis.pool.maxActive}"/>
  9. <property
  10. name="maxIdle"
  11. value="${redis.pool.maxIdle}"/>
  12. <property
  13. name="maxWait"
  14. value="${redis.pool.maxWait}"/>
  15. <property
  16. name="testOnBorrow"
  17. value="${redis.pool.testOnBorrow}"/>
  18. </bean>
  19. <bean
  20. id="shardedJedisPool"
  21. class="redis.clients.jedis.ShardedJedisPool"
  22. >
  23. <constructor-arg
  24. index="0"
  25. ref="jedisPoolConfig"/>
  26. <constructor-argindex="1">
  27. <list>
  28. <beanclass="redis.clients.jedis.JedisShardInfo">
  29. <constructor-arg
  30. index="0"
  31. value="${redis1.ip}"/>
  32. <constructor-arg
  33. index="1"
  34. value="${redis.port}"
  35. type="int"/>
  36. </bean>
  37. <beanclass="redis.clients.jedis.JedisShardInfo">
  38. <constructor-arg
  39. index="0"
  40. value="${redis2.ip}"/>
  41. <constructor-arg
  42. index="1"
  43. value="${redis.port}"
  44. type="int"/>
  45. </bean>
  46. </list>
  47. </constructor-arg>
  48. </bean>

代码可以更简洁一些:

Java代码
  1. privateApplicationContextapp;
  2. privateShardedJedisPoolpool;
  3. @Before
  4. publicvoidbefore()throwsException{
  5. app=newClassPathXmlApplicationContext("applicationContext.xml");
  6. pool=(ShardedJedisPool)app.getBean("shardedJedisPool");
  7. }
  8. @Test
  9. publicvoidtest(){
  10. //从池中获取一个Jedis对象
  11. ShardedJedisjedis=pool.getResource();
  12. Stringkeys="name";
  13. Stringvalue="snowolf";
  14. //删数据
  15. jedis.del(keys);
  16. //存数据
  17. jedis.set(keys,value);
  18. //取数据
  19. Stringv=jedis.get(keys);
  20. System.out.println(v);
  21. //释放对象池
  22. pool.returnResource(jedis);
  23. assertEquals(value,v);
  24. }
  1. privateApplicationContextapp;
  2. privateShardedJedisPoolpool;
  3. @Before
  4. publicvoidbefore()throwsException{
  5. app=newClassPathXmlApplicationContext("applicationContext.xml");
  6. pool=(ShardedJedisPool)app.getBean("shardedJedisPool");
  7. }
  8. @Test
  9. publicvoidtest(){
  10. //从池中获取一个Jedis对象
  11. ShardedJedisjedis=pool.getResource();
  12. Stringkeys="name";
  13. Stringvalue="snowolf";
  14. //删数据
  15. jedis.del(keys);
  16. //存数据
  17. jedis.set(keys,value);
  18. //取数据
  19. Stringv=jedis.get(keys);
  20. System.out.println(v);
  21. //释放对象池
  22. pool.returnResource(jedis);
  23. assertEquals(value,v);
  24. }


当然,Spring提供了对于Redis的专门支持:spring-data-redis,以后有机会再深入研究。

相关链接:

Redis实战

Redis实战之Redis + Jedis

Redis实战之征服 Redis + Jedis + Spring (一)

Redis实战之征服 Redis + Jedis + Spring (二)

Redis实战之征服 Redis + Jedis + Spring (三)

分享到:
评论

相关推荐

    SpringBoot+Shiro+JWT+Jedis+MybatisPlus+前后端分离+基于url通用权限管理系统

    本系统“SpringBoot+Shiro+JWT+Jedis+MybatisPlus+前后端分离+基于url通用权限管理系统”就是针对这一需求而设计的,它结合了多种技术,提供了高效、安全且灵活的解决方案。 首先,SpringBoot是这个系统的核心,它...

    redis3.2.1+jedis2.8.0+jedis.api.rar一站下载

    Jedis是Java语言开发的Redis客户端,提供了丰富的API来操作Redis服务器,便于Java开发者在项目中集成Redis。 Redis 3.2.1是Redis的一个稳定版本,相比于早期版本,它引入了一些新的特性和改进。其中,重要的更新...

    redis2.8+jedis2.5+jedis英文api

    Jedis是Java开发的Redis客户端,它提供了与Redis服务器交互的API,使得在Java应用中使用Redis变得简单。Jedis 2.5是该压缩包中包含的版本,它支持了当时Redis的大多数命令,包括基本操作和事务处理。 首先,了解...

    redis连接池jar jedis+common

    在Java应用中,为了提高性能和资源利用率,通常会使用连接池管理Jedis实例,这就是“redis连接池jar jedis+common”所指的内容。 一、Redis简介 Redis是一个开源的、基于内存的数据结构存储系统,可以作为数据库、...

    各种版本的redis+Jedis驱动包

    在这个压缩包中,包含了不同平台下的Redis安装包,以及Jedis驱动,这使得在Windows和Linux环境下都能轻松地使用Redis。 首先,让我们详细了解Redis的不同版本: 1. **Redis Windows 32位与64位安装包**:Redis原本...

    Shiro + JWT + SpringBoot + MySQL + Redis(Jedis)实现无状态鉴权机制

    本项目结合了Apache Shiro、JSON Web Token (JWT)、SpringBoot、MySQL数据库以及Redis缓存技术(通过Jedis客户端)来实现这一机制。下面我们将详细探讨这些组件在实现无状态鉴权中的作用。 **Apache Shiro** Apache...

    Redis部署笔记(单机+主从+哨兵+集群)

    基于Centos7系统,由浅入深讲解如何部署Redis的四种模式,分别是:单机模式、主从模式、哨兵模式、集群模式。 完整原文:http://exp-blog.com/2018/09/14/pid-2285/ 同时提供Jedis客户端封装源码: ● 屏蔽Jedis与...

    redis+jedis+mysql+SSM整合,适合新手菜鸟学习,里面有redis64位

    最近学习redis,一直找不到合适的资料,找了挺久的 ,做了个省市联动的整合,用redis和Mysql来做的,spring配的jedis连接池,完全是给新手看的,我也是个菜鸟,供初学者学习吧,因为所有对象都可以转化为json字符串...

    Redis+Jedis+案例实战(高清视频教程).rar

    在本教程“Redis+Jedis+案例实战”中,你将深入学习如何利用Redis和Jedis进行实际项目开发。以下是一些关键知识点的概述: 1. Redis基础知识: - 数据类型:Redis支持五种基本数据类型,包括字符串(String)、...

    spring-data + jedis + redis代码

    本项目聚焦于Spring Data与Jedis的集成,用于利用Redis作为缓存解决方案。Jedis是Java的一个开源客户端,专门用于连接和操作Redis服务器。 首先,让我们详细了解一下Spring Data。Spring Data是一个模块化的项目,...

    Redis实战.pdf+Redis源码

    对于Java开发者,可以学习如何在Java项目中集成Redis,使用Jedis或Lettuce等客户端库进行交互,实现高效的缓存策略和数据交换。 总结,Redis实战不仅涵盖了基本的数据类型和操作,还涉及高级特性如发布订阅、事务、...

    redis3.0+jedis

    而Jedis是Java语言的Redis客户端,提供了丰富的API来与Redis服务器进行交互。 Redis 3.0引入了多项增强和改进,包括: 1. **Cluster Support**: Redis 3.0首次实现了集群功能,允许用户将数据分布在多个节点上,...

    征服 Redis + Jedis + Spring (三)—— 列表操作

    Jedis 是 Java 开发者常用的 Redis 客户端库,而 Spring Data Redis 是 Spring 框架的一部分,它提供了与 Redis 集成的高级抽象。在“征服 Redis + Jedis + Spring (三)—— 列表操作”这一主题中,我们将深入探讨...

    redis+spring jedis方式

    Jedis是一个轻量级的Redis客户端,而Spring Data Redis则提供了更高层次的抽象,使得开发者能够更方便地操作Redis,无需直接处理低级别的Jedis API。 标题提到的"redis+spring jedis方式",意味着我们将讨论如何...

    redis+jedis+api

    Jedis是Java语言编写的Redis客户端,提供了丰富的API来操作Redis服务器,使得在Java应用中使用Redis变得简单。 在Redis 3.2.1版本中,引入了一些重要的改进和优化,包括但不限于以下几点: 1. **lua脚本支持增强**...

    redis(哨兵模式配置) + springmvc

    &lt;bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"&gt; &lt;bean class="org.springframework.data.redis.sentinel.Configuration"&gt; ...

    tomcat7+jdk1.7+redis session共享;tomcat8+jdk1.8+redis session共享 jar包+配置文件

    2. Redis连接器:Java应用需要一个Redis连接器(如Jedis或Lettuce)来与Redis进行通信。这些连接器提供了Java API,使得应用程序能够方便地读写Redis中的session数据。 3. 配置文件:在Tomcat的`context.xml`或`...

    redis安装脚本+jedis.jar.zip

    本文将详细介绍如何使用提供的"redis安装脚本+jedis.jar.zip"进行Redis的安装以及Jedis的使用。 首先,我们来解压下载的"redis安装脚本+jedis.jar.zip"文件,会得到两个文件:`jedis-2.0.0.jar`和`install_redis.sh...

Global site tag (gtag.js) - Google Analytics