用Memcached,对于缓存对象大小有要求,单个对象不得大于1MB,且不支持复杂的数据类型,譬如SET
等。基于这些限制,有必要考虑Redis!
相关链接:
Redis实战
Redis实战之Redis + Jedis
Redis实战之征服 Redis + Jedis + Spring (一)
Redis实战之征服 Redis + Jedis + Spring (二)
Redis实战之征服 Redis + Jedis + Spring (三)
言归正传,目前Redis大概有3中基于Java语言的Client:
这里只说Jedis,因为它是官方提供的唯一Redis Client ForJavaProvider!
一、简单使用Jedis
需要Jedis就从Maven获取吧!
Maven Pom.xml
-
<dependency>
-
<groupId>redis.clients</groupId>
-
<artifactId>jedis</artifactId>
-
<version>2.1.0</version>
-
<type>jar</type>
-
<scope>compile</scope>
-
</dependency>
-
<dependency>
-
<groupId>redis.clients</groupId>
-
<artifactId>jedis</artifactId>
-
<version>2.1.0</version>
-
<type>jar</type>
-
<scope>compile</scope>
-
</dependency>
如果只是简单使用Jedis,以下这么几行代码足够:
-
Jedisjedis=newJedis("10.11.20.140");
-
Stringkeys="name";
-
-
-
jedis.del(keys);
-
-
jedis.set(keys,"snowolf");
-
-
Stringvalue=jedis.get(keys);
-
-
System.out.println(value);
-
Jedisjedis=newJedis("10.11.20.140");
-
Stringkeys="name";
-
-
-
jedis.del(keys);
-
-
jedis.set(keys,"snowolf");
-
-
Stringvalue=jedis.get(keys);
-
-
System.out.println(value);
二、池化使用Jedis
Jedis使用commons-pool完成池化实现。
先做个配置文件:
-
#最大分配的对象数
-
redis.pool.maxActive=1024
-
#最大能够保持idel状态的对象数
-
redis.pool.maxIdle=200
-
#当池内没有返回对象时,最大等待时间
-
redis.pool.maxWait=1000
-
#当调用borrowObject方法时,是否进行有效性检查
-
redis.pool.testOnBorrow=true
-
#当调用returnObject方法时,是否进行有效性检查
-
redis.pool.testOnReturn=true
-
#IP
-
redis.ip=10.11.20.140
-
#Port
-
redis.port=6379
在静态代码段中完成初始化:
-
privatestaticJedisPoolpool;
-
static{
-
ResourceBundlebundle=ResourceBundle.getBundle("redis");
-
if(bundle==null){
-
thrownewIllegalArgumentException(
-
"[redis.properties]isnotfound!");
-
}
-
JedisPoolConfigconfig=newJedisPoolConfig();
-
config.setMaxActive(Integer.valueOf(bundle
-
.getString("redis.pool.maxActive")));
-
config.setMaxIdle(Integer.valueOf(bundle
-
.getString("redis.pool.maxIdle")));
-
config.setMaxWait(Long.valueOf(bundle.getString("redis.pool.maxWait")));
-
config.setTestOnBorrow(Boolean.valueOf(bundle
-
.getString("redis.pool.testOnBorrow")));
-
config.setTestOnReturn(Boolean.valueOf(bundle
-
.getString("redis.pool.testOnReturn")));
-
pool=newJedisPool(config,bundle.getString("redis.ip"),
-
Integer.valueOf(bundle.getString("redis.port")));
-
}
-
privatestaticJedisPoolpool;
-
static{
-
ResourceBundlebundle=ResourceBundle.getBundle("redis");
-
if(bundle==null){
-
thrownewIllegalArgumentException(
-
"[redis.properties]isnotfound!");
-
}
-
JedisPoolConfigconfig=newJedisPoolConfig();
-
config.setMaxActive(Integer.valueOf(bundle
-
.getString("redis.pool.maxActive")));
-
config.setMaxIdle(Integer.valueOf(bundle
-
.getString("redis.pool.maxIdle")));
-
config.setMaxWait(Long.valueOf(bundle.getString("redis.pool.maxWait")));
-
config.setTestOnBorrow(Boolean.valueOf(bundle
-
.getString("redis.pool.testOnBorrow")));
-
config.setTestOnReturn(Boolean.valueOf(bundle
-
.getString("redis.pool.testOnReturn")));
-
pool=newJedisPool(config,bundle.getString("redis.ip"),
-
Integer.valueOf(bundle.getString("redis.port")));
-
}
然后,修改前面那段jedis操作Redis
-
-
Jedisjedis=pool.getResource();
-
Stringkeys="name";
-
-
-
jedis.del(keys);
-
-
jedis.set(keys,"snowolf");
-
-
Stringvalue=jedis.get(keys);
-
-
System.out.println(value);
-
-
-
pool.returnResource(jedis);
-
-
Jedisjedis=pool.getResource();
-
Stringkeys="name";
-
-
-
jedis.del(keys);
-
-
jedis.set(keys,"snowolf");
-
-
Stringvalue=jedis.get(keys);
-
-
System.out.println(value);
-
-
-
pool.returnResource(jedis);
改为从对象池中,获取Jedis实例:
-
-
Jedisjedis=pool.getResource();
-
-
Jedisjedis=pool.getResource();
切记,最后使用后,释放Jedis对象:
-
-
pool.returnResource(jedis);
-
-
pool.returnResource(jedis);
三、一致性哈希
Memcached完全基于分布式集群,而Redis是Master-Slave,如果想把Reids,做成集群模式,无外乎多做几套Master-Slave,每套Master-Slave完成各自的容灾处理,通过Client工具,完成一致性哈希。
PS:Memcached是在Server端完成Sharding,Redis只能依靠各个Client做Sharding。可能会在Redis 3.0系列支持Server端Sharding。
保留前面的JedisPoolConfig,新增两个Redis的IP(redis1.ip,redis2.ip),完成两个JedisShardInfo实例,并将其丢进List中:
-
JedisShardInfojedisShardInfo1=newJedisShardInfo(
-
bundle.getString("redis1.ip"),Integer.valueOf(bundle.getString("redis.port")));
-
JedisShardInfojedisShardInfo2=newJedisShardInfo(
-
bundle.getString("redis2.ip"),Integer.valueOf(bundle.getString("redis.port")));
-
-
List<JedisShardInfo>list=newLinkedList<JedisShardInfo>();
-
list.add(jedisShardInfo1);
-
list.add(jedisShardInfo2);
-
JedisShardInfojedisShardInfo1=newJedisShardInfo(
-
bundle.getString("redis1.ip"),Integer.valueOf(bundle.getString("redis.port")));
-
JedisShardInfojedisShardInfo2=newJedisShardInfo(
-
bundle.getString("redis2.ip"),Integer.valueOf(bundle.getString("redis.port")));
-
-
List<JedisShardInfo>list=newLinkedList<JedisShardInfo>();
-
list.add(jedisShardInfo1);
-
list.add(jedisShardInfo2);
初始化ShardedJedisPool代替JedisPool:
-
ShardedJedisPoolpool=newShardedJedisPool(config,list);
-
ShardedJedisPoolpool=newShardedJedisPool(config,list);
改由ShardedJedis,获取Jedis对象:
-
-
ShardedJedisjedis=pool.getResource();
-
Stringkeys="name";
-
Stringvalue="snowolf";
-
-
jedis.del(keys);
-
-
jedis.set(keys,value);
-
-
Stringv=jedis.get(keys);
-
-
System.out.println(v);
-
-
-
pool.returnResource(jedis);
-
-
ShardedJedisjedis=pool.getResource();
-
Stringkeys="name";
-
Stringvalue="snowolf";
-
-
jedis.del(keys);
-
-
jedis.set(keys,value);
-
-
Stringv=jedis.get(keys);
-
-
System.out.println(v);
-
-
-
pool.returnResource(jedis);
四、Spring封装参考
Ok,完成上述代码足够完成简单任务,如果有必要,可以用spring封装初始化:
-
<context:property-placeholderlocation="classpath:redis.properties"/>
-
<bean
-
id="jedisPoolConfig"
-
class="redis.clients.jedis.JedisPoolConfig"
-
>
-
<property
-
name="maxActive"
-
value="${redis.pool.maxActive}"/>
-
<property
-
name="maxIdle"
-
value="${redis.pool.maxIdle}"/>
-
<property
-
name="maxWait"
-
value="${redis.pool.maxWait}"/>
-
<property
-
name="testOnBorrow"
-
value="${redis.pool.testOnBorrow}"/>
-
</bean>
-
<bean
-
id="shardedJedisPool"
-
class="redis.clients.jedis.ShardedJedisPool"
-
>
-
<constructor-arg
-
index="0"
-
ref="jedisPoolConfig"/>
-
<constructor-argindex="1">
-
<list>
-
<beanclass="redis.clients.jedis.JedisShardInfo">
-
<constructor-arg
-
index="0"
-
value="${redis1.ip}"/>
-
<constructor-arg
-
index="1"
-
value="${redis.port}"
-
type="int"/>
-
</bean>
-
<beanclass="redis.clients.jedis.JedisShardInfo">
-
<constructor-arg
-
index="0"
-
value="${redis2.ip}"/>
-
<constructor-arg
-
index="1"
-
value="${redis.port}"
-
type="int"/>
-
</bean>
-
</list>
-
</constructor-arg>
-
</bean>
-
<context:property-placeholderlocation="classpath:redis.properties"/>
-
<bean
-
id="jedisPoolConfig"
-
class="redis.clients.jedis.JedisPoolConfig"
-
>
-
<property
-
name="maxActive"
-
value="${redis.pool.maxActive}"/>
-
<property
-
name="maxIdle"
-
value="${redis.pool.maxIdle}"/>
-
<property
-
name="maxWait"
-
value="${redis.pool.maxWait}"/>
-
<property
-
name="testOnBorrow"
-
value="${redis.pool.testOnBorrow}"/>
-
</bean>
-
<bean
-
id="shardedJedisPool"
-
class="redis.clients.jedis.ShardedJedisPool"
-
>
-
<constructor-arg
-
index="0"
-
ref="jedisPoolConfig"/>
-
<constructor-argindex="1">
-
<list>
-
<beanclass="redis.clients.jedis.JedisShardInfo">
-
<constructor-arg
-
index="0"
-
value="${redis1.ip}"/>
-
<constructor-arg
-
index="1"
-
value="${redis.port}"
-
type="int"/>
-
</bean>
-
<beanclass="redis.clients.jedis.JedisShardInfo">
-
<constructor-arg
-
index="0"
-
value="${redis2.ip}"/>
-
<constructor-arg
-
index="1"
-
value="${redis.port}"
-
type="int"/>
-
</bean>
-
</list>
-
</constructor-arg>
-
</bean>
代码可以更简洁一些:
-
privateApplicationContextapp;
-
privateShardedJedisPoolpool;
-
-
@Before
-
publicvoidbefore()throwsException{
-
app=newClassPathXmlApplicationContext("applicationContext.xml");
-
pool=(ShardedJedisPool)app.getBean("shardedJedisPool");
-
}
-
-
@Test
-
publicvoidtest(){
-
-
-
ShardedJedisjedis=pool.getResource();
-
Stringkeys="name";
-
Stringvalue="snowolf";
-
-
jedis.del(keys);
-
-
jedis.set(keys,value);
-
-
Stringv=jedis.get(keys);
-
-
System.out.println(v);
-
-
-
pool.returnResource(jedis);
-
-
assertEquals(value,v);
-
}
-
privateApplicationContextapp;
-
privateShardedJedisPoolpool;
-
-
@Before
-
publicvoidbefore()throwsException{
-
app=newClassPathXmlApplicationContext("applicationContext.xml");
-
pool=(ShardedJedisPool)app.getBean("shardedJedisPool");
-
}
-
-
@Test
-
publicvoidtest(){
-
-
-
ShardedJedisjedis=pool.getResource();
-
Stringkeys="name";
-
Stringvalue="snowolf";
-
-
jedis.del(keys);
-
-
jedis.set(keys,value);
-
-
Stringv=jedis.get(keys);
-
-
System.out.println(v);
-
-
-
pool.returnResource(jedis);
-
-
assertEquals(value,v);
-
}
当然,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是这个系统的核心,它...
Jedis是Java语言开发的Redis客户端,提供了丰富的API来操作Redis服务器,便于Java开发者在项目中集成Redis。 Redis 3.2.1是Redis的一个稳定版本,相比于早期版本,它引入了一些新的特性和改进。其中,重要的更新...
Jedis是Java开发的Redis客户端,它提供了与Redis服务器交互的API,使得在Java应用中使用Redis变得简单。Jedis 2.5是该压缩包中包含的版本,它支持了当时Redis的大多数命令,包括基本操作和事务处理。 首先,了解...
在Java应用中,为了提高性能和资源利用率,通常会使用连接池管理Jedis实例,这就是“redis连接池jar jedis+common”所指的内容。 一、Redis简介 Redis是一个开源的、基于内存的数据结构存储系统,可以作为数据库、...
在这个压缩包中,包含了不同平台下的Redis安装包,以及Jedis驱动,这使得在Windows和Linux环境下都能轻松地使用Redis。 首先,让我们详细了解Redis的不同版本: 1. **Redis Windows 32位与64位安装包**:Redis原本...
本项目结合了Apache Shiro、JSON Web Token (JWT)、SpringBoot、MySQL数据库以及Redis缓存技术(通过Jedis客户端)来实现这一机制。下面我们将详细探讨这些组件在实现无状态鉴权中的作用。 **Apache Shiro** Apache...
基于Centos7系统,由浅入深讲解如何部署Redis的四种模式,分别是:单机模式、主从模式、哨兵模式、集群模式。 完整原文:http://exp-blog.com/2018/09/14/pid-2285/ 同时提供Jedis客户端封装源码: ● 屏蔽Jedis与...
最近学习redis,一直找不到合适的资料,找了挺久的 ,做了个省市联动的整合,用redis和Mysql来做的,spring配的jedis连接池,完全是给新手看的,我也是个菜鸟,供初学者学习吧,因为所有对象都可以转化为json字符串...
在本教程“Redis+Jedis+案例实战”中,你将深入学习如何利用Redis和Jedis进行实际项目开发。以下是一些关键知识点的概述: 1. Redis基础知识: - 数据类型:Redis支持五种基本数据类型,包括字符串(String)、...
本项目聚焦于Spring Data与Jedis的集成,用于利用Redis作为缓存解决方案。Jedis是Java的一个开源客户端,专门用于连接和操作Redis服务器。 首先,让我们详细了解一下Spring Data。Spring Data是一个模块化的项目,...
对于Java开发者,可以学习如何在Java项目中集成Redis,使用Jedis或Lettuce等客户端库进行交互,实现高效的缓存策略和数据交换。 总结,Redis实战不仅涵盖了基本的数据类型和操作,还涉及高级特性如发布订阅、事务、...
而Jedis是Java语言的Redis客户端,提供了丰富的API来与Redis服务器进行交互。 Redis 3.0引入了多项增强和改进,包括: 1. **Cluster Support**: Redis 3.0首次实现了集群功能,允许用户将数据分布在多个节点上,...
Jedis 是 Java 开发者常用的 Redis 客户端库,而 Spring Data Redis 是 Spring 框架的一部分,它提供了与 Redis 集成的高级抽象。在“征服 Redis + Jedis + Spring (三)—— 列表操作”这一主题中,我们将深入探讨...
Jedis是一个轻量级的Redis客户端,而Spring Data Redis则提供了更高层次的抽象,使得开发者能够更方便地操作Redis,无需直接处理低级别的Jedis API。 标题提到的"redis+spring jedis方式",意味着我们将讨论如何...
Jedis是Java语言编写的Redis客户端,提供了丰富的API来操作Redis服务器,使得在Java应用中使用Redis变得简单。 在Redis 3.2.1版本中,引入了一些重要的改进和优化,包括但不限于以下几点: 1. **lua脚本支持增强**...
<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"> <bean class="org.springframework.data.redis.sentinel.Configuration"> ...
2. Redis连接器:Java应用需要一个Redis连接器(如Jedis或Lettuce)来与Redis进行通信。这些连接器提供了Java API,使得应用程序能够方便地读写Redis中的session数据。 3. 配置文件:在Tomcat的`context.xml`或`...
本文将详细介绍如何使用提供的"redis安装脚本+jedis.jar.zip"进行Redis的安装以及Jedis的使用。 首先,我们来解压下载的"redis安装脚本+jedis.jar.zip"文件,会得到两个文件:`jedis-2.0.0.jar`和`install_redis.sh...