简单连接使用连接池
我们只需要创建一个连接池,然后通过连接池 来获取jedis对象
@Test
void contextLoads2() {
//使用连接池
JedisPool jedisPool = new JedisPool(new JedisPoolConfig(),
"192.168.26.146", 6379, 10000, "root");
//获取实例对象
Jedis jedis = jedisPool.getResource();
String ping = jedis.ping();
System.out.println(ping);
jedis.select(2);
jedis.set("name","aw");
String name = jedis.get("name");
System.out.println(name);
if (jedis!=null){
jedis.close();
}
}
由于我们上面这样的创建方式比较浪费资源,所以我们需要写一个工具类来进行创建。
我们这个项目是通过spring项目接管的
package com.aw.redisdemo.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
@Configuration
public class RedisConfig {
@Value("${spring.redis.host}")
private String host;
@Value("${spring.redis.port}")
private int port;
@Value("${spring.redis.password}")
private String password;
@Value("${spring.redis.timeout}")
private String timeout;
@Value("${spring.redis.jedis.pool.max-active}")
private int maxTotal;
@Value("${spring.redis.jedis.pool.max-wait}")
private String maxWaitMillis;
@Value("${spring.redis.jedis.pool.max-idle}")
private int maxIdle;
@Value("${spring.redis.jedis.pool.min-idle}")
private int minIdle;
@Bean
public JedisPool getJedisPool(){
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
//最大连接数
jedisPoolConfig.setMaxTotal(maxTotal);
//最大堵塞等待时间
jedisPoolConfig.setMaxWaitMillis(Long.parseLong(
maxWaitMillis.substring(0,maxWaitMillis.length()-2)));
//最大空闲连接
jedisPoolConfig.setMaxIdle(maxIdle);
jedisPoolConfig.setMinIdle(minIdle);
//创建连接池
JedisPool jedisPool = new JedisPool(
jedisPoolConfig, host, port, Integer.parseInt(timeout.substring(0, timeout.length() - 2)),password);
return jedisPool;
}
}
配置类
spring:
redis:
# Redis 服务器地址
host: 192.168.26.146
# 端口号
port: 6379
# 服务器用户密码
password: root
# 默认连接数据库
database: 0
# 最大堵塞等待连接时间
timeout: 10000ms
jedis:
pool:
# 最大空闲连接数
max-active: 1024
# 最大空闲等待时间
max-wait: 10000ms
# 最大连接数
max-idle: 200
# 最小连接数
min-idle: 5
我们在这里进行使用,因为我们的这项目是被spring进行接管的所以,我们这里只需要在外面创建JedisPool属性。 使用 @BeforeEach来进行获取jedis实例,使用 @AfterEach来进行释放jedis资源,这必须使用这两个注解因为before已经被弃用了。
下面是通过java对redis进行的操作,基本上和命令行的差不多,只有小部分的区别 已经写出来了。
@Autowired
private JedisPool jedisPool;
private Jedis jedis=null;
//初始化jedis实例对象
@BeforeEach
public void initConnt(){
jedis = jedisPool.getResource();
}
//String
@Test
public void testString(){
jedis.set("name","zhangsan");
String name = jedis.get("name");
jedis.mset("age","18","sex","1");
List<String> mget = jedis.mget("name", "age", "sex");
mget.forEach(System.out::println);
jedis.del("name");
}
//hashmap
@Test
public void HashMap(){
jedis.hset("student","name","aw");
jedis.hget("student","name");
//存入多条数据
HashMap<String, String> objectObjectHashMap = new HashMap<>();
objectObjectHashMap.put("age","20");
objectObjectHashMap.put("sex","1");
jedis.hset("student",objectObjectHashMap);
//获取多条数据
List<String> hmget = jedis.hmget("student", "name", "age", "sex");
hmget.forEach(System.out::println);
//获取hash类型的所有的数据
Map<String, String> student = jedis.hgetAll("student");
student.entrySet().forEach(e->{
System.out.println(e.getKey()+"--------"+e.getValue());
});
}
//list
@Test
public void testList(){
jedis.lpush("students","zhangsan","lisi");
jedis.rpush("students","wangwu","laoliu");
List<String> students = jedis.lrange("students", 0, 3);
students.forEach(System.out::println);
//左弹出 从集合的左侧第一个元素弹出
jedis.lpop("students");
//右弹出
jedis.rpop("students");
System.out.println("---------");
jedis.lrange("students",0,3).forEach(System.out::println);
}
//有序set
@Test
public void testSortedSet(){
// 我们这里使用另一种存储方式 map
Map<String,Double> objectObjectHashMap = new HashMap<>();
objectObjectHashMap.put("zhangsan",2D);
objectObjectHashMap.put("li",5D);
objectObjectHashMap.put("wangwu",1D);
objectObjectHashMap.put("laoliu",3D);
jedis.zadd("ss",objectObjectHashMap);
Set<String> students = jedis.zrange("ss", 0, 3);
students.forEach(System.out::println);
}
//释放资源
@AfterEach
public void closeConnt(){
if (jedis!=null){
jedis.close();
}
}
设置层级关系和命令行基本上差不多,设置失效时间和命令行上有一点差别。
//生成层级关系
@Test
public void testDir(){
jedis.set("cart:user01:item01","apple");
System.out.println(jedis.get("cart:user01:item01"));
}
//设置失效时间
@Test
public void testExpire(){
//给已经存在的key设置失效时间
jedis.set("code","test");
// jedis.expire("code",30);
//毫秒
jedis.pexpire("code",30000);
//查看有效时间 -1为没有失效时间
jedis.ttl("code");
//添加key时设置失效时间
jedis.setex("name",30,"aw");
jedis.psetex("age",30000,"1");
jedis.ttl("age");
//创建参数对象 来设置失效时间
SetParams setParams = new SetParams();
setParams.ex(30);
setParams.px(30);
//不存在时设置成功
setParams.nx();
//存在时设置成功
setParams.xx();
jedis.set("name","aw",setParams);
}
keys查询
事务在我们非关系型数据库中并不常用。
//查询所有的key
@Test
public void testAllkey(){
//当前数据库key的数量
Long aLong = jedis.dbSize();
System.out.println(aLong);
//查看所有的key
Set<String> keys = jedis.keys("*");
keys.forEach(System.out::println);
}
//事务处理
@Test
public void testMulti(){
Transaction multi = jedis.multi();
multi.set("tel","123");
//提交事务
multi.exec();
//事务回滚
multi.discard();
}