一、实现功能
通过jedis连接redis数据库,进行数据操作
二、实现代码
1.添加jedis依赖到pom.xml文件
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
2.简单实现
(1)简单
/**
* 通过客户端连接redis
*/
public static void jedisdemosimple(){
//1.设置IP地址和端口
Jedis jedis=new Jedis("192.168.31.3",6379);
//2.保存数据
jedis.set("people","zhangsan3");
//3.获取数据
String value=jedis.get("people");
System.out.println(value);
//4.释放资源
jedis.close();
}
(2)工具类
package com.Java.BaseUse.redis;
import com.Java.BaseUse.jdbc.DBUtil.DBUtil;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
* Created by Administrator on 2020/3/3.
*/
public class RedisUtil {
public static String url=null;
public static int port=0;
//通常情况下把数据密码放置 项目配置文件中 , 相对于放入类中,更安全一些。
static { //静态初始化块
//创建获取配置文件对象。
Properties properties = new Properties();
try {
//利用反射获取对应的字段
InputStream in = DBUtil.class.getClassLoader()
.getResourceAsStream("redis.properties");//获取创建好的配置文件名
properties.load(in);
url = properties.getProperty("url");
port = Integer.parseInt(properties.getProperty("port")) ;
//加载驱动类
// Class.forName(driver);
} catch (IOException e) {
e.printStackTrace();
}
}
}
(3)各个操作类型操作方法
package com.Java.BaseUse.redis;
import com.Java.BaseUse.jdbc.DBUtil.DBUtil;
import redis.clients.jedis.Jedis;
import java.io.IOException;
import java.io.InputStream;
import java.util.*;
/**
* Created by Administrator on 2020/3/3.
*/
public class RedisApi {
//url
private static final String redisurl=RedisUtil.url;
//port
private static final int port=RedisUtil.port;
/**
* 1.key
*/
public static void testKeys() {
//连接指定的redis,需要ip地址和端口号
// Jedis jedis = new Jedis("192.168.0.8",6379);
Jedis jedis = new Jedis(redisurl, port);
//获取所有key
Set<String> keys = jedis.keys("*");
for (String key : keys) {
System.out.println(key);
}
//判断是否存在某个key
System.out.println("是否存在k2:" + jedis.exists("k2"));
//测试某个key的过期时间
System.out.println("k1的存活时间:" + jedis.ttl("k2"));
jedis.close();
}
/**
* 2.String操作
*/
public static void testString() {
//连接指定的redis,需要ip地址和端口号
Jedis jedis=new Jedis(redisurl, port);
jedis.select(1); //选择指定数据库0-15
System.out.println("获取K1的值:"+jedis.get("k1"));
jedis.msetnx("k11","v12","k22","v22","k33","v33");
System.out.println(jedis.mget("k11","k22","k33"));
//关闭连接
jedis.close();
}
/**
* 3.List操作
*/
public static void testList() {
//连接指定的redis,需要ip地址和端口号
Jedis jedis=new Jedis(redisurl, port);
jedis.lpush("mylist", "1","2","3","4");
List<String> list = jedis.lrange("mylist", 0, -1);
for (String element : list) {
System.out.println(element);
}
//关闭连接
jedis.close();
}
/**
* 4.Set操作
*/
public static void testSet() {
//连接指定的redis,需要ip地址和端口号
Jedis jedis=new Jedis(redisurl,port);
//添加元素
jedis.sadd("mySet", "Jack","Marry","Tom","Tony");
//删除指定元素
jedis.srem("mySet", "Tony");
//获取指定key的元素
Set<String> smembers = jedis.smembers("mySet");
for (String member : smembers) {
System.out.println(member);
}
//关闭连接
jedis.close();
}
/**
* 5.hash
*/
public static void testHash() {
//连接指定的redis,需要ip地址和端口号
Jedis jedis=new Jedis(redisurl,port);
jedis.hset("myHash", "username", "Jack");
jedis.hset("myHash", "password", "123123");
jedis.hset("myHash", "age", "11");
//将多个数据封装为一个map
Map<String, String> map=new HashMap<String, String>();
map.put("gender", "male");
map.put("department", "研发部");
//批量设置多个数据
jedis.hmset("myHash", map);
List<String> values = jedis.hmget("myHash","username","password");
for (String val : values) {
System.out.println(val);
}
//关闭连接
jedis.close();
}
/**
* 6.zset操作
*/
public static void testZset() {
//连接指定的redis,需要ip地址和端口号
Jedis jedis=new Jedis(redisurl, port);
jedis.zadd("myZset", 100, "math");
//将多个数据封装为一个map
Map<String, Double> subject=new HashMap<String, Double>();
subject.put("chinese", 88d);
subject.put("english", 86d);
//批量添加数据
jedis.zadd("myZset", subject);
Set<String> zset = jedis.zrange("myZset", 0, -1);
for (String val : zset) {
System.out.println(val);
}
//关闭连接
jedis.close();
}
}
3.通过连接池连接Redis
(1)核心参数
- MaxTotal 控制一个 pool 可分配多少个 jedis 实例,通过 pool.getResource()来获取;如果赋值为-1,则表示不限制;如果 pool 已经分配了 MaxTotal 个 jedis 实例,则此时 pool 的状态为 exhausted。
- maxIdle 控制一个 pool 最多有多少个状态为 idle(空闲)的 jedis 实例。
- MaxWaitMillis 表示当 borrow 一个 jedis 实例时,最大的等待毫秒数,如果超过等待时间,则直接抛
- JedisConnectionException。
- testOnBorrow 获得一个 jedis 实例的时候是否检查连接可用性(ping());如果为 true,则得到的 jedis实例均是可用的。
(2)代码实例
/**
* 通过连接池连接redis
*/
public static void jedisdemopool(){
//1.获得连接池配置对象
JedisPoolConfig config=new JedisPoolConfig();
//设置最大连接数
config.setMaxTotal(30);
//设置最大空闲连接数
config.setMaxIdle(10);
//2.获得连接池
JedisPool jedispool=new JedisPool(config,"192.168.31.3",6379);
//3.获得核心对象
Jedis jedis=null;
try {
//4.通过连接池获得连接
jedis=jedispool.getResource();
//5.设置数据
jedis.set("peoples","lisi3");
//6.获取数据
String value=jedis.get("peoples");
System.out.println(value);
}catch (Exception e){
e.printStackTrace();
}finally {
//7.释放资源
if (jedis!=null){
jedis.close();
}
if(jedispool !=null){
jedispool.close();
}
}
}
或者
package com.Java.BaseUse.redis;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
/**
* Created by Administrator on 2020/3/3.
* 参考:
*/
public class RedisPoolUtilApi {
//url
private static final String redisurl=RedisUtil.url;
//port
private static final int port=RedisUtil.port;
private static volatile JedisPool jedisPool = null;
private RedisPoolUtilApi(){
}
/**
* 1.简单测试
*/
public static void testPool(){
//默认的连接池配置
GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
System.out.println(poolConfig);
//连接池对象
JedisPool jedisPool=new JedisPool(poolConfig, redisurl, port,60000);
Jedis jedis = jedisPool.getResource();
String ping = jedis.ping();
System.out.println(ping);
//如果是从连接池中获取的,那么执行close方法只是将连接放回到池中
jedis.close();
jedisPool.close();
}
/**
* 2.返回RedisPool的单例模式
* @return
*/
public static JedisPool getJedisPoolInstance() {
if (null == jedisPool) {
synchronized (RedisPoolUtilApi.class) {
if (null == jedisPool) {
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxTotal(200);//最大连接数
poolConfig.setMaxIdle(32);//最大空闲连接数
//获取连接时的最大等待毫秒数,如果超时就抛异常,默认-1
poolConfig.setMaxWaitMillis(100*1000);
//连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true
poolConfig.setBlockWhenExhausted(true);
//在获取连接的时候检查有效性, 默认false
poolConfig.setTestOnBorrow(true);
jedisPool = new JedisPool(poolConfig, redisurl, port, 60000 );
} } }
return jedisPool;
}
}
三、参考
1.cpthack大牛实现