redie是服务端,需要jedis客户端进行操作
导入依赖
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.8.1</version> </dependency>
一 构建代码案例
1 直接构造单个的jedis
String name = "大人"; String nn = "xiao"; //构造jedis对象 Jedis jedis = new Jedis("127.0.0.1", 6379); //向redis里面添加数据 // jedis.set("222","生存时间只有5秒"); jedis.strlen("myname1"); jedis.mset("1,2","11,22"); // jedis.expire("222",5); //从redis中读取数据 String value = jedis.get("222"); System.out.println("设置了时间的:"+value); System.out.println("剩余生存时间:"+jedis.ttl("myname1")); //关闭连接 jedis.close();
2 构建连接池
//构建连接池配置信息 JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); //设置最大连接数 jedisPoolConfig.setMaxTotal(50); //构建连接池 JedisPool jedisPool = new JedisPool("127.0.0.1",6379); //从连接池中获取连接 Jedis jedis = jedisPool.getResource(); //读取数据 System.out.println("我是新的数据"+jedis.get("xx")); //还回连接池 jedisPool.returnResource(jedis); //释放连接池 jedis.close();
3 分片式集群redis
//构建连接池配置 JedisPoolConfig poolConfig = new JedisPoolConfig(); //设置最大连接数 poolConfig.setMaxTotal(50); //定义集群信息 List<JedisShardInfo> shard = new ArrayList<JedisShardInfo>(); shard.add(new JedisShardInfo("127.0.0.1",6379)); shard.add(new JedisShardInfo("192.168.3.112",6378)); //定义集群连接池 ShardedJedisPool shardedJedisPool = new ShardedJedisPool(poolConfig,shard); ShardedJedis shardedJedis = null; try { //从集群中获取分片数据 shardedJedis = shardedJedisPool.getResource(); //从redis中取数据 String value = shardedJedis.get("mytest"); System.out.println(value); } catch (Exception e) { e.printStackTrace(); } finally { if (shardedJedis != null){ //关闭,检测链接是否有效,有效则放回连接池中,无效则重置状态 shardedJedis.close(); } } //关闭连接池 shardedJedisPool.close();
二 redis在项目中的使用
1 将分片式集群连接池配置到项目的配置文件中
配置文件中是将"分片式集群redis"里面的代码转成了配置文件
2 写通用工具类redisService类
2 优化后的redisService
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import redis.clients.jedis.ShardedJedis;
import redis.clients.jedis.ShardedJedisPool;
@Service
public class RedisService {
@Autowired
private ShardedJedisPool shardedJedisPool;
private <T> T execute(Function<T, ShardedJedis> fun) {
ShardedJedis shardedJedis = null;
try {
// 从连接池中获取到jedis分片对象
shardedJedis = shardedJedisPool.getResource();
return fun.callback(shardedJedis);
} finally {
if (null != shardedJedis) {
// 关闭,检测连接是否有效,有效则放回到连接池中,无效则重置状态
shardedJedis.close();
}
}
}
/**
* 执行set操作
*
* @param key
* @param value
* @return
*/
public String set(final String key, final String value) {
return this.execute(new Function<String, ShardedJedis>() {
@Override
public String callback(ShardedJedis e) {
return e.set(key, value);
}
});
}
/**
* 执行get操作
*
* @param key
* @return
*/
public String get(final String key) {
return this.execute(new Function<String, ShardedJedis>() {
@Override
public String callback(ShardedJedis e) {
return e.get(key);
}
});
}
/**
* 执行删除操作
*
* @param key
* @return
*/
public Long del(final String key) {
return this.execute(new Function<Long, ShardedJedis>() {
@Override
public Long callback(ShardedJedis e) {
return e.del(key);
}
});
}
/**
* 设置生存时间,单位为:秒
*
* @param key
* @param seconds
* @return
*/
public Long expire(final String key, final Integer seconds) {
return this.execute(new Function<Long, ShardedJedis>() {
@Override
public Long callback(ShardedJedis e) {
return e.expire(key, seconds);
}
});
}
/**
* 执行set操作并且设置生存时间,单位为:秒
*
* @param key
* @param value
* @return
*/
public String set(final String key, final String value, final Integer seconds) {
return this.execute(new Function<String, ShardedJedis>() {
@Override
public String callback(ShardedJedis e) {
String str = e.set(key, value);
e.expire(key, seconds);
return str;
}
});
}
}
redis操作的是字符串类型,所以在使用的时候要用到对对象的序列化
ObjectMapper的序列化使用