文档章节

Redis入门教程(三)— Java中操作Redis

dotleo
 dotleo
发布于 2017/08/29 11:32
字数 1806
阅读 12
收藏 0
点赞 0
评论 0

在Redis的官网上,我们可以看到Redis的Java客户端众多

Redis客户端

其中,Jedis是Redis官方推荐,也是使用用户最多的Java客户端。

开始前的准备

创建项目

  1. 首先创建一个新的Java Project,命名为Jedis(你也可以给它你喜爱的名字)
  2. 在项目中新建一个Folder(文件夹),命名为“lib”
  3. 将jedis-2.1.0.jar、commons-pool-1.5.4.jar、junit-4.10.jar复制到lib文件夹下
  4. 选中文件夹或者三个jar文件,右击找到Build Path,选择菜单下的Add to Build Path加入到Build Path中

开始撸代码

继续之前,请务必阅读过Redis入门教程(二)—基本数据类型,这将对你有很大的帮助。


import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.junit.Before;
import org.junit.Test;

import redis.clients.jedis.BinaryClient.LIST_POSITION;
import redis.clients.jedis.Jedis;

/**
 * @author dotleo
 *
 */
public class Jedis_Test {
	
	//Java中操作Redis的对象
	private Jedis jedis ;
	
	@Before
	public void connection() {
		
		//连接Redis服务器,参数1为ip,参数2为端口号,请根据自己实际情况赋值
		jedis = new Jedis("192.168.1.233",6379);
	}
	
	/**
	 * redis字符串操作
	 */
	@Test
	public void stringTest() {
		
		//为避免多次运行Redis中存在键,导致结果不符合预期,每次执行时清理当前库
		//特别注意:在开发中请勿如此操作
		jedis.flushDB();
		
		//添加字符串
		jedis.set("age", "101");
		System.out.println("age = " + jedis.get("age"));
		//批量添加字符串
		jedis.mset("age1","1","age2","2");
		System.out.println("age1 = " + jedis.get("age1"));
		System.out.println("age2 = " + jedis.get("age2"));
		//添加字符串(仅在不存在时)
		jedis.setnx("price", "101");
		System.out.println("price = " + jedis.get("price"));
		//加1操作
		jedis.incr("price");
		System.out.println("price = " + jedis.get("price"));
		//拼接字符串
		jedis.append("age", "years");
		System.out.println("age = " + jedis.get("age"));
		//截取字符串
		String str = jedis.getrange("age", 0L, 5L);
		System.out.println("age[0,5] = " + str);
		//获取字符串长度
		Long len = jedis.strlen("age");
		System.out.println("age length = " + len);
		//删除字符串
		jedis.del("age");
		System.out.print("age = " + jedis.get("age"));
	}
	
	/**
	 * redis哈希操作
	 */
	@Test
	public void hashTest() {
		
		//为避免多次运行Redis中存在键,导致结果不符合预期,每次执行时清理当前库
		//特别注意:在开发中请勿如此操作
		jedis.flushDB();
		
		//添加值
		jedis.hset("student", "name", "zhangsan");
		//添加值(仅在不存在时)
		jedis.hsetnx("student", "age", "12");
		//批量添加值
		Map<String,String> map = new HashMap<String,String>();
		map.put("sex", "boy");
		map.put("address", "beijing");
		jedis.hmset("student", map);
		//获取值
		String str = jedis.hget("student", "name");
		System.out.println("student:name = " + str);
		//批量获取值
		List<String> list = jedis.hmget("student", "name","age");
		System.out.println("student:name = " + list.get(0));
		System.out.println("student:age = " + list.get(1));
		//获取key
		Set<String> set = jedis.hkeys("student");
		System.out.println("student keys:");
		for (String string : set) {
			System.out.println(string);
		}
		//获取值
		list = jedis.hvals("student");
		System.out.println("student vals:");
		for (String string : list) {
			System.out.println(string);
		}
		//获取key和值
		map = jedis.hgetAll("student");
		System.out.println("student keys vals:");
		for (String key:map.keySet()) {
			System.out.println(key + " = " + map.get(key));
		}
		//删除值
		jedis.hdel("student", "sex");
		System.out.println("student:sex = " + jedis.hget("student", "sex"));
		//获取长度
		Long len = jedis.hlen("student");
		System.out.println("student length = " + len);
	}
	
