Redis入门教程(三)— Java中操作Redis
在Redis的官网上,我们可以看到Redis的Java客户端众多
其中,Jedis是Redis官方推荐,也是使用用户最多的Java客户端。
开始前的准备
创建项目
- 首先创建一个新的Java Project,命名为Jedis(你也可以给它你喜爱的名字)
- 在项目中新建一个Folder(文件夹),命名为“lib”
- 将jedis-2.1.0.jar、commons-pool-1.5.4.jar、junit-4.10.jar复制到lib文件夹下
- 选中文件夹或者三个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);
}
}
}
Redis入门教程(三)— Java中操作Redis的更多相关文章
- Java中操作Redis
一.server端安装 1.下载 https://github.com/MSOpenTech/redis 可看到当前可下载版本:redis2.6 下载后的文件为: 解压后,选择当前64位win7系统对 ...
- 20190928-02使用Redis客户端Jedis连接Redis,以及用Java代码操作Redis 000 030
启动redis package com.yujie.jedis; import java.util.HashMap; import java.util.Map; import java.util.Se ...
- Redis【4】Java Jedis 操作 Redis~
package redis.redis; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; /** * 描 ...
- 超强、超详细Redis入门教程【转】
这篇文章主要介绍了超强.超详细Redis入门教程,本文详细介绍了Redis数据库各个方面的知识,需要的朋友可以参考下 [本教程目录] 1.redis是什么2.redis的作者何许人也3.谁在使用red ...
- 超详细Redis入门教程【转】
这篇文章主要介绍了超强.超详细Redis入门教程,本文详细介绍了Redis数据库各个方面的知识,需要的朋友可以参考下 [本教程目录] 1.redis是什么 2.redis的作者何许人也 3.谁在使 ...
- Redis入门教程:特性及数据类型的操作
虽然Redis已经很火了,相信还是有很多同学对Redis只是有所听闻或者了解并不全面,下面是一个比较系统的Redis介绍,对Redis的特性及各种数据类型及操作进行了介绍.是一个很不错的Redis入门 ...
- 【原】Redis入门教程
最近在学习Redis,写几篇文章记录一下学习过程:Redis入门教程. 1.Redis基本概念 Redis Redis Keys Redis 基本数据类型 Redis基本操作 遍历操作 Pub-Sub ...
- Redis入门教程(二)
推荐阅读: Redis入门教程(一)https://www.cnblogs.com/jichi/p/10285346.html 5. Redis 的数据结构 5.1 Redis 数据结构介绍 redi ...
- redis学习教程三《发送订阅、事务、连接》
redis学习教程三<发送订阅.事务.连接> 一:发送订阅 Redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息.Redi ...
随机推荐
- vs编译应用程序不依赖运行vs环境
控制台应用程序不依赖VS运行环境就可以运行的设置: 1,使用release模式编译 2,项目属性中,“C/C++”,“代码生成”中的运行库改为“多线程(/MT)” 3,项目属性中,“链接器”,“系统” ...
- 2. 更改InnoDB redo日志文件的数量或大小
2. 更改InnoDB redo日志文件的数量或大小 要更改InnoDB 重做日志文件的数量或大小,请执行以下步骤: 1)停止MySQL服务器,确保正常关闭且没有错误发生 2) 编辑my.cnf以更改 ...
- python-爬虫学习(文字、图片、视频)
爬虫-文字爬取 import re import requests respone = requests.get('https://ishuo.cn/') ##获取网站url data = respo ...
- 如何禁用python警告
有-W选项. python -W ignore foo.py 所属网站分类: python基础 > 综合&其它 作者:jiem 链接:http://www.pythonheidong.c ...
- Django 动态建表
#!/usr/bin/env python # -*- coding:utf-8 -*- # Author:Random_lee # -*- coding: utf-8 -*- from django ...
- Linux 命令大全 - 管理文件和目录的命令
1.pwd 显示当前目录 该命令的英文解释为print working directory(打印工作目录).输入pwd命令,Linux会输出当前目录. 2.cd 命令用来改变所在目录 cd / 转到根 ...
- mysql 常用命令(一)
1. 函数向日期添加指定的时间间隔 DATE_ADD(date,INTERVAL expr type)eg:DATE_ADD(CURDATE(),INTERVAL 1 MONTH) //在当前时间加一 ...
- ArrayList集合的增删改查方法
新建一个myArrayList项目 在myArrayList项目下创建一个包 包中创建一个ArrayListDemo2.java文件 ArrayListDemo2.java import java.u ...
- cherrypy & gevent patch
给cherrypy 打gevent WSGIServer的patch 1. patch Serving 类 2. 关闭python的原生WSGIServer 具体使用例子参考 我的开源项目 http ...
- Fiddler抓包-get与post请求
from:https://www.cnblogs.com/yoyoketang/p/6719717.html 本篇以博客园的请求为例,简单分析get与post数据有何不一样,以后也能分辨出哪些是get ...