1、redis的java客户端
redis的java客户端也有很多: https://redis.io/clients#java,其中比较受欢迎的是jedis和lettuce。
- jedis在实现上是直接连接的redis server,如果在多线程环境下是非线程安全的,这个时候只有使用连接池,为每个jedis实例增加物理连接,官方推荐。 https://mvnrepository.com/search?q=jedis
- lettuce的连接是基于netty的,连接实例(statefulredisconnection)可以在多个线程间并发访问,应为
statefulredisconnection是线程安全的,所以一个连接实例(statefulredisconnection)就可以满足多线程环境下的并发访问,当然这个也是可伸缩的设计,一个连接实例不够的情况也可以按需增加连接实例。 - 在springboot data redis 1.x之前默认使用的是jedis,但目前最新版的修改成了lettuce。
- 之前公司使用jedis居多,lettuce近两年在逐步上升,总的来讲jedis的性能会优于lettuce(因为它是直接操作redis)。
jedistest.java
package com.xiao;
import org.junit.after;
import org.junit.before;
import org.junit.test;
import redis.clients.jedis.jedis;
import java.util.set;
public class jedistest {
jedis jedis = null;
// 建立连接
@before
public void init() {
// 初始化 jedis 客户端,声明主机和端口
jedis = new jedis("192.168.65.3", 6379);
// 身份认证
jedis.auth("123456");
// ping pong 心跳机制检测是否连接成功
string pong = jedis.ping();
system.out.println("pong = " pong);
}
@test
public void teststring() {
//选择数据库
jedis.select(2);
//插入一条数据
string result = jedis.set("username", "xiao");
system.out.println("result = " result);
//获取一条数据
string username = jedis.get("username");
system.out.println("username = " username);
}
@test
public void testkeys() {
jedis.select(2);
set keys = jedis.keys("*");
system.out.println(keys);
}
// 释放资源
@after
public void close(){
if (jedis != null) {
jedis.close();
}
}
}
jedispoolconnectredis.java
package com.xiao;
import redis.clients.jedis.jedis;
import redis.clients.jedis.jedispool;
import redis.clients.jedis.jedispoolconfig;
// 连接池工具类
public class jedispoolconnectredis {
private static jedispool jedispool;
static {
// 创建连接池配置对象
jedispoolconfig jedispoolconfig = new jedispoolconfig();
// 设置最大连接数,默认8
jedispoolconfig.setmaxtotal(5);
// 设置最大空闲数量,默认8
jedispoolconfig.setmaxidle(5);
// 设置最小空闲数量,默认0
jedispoolconfig.setminidle(0);
// 设置等待时间 ms
jedispoolconfig.setmaxwaitmillis(100);
// 初始化 jedispool 对象
jedispool = new jedispool(jedispoolconfig,
"192.168.65.3", 6379,
100,"123456");
}
/**
* 获取jedi对象
* @return
*/
public static jedis getjedis() {
return jedispool.getresource();
}
}
2、 环境准备
2.1、 引入依赖
redis.clients
jedis
2.9.0
2.2、创建jedis对象
public static void main(string[] args) {
//1.创建jedis对象
jedis jedis = new jedis("192.168.40.4", 6379);//1.redis服务必须关闭防火墙 2.redis服务必须开启远程连接
jedis.select(0);//选择操作的库默认0号库
//2.执行相关操作
//....
//3.释放资源
jedis.close();
}
3、常用api
3.1、操作key相关api
private jedis jedis;
@before
public void before(){
this.jedis = new jedis("192.168.202.205", 7000);
}
@after
public void after(){
jedis.close();
}
//测试key相关
@test
public void testkeys(){
//删除一个key
jedis.del("name");
//删除多个key
jedis.del("name","age");
//判断一个key是否存在exits
boolean name = jedis.exists("name");
system.out.println(name);
//设置一个key超时时间 expire pexpire
long age = jedis.expire("age", 100);
system.out.println(age);
//获取一个key超时时间 ttl
long age1 = jedis.ttl("newage");
system.out.println(age1);
//随机获取一个key
string s = jedis.randomkey();
//修改key名称
jedis.rename("age","newage");
//查看可以对应值的类型
string name1 = jedis.type("name");
system.out.println(name1);
string maps = jedis.type("maps");
system.out.println(maps);
}
3.2、操作string相关api
//测试string相关
@test
public void teststring(){
//set
jedis.set("name","小陈");
//get
string s = jedis.get("name");
system.out.println(s);
//mset
jedis.mset("content","好人","address","海淀区");
//mget
list mget = jedis.mget("name", "content", "address");
mget.foreach(v-> system.out.println("v = " v));
//getset
string set = jedis.getset("name", "小明");
system.out.println(set);
//............
}
3.3、操作list相关api
//测试list相关
@test
public void testlist(){
//lpush
jedis.lpush("names1","张三","王五","赵柳","win7");
//rpush
jedis.rpush("names1","xiaomingming");
//lrange
list names1 = jedis.lrange("names1", 0, -1);
names1.foreach(name-> system.out.println("name = " name));
//lpop rpop
string names11 = jedis.lpop("names1");
system.out.println(names11);
//llen
jedis.linsert("lists", binaryclient.list_position.before,"xiaohei","xiaobai");
//........
}
3.4、操作set的相关api
//测试set相关
@test
public void testset(){
//sadd
jedis.sadd("names","zhangsan","lisi");
//smembers
jedis.smembers("names");
//sismember
jedis.sismember("names","xiaochen");
//...
}
3.5、 操作zset相关api
//测试zset相关
@test
public void testzset(){
//zadd
jedis.zadd("names",10,"张三");
//zrange
jedis.zrange("names",0,-1);
//zcard
jedis.zcard("names");
//zrangebyscore
jedis.zrangebyscore("names","0","100",0,5);
//..
}
3.6、 操作hash相关api
//测试hash相关
@test
public void testhash(){
//hset
jedis.hset("maps","name","zhangsan");
//hget
jedis.hget("maps","name");
//hgetall
jedis.hgetall("mps");
//hkeys
jedis.hkeys("maps");
//hvals
jedis.hvals("maps");
//....
}