	/**
	 * redis列表操作
	 */
	@Test
	public void listTest() {
		
		//为避免多次运行Redis中存在键,导致结果不符合预期,每次执行时清理当前库
		//特别注意:在开发中请勿如此操作
		jedis.flushDB();
		
		//表头添加
		jedis.lpush("student", "xiaoli","xiaowang","xiaoliu","xiaozhang");
		//表尾添加
		jedis.rpush("student", "zhangsan","lisi","wangwu");
		//通过索引获取元素
		String str = jedis.lindex("student", 1L);
		System.out.println("student 1st = " + str);
		//在元素前或者后插入元素
		jedis.linsert("student", LIST_POSITION.BEFORE, "xiaozhang", "zhangsan");
		//从表头弹出
		str = jedis.lpop("student");
		System.out.println("student first = " + str);
		//从表尾弹出
		str = jedis.rpop("student");
		System.out.println("student end = " + str);
		//删除
		jedis.lrem("student", 2, "zhangsan");
		//获取所有值
		List<String> list = jedis.lrange("student", 0L, -1L);
		System.out.println("student vals:");
		for (String string : list) {
			System.out.println(string);
		}
	}
	
	/**
	 * redis集合操作
	 */
	@Test
	public void setTest() {

		//为避免多次运行Redis中存在键,导致结果不符合预期,每次执行时清理当前库
		//特别注意:在开发中请勿如此操作
		jedis.flushDB();
		
		//添加成员
		jedis.sadd("student", "zhangsan","lisi");
		jedis.sadd("monitor","wangwu","zhangsan");
		//获取成员数
		Long count = jedis.scard("student");
		System.out.println("student count = " + count);
		//获取成员
		Set<String> set = jedis.smembers("student");
		System.out.println("student members:");
		for (String string : set) {
			System.out.println(string);
		}
		//是否为该集合的成员
		boolean bool = jedis.sismember("student", "zhangsan");
		System.out.println("member zhangsan exist?\n" + bool);
		//交集
		set = jedis.sinter("student","monitor");
		System.out.println("student inter monitor members:");
		for (String string : set) {
			System.out.println(string);
		}
		//并集
		set = jedis.sunion("student","monitor");
		System.out.println("student union monitor members:");
		for (String string : set) {
			System.out.println(string);
		}
		//补集
		set = jedis.sdiff("student","monitor");
		System.out.println("student diff monitor members:");
		for (String string : set) {
			System.out.println(string);
		}
		//随机返回成员
		String str = jedis.srandmember("student");
		System.out.println("random member:\n" + str);
		//移动成员
		jedis.smove("student", "monitor", "lisi");
		//删除成员
		jedis.srem("monitor", "zhangsan");
		//显示
		set = jedis.smembers("student");
		System.out.println("student members:");
		for (String string : set) {
			System.out.println(string);
		}
		set = jedis.smembers("monitor");
		System.out.println("monitor members:");
		for (String string : set) {
			System.out.println(string);
		}
	}
	
	/**
	 * redis有序集合操作
	 */
	@Test
	public void sortSetTest() {

		//为避免多次运行Redis中存在键,导致结果不符合预期,每次执行时清理当前库
		//特别注意:在开发中请勿如此操作
		jedis.flushDB();
		
		//添加成员
		Map<Double,String> map = new HashMap<Double,String>();
		map.put(50d, "zhangsan");
		map.put(60d, "lisi");
		map.put(70d, "wangwu");
		map.put(80d, "zhaoliu");
		map.put(90d, "yangqi");
		map.put(120d, "xiaoming");
		map.put(130d, "xiaozhang");
		map.put(140d, "xiaoli");
		map.put(150d, "xiaoliu");
		jedis.zadd("score", map);
		//更新分数
		jedis.zadd("score", 100d, "zhangsan");
		//获取成员的分数值
		Double dou = jedis.zscore("score", "zhangsan");
		System.out.println("zhangsan score :\n" + dou);
		//按照成员分数小到大返回索引区间的成员
		Set<String> set = jedis.zrange("score", 0, -1);
		System.out.println("score member order:");
		for (String string : set) {
			System.out.println(string);
		}
		//按照成员分数大到小返回索引区间的成员
		set = jedis.zrevrange("score", 0, -1);
		System.out.println("score member reverse:");
		for (String string : set) {
			System.out.println(string);
		}
		//按照成员分数小到大返回分数值区间的成员
		set = jedis.zrangeByScore("score", 50d, 80d);
		System.out.println("score member order:");
		for (String string : set) {
			System.out.println(string);
		}
		//返回有序集合中指定成员的索引
		Long index = jedis.zrank("score", "xiaoliu");
		System.out.println("xiaoliu index is:\n" + index);
	}
}

如果你读过我的Redis入门教程(二)—基本数据类型,你会发现上面这些命令在其中都有提及,只是诸如参数传递的形式、返回值的类型等有少许不同,但方法名和文中的指令完全相同,其他方面也大同小异。因此在上面的代码中并没有像文章中一样尽可能多的列出所有的函数,还需你自己勤于练习、摸索。

