在 java 应用中操作 Redis,使用 Redis 官方推荐的 Jedis。Jedis 几乎涵盖了 Redis 的所有 命令。操作 Redis 的命令在 Jedis 中以方法的形式出现
Jedis 源码:https://github.com/xetorthio/jedis
api 文档:https://www.javadoc.io/doc/redis.clients/jedis/latest/index.html
下载:http://search.maven.org/,搜索 jedis
1、创建maven版的java工程
2、添加jedis依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.1.0</version>
</dependency>
3、Commons Pool连接池
<!--Commons-Pool-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.7.0</version>
</dependency>
Jedis 对象并不是线程安全的,在多线程下使用同一个 Jedis 对象会出现并发问题。为了避免每次使用 Jedis 对象时都需要重新构建,Jedis 提供了 JedisPool。JedisPool 是基于Commons Pool 2 实现的一个线程安全的连接池
4、创建一个Jedis连接池工具类
public class RedisUtils {
//JedisPool 有一个就够用了
private static JedisPool pool;
//创建线程池
public static JedisPool open(String host,int port){
if( pool == null ){
//设置线程池的参数
JedisPoolConfig config = new JedisPoolConfig();
//设置最大线程数量
config.setMaxTotal(100);
//设置空闲数
config.setMaxIdle(2);
//设置检查项为true,避免null的情况
config.setTestOnBorrow(true);
//创建JeidsPool
pool = new JedisPool(config,host,port,6000,"123456");
}
return pool;
}
//关闭线程池,在整个程序结束后执行
public static void close(){
if( pool != null){
pool.close();
}
}
}
1、key、String操作
public class RedisStringTest {
public static void main(String[] args) {
//创建Jedis对象,通过Jedis的方法,操作Redis数据
String host = "127.0.0.1";// redis所在的linux的ip
int port = 6379;// redis运行的端口
Jedis jedis = new Jedis(host,port);
//设置访问密码
jedis.auth("123456");
//通过jedis的方法操作Redis数据。
jedis.set("name", "zhangsan");
//获取数据
String value = jedis.get("name");
System.out.println("name :"+value);
//创建多个key-value
jedis.mset("user","admin","pwd","123456");
//获取多个key的值
List<String> values = jedis.mget("name ","user","pwd");
//values.forEach(v -> System.out.println(v));
for(String v: values){
System.out.println(v);
}
//查询id = 1 Student , key == student:1
if(jedis.exists("student:1")){
String student = jedis.get("student:1");
} else {
//访问数据库, Student对象
//把Stuent转为json数据
jedis.set("student:1", "{student}");
}
}
}
2、list操作
public class ListRedisTest {
public static void main(String[] args) {
Jedis jedis = new Jedis("127.0.0.1",6379);
String key = "framework";
jedis.del(key) ;
jedis.lpush(key , "mybatis");
jedis.lpush(key, "spring" ,"springmvc");
List<String> lists= jedis.lrange(key , 0,-1);
for(String str:lists){
System.out.println("列表数据:"+str);
}
System.out.println("列表长度:"+jedis.llen(key));
System.out.println("新值后列表长度: " + jedis.linsert(key, ListPosition.AFTER,"spring","jpa"));//从列表右侧插入数据
jedis.rpush(key , "jsp" , "web");
System.out.println("列表数据;"+jedis.lrange(key,0,-1));
//列表数据:[ springmvc,spring,jpa,mybatis,]
System.out.println("第1个下标的值: "+jedis.lindex(key,1));
for( long i = 0;i < jedis.llen(key) ;i++){
System.out.println("弹出值:" + jedis.lpop(key));
}
}
}
3、set操作
public class SetRedisTest {
public static void main(String[] args) {
Jedis jedis = new Jedis("127.0.0.1",6379);
String key = "web";
//添加一个数据
jedis.sadd(key,"htm1");
jedis.sadd(key,"css", "javascript");
Set<String> sets = jedis.smembers(key);
//返回集合的所有成员
Iterator<String> iter = sets.iterator();
while(iter.hasNext()){
System.out.println("集合Set成员:" + iter.next());
}
//判断set集合是否在集合中
System.out.println("flutter有吗?"+jedis.sismember(key,"flutter"));//false/集合的成员数量
System.out.println("集合成员个数:"+jedis.scard(key));
}
}
4、hash操作
public class HashRedisTest {
public static void main(String[] args) {
JedisPool pool = RedisUtils.open("127.0.0.1",6379);
Jedis jedis = null;
try {
jedis = pool.getResource();
//jedis.hmset(String,Map<string,string> )
Map<String, String> map = new HashMap<String, String>();
map.put("username", "admin");
map.put("age", "20");
jedis.hmset("logininfo", map);
List<String> fieldValues = jedis.hmget("logininfo", "username");
for (String fv : fieldValues) {
System.out.println("field值:" + fv);
}
System.out.println("返回boolean,存在username : " + jedis.hexists("logininfo", "username"));//查看所有的field
Set<String> set = jedis.hkeys("logininfo");
Iterator<String> iter = set.iterator();
while (iter.hasNext()) {
System.out.println("field name: " + iter.next());
jedis.hdel("logininfo", "age");
System.out.println("age是: " + jedis.hget("loginfo", "age")); //所有field的数量
System.out.println("feild个数: " + jedis.hlen("logininfo"));
}
}finally{
if (jedis != null) {
jedis.close();
}
}
}
}
5、zset操作
public class ZSetRedisTest {
public static void main(String[] args) {
Jedis jedis = new Jedis("127.0.0.1",6379);
String key="salary";
jedis.del(key);
jedis.zadd(key,2000D,"John");
//使用方法: zadd(string key ,Map<string,Double>)添加多个数据
Map<String,Double> map = new HashMap<String,Double>();
map.put("Tom",3000D);
map.put("Marry",6000D);
map.put( "Rose",3600D);
map.put("Mike", 5000D);
//添加多个数据
jedis.zadd(key, map);
Set<String> sets=jedis.zrangeByScore(key,"-inf","+inf");
Iterator<String> iter= sets.iterator();
while(iter.hasNext()){
System.out.println("排序小-大的成员:"+iter.next());}
//带有score的数据
Set<Tuple> tuple= jedis.zrangeByScoreWithScores(key,"-inf","+inf");
Iterator<Tuple> iters = tuple.iterator();
while(iters.hasNext()){
Tuple tu = iters.next();
System.out.println("排序小-大的成员:"+tu.getElement()+"#score:"+tu.getScore());
}
System.out.println("有序集合成员数量:" + jedis.zcard(key));
}
}
6、事务操作
public class TransactionRedis {
public static void main(String[] args) {
//创建Jedis对象,连接到Redis,需要提供ip和port
JedisPool pool = RedisUtils.open("127.0.0.1",6379);
Jedis jedis = null;
try{
//开启事务
Transaction trans = jedis.multi();//添加字符串
trans.set( "name","zhangsan");//一次设置多个key-value
trans.mset( "user","admin", "pwd","123456");
List<Object> resultList = trans.exec();
//事务的处理结果
for(Object result : resultList) {
System.out.println("成功的事务操作: " + result);
}
}catch(Exception e){
e.printStackTrace();
}finally{
if (jedis != null) {
jedis.close();
}
}
}
}