Redis入门教程目录:【Redis入门教程目录】
Redis客户端
我们知道Redis是C
语言开发的,如果想用别的语言操作Redis,那就需要用到别的语言的客户端。我们前面介绍过Redis的其中一个特性就是客户端多,几乎所有语言都有Redis的客户端,比如Java
语言的Jedis
;Python
语言的redis-py
;PHP
语言的Predis
;Go
语言的Redigo
等等。这些客户端也都是遵循了Redis给的协议,然后按照协议去开发出对应语言的客户端。如Redis官方提供的redis-cli
客户端其实就是一个Shell客户端
Jedis的使用
本篇我就讲Java
语言的客户端Jedis
,使用其他语言的读者可以阅读相关客户端的文档。要使用Jedis,首先确保我们已经添加了Jedis的依赖,这里我使用Maven配置
redis.clients
jedis
3.0.1
复制代码
Jedis的直连
import redis.clients.jedis.Jedis;
public class RedisJava {
public static void main(String[] args) {
//连接本地的 Redis 服务
Jedis jedis = new Jedis("127.0.0.1",6379);
jedis.set("name", "redis");
System.out.println("redis 存储的字符串为: "+ jedis.get("name"));
}
}
复制代码
运行以上Java程序,输出
redis 存储的字符串为: redis
复制代码
Jedis的连接池
import redis.clients.jedis.Jedis;
public class RedisPool {
public static void main(String[] args) {
//初始化连接池
JedisPoolConfig config=new JedisPoolConfig();
JedisPool jedisPool=new JedisPool(config,"127.0.0.1",6379);
Jedis jedis=null;
try{
jedis=jedisPool.getResource(); // 获取连接
jedis.set("name", "redis"); // 设置值
String value=jedis.get("name"); // 获取值
System.out.println(value);
}catch(Exception e){
e.printStackTrace();
}finally{
if(jedis!=null){
jedis.close();
}
if(jedisPool!=null){
jedisPool.close();
}
}
}
}
复制代码
运行以上Java程序,输出
redis
复制代码
Spring-data-redis的使用
前面我们使用了Jedis
实现对Redis的操作,这里再介绍使用基于Spring的Spring-data-redis
操作Redis,Spring
就不用我过多介绍了,相信学Java的都认识它。
Jedis与Spring-data-redis的区别和关系:
- Jedis:Jedis是Redis的Java客户端,通过它可以对Redis进行操作,与之功能相似的还包括Lettuce等。
- Spring-data-redis:Spring-data-redis对Redis的操作依赖Jedis或Lettuce,实际上是对Jedis、Lettuce这些客户端的封装,提供一套与客户端无关的api供应用使用,从而你在从一个redis客户端切换为另一个客户端,不需要修改业务代码。
添加依赖
在使用Spring-data-redis
前首先确保我们已经添加了相关依赖,这里我使用Maven配置
org.springframework
spring-core
5.1.3.RELEASE
org.springframework
spring-web
5.1.3.RELEASE
org.springframework
spring-jdbc
5.1.3.RELEASE
org.springframework
spring-webmvc
5.1.3.RELEASE
org.springframework
spring-context
5.1.3.RELEASE
org.springframework
spring-context-support
5.1.3.RELEASE
org.springframework
spring-aop
5.1.3.RELEASE
org.springframework
spring-test
5.1.3.RELEASE
test
mysql
mysql-connector-java
8.0.13
javax.servlet
javax.servlet-api
4.0.1
provided
redis.clients
jedis
2.7.0
org.springframework.data
spring-data-redis
1.5.0.RELEASE
复制代码
Spring和Spring-data-redis整合
通过XML
配置文件将Spring-data-redis
的连接池、Redis模板注入到Spring容器中。Redis模板有2
个,分别是RedisTemplate
、StringRedisTemplate
,这两个模板的区别是采用的序列化策略不一样,前者采用的是Java原生的序列化后者采用的是String序列化。模板的好处是为Redis的交互提供了高级抽象,用户无需关注Redis的连接管理、序列化等问题,把更多注意力放在业务上。 redis.properties:
#ip地址
redis.host.ip=192.168.174.129
#端口号
redis.port=6379
#如果有密码
redis.password=
#客户端超时时间单位是毫秒 默认是2000
redis.timeout=3000
#最大空闲数
redis.maxIdle=6
#连接池的最大数据库连接数。设为0表示无限制,如果是jedis 2.4以后用redis.maxTotal
#redis.maxActive=600maxIdle
#控制一个pool可分配多少个jedis实例,用来替换上面的redis.maxActive,如果是jedis 2.4以后用该属性
redis.maxTotal=20
#最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
redis.maxWaitMillis=3000
#连接的最小空闲时间 默认1800000毫秒(30分钟)
redis.minEvictableIdleTimeMillis=300000
#每次释放连接的最大数目,默认3
redis.numTestsPerEvictionRun=4
#逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1
redis.timeBetweenEvictionRunsMillis=30000
复制代码
spring-redis.xml:
"classpath:redis.properties" ignore-unresolvable="true"/>
"jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
"maxIdle" value="${redis.maxIdle}" />
"maxTotal" value="${redis.maxTotal}" />
"maxWaitMillis" value="${redis.maxWaitMillis}" />
"minEvictableIdleTimeMillis" value="${redis.minEvictableIdleTimeMillis}" />
"numTestsPerEvictionRun" value="${redis.numTestsPerEvictionRun}" />
"timeBetweenEvictionRunsMillis" value="${redis.timeBetweenEvictionRunsMillis}" />
"connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
"poolConfig" ref="jedisPoolConfig">
"hostName" value="${redis.host.ip}">
"port" value="${redis.port}">
"timeout" value="${redis.timeout}">
"redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
"connectionFactory" ref="connectionFactory" />
"stringRedisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
"connectionFactory" ref="connectionFactory" />
复制代码
将Spring
和Spring-data-redis
整合完成之后,一般为了方便使用模板,我们会将模板进一步封装成自己的Dao工具类,这里我仅封装几个操作,如下 RedisDaoImpl.java
@Repository
public class RedisDaoImpl implements RedisDao {
@Autowired
StringRedisTemplate stringRedisTemplate;
public void setString(Object redisKey, Object redisValue) {
ValueOperations valueOperations = stringRedisTemplate.opsForValue();
valueOperations.set(redisKey, redisValue);
}
public Object getString(Object redisKey) {
ValueOperations valueOperations = stringRedisTemplate.opsForValue();
return valueOperations.get(redisKey);
}
/**
* @description: 通过redisKey 批量(map)设置redisValue(hash)
* @param: [redisKey, redisValue]
* @return: void
* @author: Xue 8
* @date: 2019/2/14
*/
public void setHashAll(Object redisKey, Map redisValue){
HashOperations hashOperations = stringRedisTemplate.opsForHash();
hashOperations.putAll(redisKey, redisValue);
}
/**
* @description: 通过redisKey、hashKey、hashValue设置单个redisValue(hash)
* @param: [redisKey, hashKey, hashValue]
* @return: void
* @author: Xue 8
* @date: 2019/2/14
*/
public void setHash(Object redisKey, Object hashKey, Object hashValue){
HashOperations hashOperations = stringRedisTemplate.opsForHash();
hashOperations.put(redisKey, hashKey, hashValue);
}
/**
* @description: 通过redisValue、hashKey获取hashValue
* @param: [redisKey, hashKey]
* @return: java.lang.Object
* @author: Xue 8
* @date: 2019/2/14
*/
public Object getHashValue(Object redisKey, Object hashKey){
HashOperations hashOperations = stringRedisTemplate.opsForHash();
return hashOperations.get(redisKey, hashKey);
}
/**
* @description: 通过redisKey获取hash
* @param: [redisKey]
* @return: java.util.Map
* @author: Xue 8
* @date: 2019/2/14
*/
public Map getHash(Object redisKey){
HashOperations hashOperations = stringRedisTemplate.opsForHash();
return hashOperations.entries(redisKey);
}
/**
* @description: 通过redisKey设置redisValue(List)
* @param: [redisKey, redisValue]
* @return: void
* @author: Xue 8
* @date: 2019/2/14
*/
public void setList(Object redisKey, List
之后在需要操作到Redis的地方,直接调用RedisDaoImpl即可。