Redis连接池


import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
 * @author dotleo
 *
 */
public class RedisUtil {

	//Redis服务器ip地址
	private static final String IP_ADDRESS = "192.168.1.233";
	
	//Redis端口号
	private static final int PORT = 6379;
	
	//可用连接实例的最大数目,默认值为8;
	//如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。
	private static final int MAX_ACTIVE = 1024;
	
	//控制一个pool最多有多少个状态为idle(空闲的)的jedis实例,默认值也是8。
	private static final int MAX_IDLE = 200;
	
	//等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException;
	private static final int MAX_WAIT = 10000;
	
	//在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;  
    private static boolean TEST_ON_BORROW = true;
    
	//Jedis连接池对象
	private static JedisPool jedisPool = null;
	
	
	/**
	 * 初始化连接池
	 */
	static {
		try {
			JedisPoolConfig conf = new JedisPoolConfig();
			conf.setMaxActive(MAX_ACTIVE);
			conf.setMaxIdle(MAX_IDLE);
			conf.setMaxWait(MAX_WAIT);
			conf.setTestOnBorrow(TEST_ON_BORROW);
			jedisPool = new JedisPool(conf, IP_ADDRESS, PORT);
		} catch(Exception ex) {
			ex.printStackTrace();
		}
	}
	
	 /**
	 * 获取Jedis实例
	 * @return Jedis实例
	 */
	public synchronized static Jedis getJedis() {  
         try {  
             if (jedisPool != null) {  
                 Jedis resource = jedisPool.getResource();  
                 return resource;  
             } else {  
                 return null;  
             }  
         } catch (Exception e) {  
             e.printStackTrace();  
             return null;  
         }  
     }
	
	/** 
     * 释放jedis资源 
     * @param jedis Jedis对象 
     */  
     public static void returnResource(final Jedis jedis) {  
         if (jedis != null) {  
              jedisPool.returnResourceObject(jedis);  
         }  
     }  
}


文章除注明转载外,均为原创。欢迎任何形式的转载,但请务必注明出处:

文章转载自 OSchina 开源中国
本文作者:dotleo
作者主页:https://my.oschina.net/u/2930289/blog

© 著作权归作者所有

共有 人打赏支持
dotleo
粉丝 10
博文 42
码字总数 48892
作品 0
天津
程序员
【目录导航】JAVA零基础进阶之路

【JAVA零基础入门系列】(已完结)导航目录 Day1 开发环境搭建 Day2 Java集成开发环境IDEA Day3 Java基本数据类型 Day4 变量与常量 Day5 Java中的运算符 Day6 Java字符串 Day7 Java输入与输出...

MFrank ⋅ 昨天 ⋅ 0

Spring--Redis入门集成配置

一、什么是Redis? 这两年对于 NoSQL(not only SQL) 的使用已经越加频繁,所以对于Redis是什么我们也不会太过陌生。简单来说,Redis就是一个开源的,Key-Value数据库。它的存在主要是为了减少...

ge洋 ⋅ 04/17 ⋅ 0

使用zookeeper序列节点实现不可重入分布式锁

一、前言 在同一个jvm进程中时,可以使用JUC提供的一些锁来解决多个线程竞争同一个共享资源时候的线程安全问题,但是当多个不同机器上的不同jvm进程共同竞争同一个共享资源时候,juc包的锁就...

加多 ⋅ 01/12 ⋅ 0

Java高级程序员面试大纲——错过了金三,你还要错过银四吗

跳槽时时刻刻都在发生,但是我建议大家跳槽之前,先想清楚为什么要跳槽。切不可跟风,看到同事一个个都走了,自己也盲目的开始面试起来(期间也没有准备充分),到底是因为技术原因(影响自己...

Java高级架构 ⋅ 04/27 ⋅ 0

Java程序员面试大纲—错过了金三银四,你还要错过2018吗?

跳槽时时刻刻都在发生,但是我建议大家跳槽之前,先想清楚为什么要跳槽。切不可跟风,看到同事一个个都走了,自己也盲目的开始面试起来(期间也没有准备充分),到底是因为技术原因(影响自己...

java高级架构牛人 ⋅ 04/27 ⋅ 0

Jenkins 教程(一)实现自动化打包及邮件通知

个人不喜欢装腔作势一堆专业术语放上去,让大多数人看不懂来提升逼格(所谓的专家),所以我简单的介绍jenkins是干啥的。本文使用jenkins,就是让它把git仓库里的东西取出来,然后在jenkins容器...

FantJ ⋅ 05/26 ⋅ 0

学java还是javascript好?哪个更有前途?

  对于哪种语言好这种问题,其实并没有固定的答案,最重要的还是 兴趣!兴趣!兴趣!重要的事情说三遍。无论做什么开发,永远要以兴趣来驱动自己学习。 先大致的说一下,Java学习是一个需要...

W3Cschool小编 ⋅ 04/23 ⋅ 0

Java 使用 happen-before 规则实现共享变量的同步操作

前言 熟悉 Java 并发编程的都知道,JMM(Java 内存模型) 中的 happen-before(简称 hb)规则,该规则定义了 Java 多线程操作的有序性和可见性,防止了编译器重排序对程序结果的影响。按照官方的...

stateIs0 ⋅ 01/20 ⋅ 0

阿里巴巴开源框架-通用缓存访问JetCache介绍

JetCache是由阿里巴巴开源的通用缓存访问框架,如果你对Spring Cache很熟悉的话,请一定花一点时间了解一下JetCache,它更好用。 JetCache提供的核心能力包括: 提供统一的,类似jsr-107风格...

黄理 ⋅ 01/24 ⋅ 0

Java程序员必读书单,家族又添新成员

点击关注异步图书,置顶公众号 每天与你分享IT好书 技术干货 职场知识 参与文末话题讨论,每日赠送异步图书。 ——异步小编 有些革命出其不意地吸引了全世界的眼球。Twitter、Linux操作系统和...

异步社区 ⋅ 05/09 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Nginx服务架构初探(四):nginx服务器的rewrite功能

nginx服务器的rewrite功能 1.nginx后端服务器组的配置 1>upstream name {…} name是给服务器组限的组名 2>server address [parameters]; address为服务器地址 parame......

余温灬未存 ⋅ 今天 ⋅ 0

layer.prompt使文本框为空的情况下也能点击确定

最近一直在使用layui,但是用到弹出层layer.prompt时,如果文本框是空的话点击确定没有反应,不能向下执行。 但是我又需要空值,看看我原来的代码。 123456789 layer.prompt...

孟飞阳 ⋅ 今天 ⋅ 0

Linux普通文件压缩工具gzip、Bzip2、xz

第六章 文件压缩和打包 6.1 压缩打包介绍 Linux环境常见压缩文件类型: .zip,.gz,.bz2,.xz, .tar.gz,.tar.bz2,.tar.xz 压缩打包的目的 方便文件传输 节省磁盘空间 减少传输花费的时间 ...

弓正 ⋅ 今天 ⋅ 0

移动弹窗基础知识浅析——IOS弹窗体系

摘要: 最为常见的【弹窗】反而是最“捉摸不定”的东西。各种类型的弹窗傻傻分不清楚,不知道在什么场景下应该用哪种弹窗。尤其是遇到“二次确认”等场景…… 因此,打算从头整理移动弹窗的基...

阿里云云栖社区 ⋅ 今天 ⋅ 0

zabbix短信报警统计以及报表展示

一、需求 由于我们的业务报警比较频繁,之前是针对每个报警进行具体处理,但是有时还会重复出现,或者后续处理有时忘记跟进等,因此进行报警短信的统计,可以针对一些问题与业务跟进,明确后...

o翡翠谷o ⋅ 今天 ⋅ 0

JNI 输出LOG

1、导入log头文件。在你使用的 .c/ .cpp 文件中,导入 log.h 头文件。 #include<android/log.h> 2、在android.mk 加上 LOCAL_LDLIBS := -llog 或 LOCAL_SHARED_LIBRARIES := liblog 3、定义L......

国仔饼 ⋅ 今天 ⋅ 0

主线程pthread_exit 作用

#include <iostream>#include <pthread.h>#include <unistd.h>using namespace std;#define NUM_THREADS 10void* say_hello(void* args){ int i = *((int*)args);/......

xxdd ⋅ 今天 ⋅ 0

崛起于Springboot2.X之Mybatis-xml方式操作mysql数据库(3)

序言:当第一篇讲道Mybatis的时候,只要使用过mybatis的java程序员100%都会知道这种方式,因为这是最广泛最全面的编写sql操作mysql数据库的方式,高级sql的编写往往通过xml方式,接下来进入正...

木九天 ⋅ 今天 ⋅ 1

移动弹窗基础知识浅析——IOS弹窗体系

摘要: 最为常见的【弹窗】反而是最“捉摸不定”的东西。各种类型的弹窗傻傻分不清楚,不知道在什么场景下应该用哪种弹窗。尤其是遇到“二次确认”等场景…… 因此,打算从头整理移动弹窗的基...

猫耳m ⋅ 今天 ⋅ 0

spring elasticsearch 2.4 date 日期

1.mappingPUT user_behavior { "mappings": { "user_behavior": { "properties": { "date": { "type": "createDate", ......

xiaomin0322 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部