Jedis客户端操作redis小例子
package com.redis.string;
import com.redis.util.RedisUtil;
import org.junit.jupiter.api.Test;
import redis.clients.jedis.Jedis;
import java.util.List;
public class StringTest {
/**
* get
* 向redis中存放数据aaa
* 返回:获取到aaa的值为:张三
*/
@Test
public void getString(){
Jedis jedis = RedisUtil.getJedis();
String aaa = jedis.get("aaa");
System.out.println("获取到aaa的值为:"+aaa);
}
/**
* set
* 从redis中获取数据aaa
* 返回:保存aaa的返回值为:OK
*/
@Test
public void saveString(){
Jedis jedis = RedisUtil.getJedis();
String set = jedis.set("aaa", "张三");
System.out.println("保存aaa的返回值为:" + set);
}
/**
* delete
* 从redis中删除数据aaa
* 返回:删除aaa的返回值为:1
*/
@Test
public void deleteString(){
Jedis jedis = RedisUtil.getJedis();
Long aaa = jedis.del("aaa");
System.out.println("删除aaa的返回值为:" + aaa);
}
/**
* append
* 向redis中已经存在的键追加数据
* 返回:追加aaa的返回值为:15
* 追加后的aaa的值为:张三爱李四
*/
@Test
public void appendString(){
Jedis jedis = RedisUtil.getJedis();
Long append = jedis.append("aaa", "爱李四");
System.out.println("追加aaa的返回值为:" + append);
String aaa = jedis.get("aaa");
System.out.println("追加后的aaa的值为:"+aaa);
}
/**
* decr
* incr
* 对数据减1,但是value必须是Integer类型的(api提供的只有String类型,但是需要时数字)
* 与之对应的是incr方法,对数据加1。
*/
@Test
public void decrAndIncrInteger(){
Jedis jedis = RedisUtil.getJedis();
String a = jedis.set("a", "5");
System.out.println("保存a的值为5,保存操作的返回值为:" + a);
Long a1 = jedis.decr("a");
System.out.println("对a减1后的返回值为:"+a1);
Long a2 = jedis.incr("a");
System.out.println("对a加1后的返回值为:"+a2);
}
/**
* decrby
* incrby
* 和decr与incr不一样的是,decrby与incrby可以指定加减的数值
*/
@Test
public void decrByAndIncrByInteger(){
Jedis jedis = RedisUtil.getJedis();
String b = jedis.set("b", "5");
System.out.println("保存b的值为5,保存操作的返回值为:" + b);
Long b1 = jedis.decrBy("b",2);
System.out.println("对b减2后的返回值为:"+b1);
Long b2 = jedis.incrBy("b",1);
System.out.println("对b加1后的返回值为:"+b2);
}
/**
* getRange
* 获取指定偏移量位置的字符串。也就是获取指定位置的子字符串
* 保存c的值为i am hanmei,保存操作的返回值为:OK
* 获取字符串的3-6位置的值:m ha
*/
@Test
public void getRange(){
Jedis jedis = RedisUtil.getJedis();
String c = jedis.set("c", "i am hanmei");
System.out.println("保存c的值为i am hanmei,保存操作的返回值为:" + c);
String c1 = jedis.getrange("c", 3, 6);
System.out.println("获取字符串的3-6位置的值:"+c1);
//-1表示字符串的末尾
String c2 = jedis.getrange("c", 3, -1);
System.out.println("获取字符串的3--1位置的值:"+c2);
}
/**
* getset
* 返回老值,设置新值
* 相当于分两步进行,先进行get将结果返回,然后再进行set不返回结果
*/
@Test
public void getSet(){
Jedis jedis = RedisUtil.getJedis();
String d = jedis.set("d", "hello");
System.out.println("保存d的值为hello,保存操作的返回值为:" + d);
String d1 = jedis.getSet("d","world");
System.out.println("获取字符串d值:"+d1+",并设置新值为:world");
String d2 = jedis.get("d");
System.out.println("获取字符串d的值:"+d2);
//如果不存在,直接返回null
String set = jedis.getSet("e", "imnew");
System.out.println("如果e为null,使用getset会是什么结果:"+set);
//如果是数字也没有问题
String f = jedis.set("f", "10");
System.out.println("设置f为10,返回结果为:"+f);
String f1 = jedis.getSet("f", "lisi");
System.out.println("获取字符串d值:"+f1+",并设置新值为:lisi");
String f2 = jedis.get("f");
System.out.println("获取字符串f的值:"+f2);
}
/**
* mset mget
* 批量保存数据和批量获取数据
*/
@Test
public void msetAndmget(){
Jedis jedis = RedisUtil.getJedis();
String mset = jedis.mset("a", "1", "b", "2", "c", "3", "d", "4");
System.out.println("设置ABCD的值分别为1234");
List<String> mget = jedis.mget("a", "b", "c", "d");
for (String value:mget){
System.out.println("获取到的值分别为:"+value);
}
System.out.println("获取a的值为:"+jedis.get("a"));
}
/**
* 在设置值的时候,设置该值的过期时间。
* 在设定的时间范围内是有效的,超过该时间后,在此获取该keyvalue返回null
* @throws InterruptedException
*/
@Test
public void setex() throws InterruptedException {
Jedis jedis = RedisUtil.getJedis();
String setex = jedis.setex("ex", 10, "exvalue");
System.out.println("设置ex的值为exvalue,过期时间为10s,返回结果:"+setex);
System.out.println("获取ex的值为:"+jedis.get("ex"));
Thread.sleep(10000);
System.out.println("睡眠10s后获取该ex的值为:"+jedis.get("ex"));
}
/**
* 如果keyvalue已经存在,那么就不在进行重写。
* 通过该方案,可以实现分布式锁的功能。在进行业务逻辑操作的时候,都需要先调用这个方法。
* 但是该方法需要配合expire使用,如果不设置超时时间,如果业务出现问题,可能其他线程就永远无法获取到该分布式锁。
* 那么问题又出现了:如果setnx操作完成后还未来得及设置expire,服务就挂掉了,那该怎么办呢?
* 这个需要使用jedis的set方法,设置多个参数。具体操作详见下面的setnxAndexpire()方法,对各参数都有说明
*
* @throws InterruptedException
* 设置nx的值为nxvalue1,返回结果:1
* 对nx重新设置值.....
* 设置nx的值为nxvalue2,返回结果:0
* 获取nx的最新值为:nxvalue1
*/
@Test
public void setnx() throws InterruptedException {
Jedis jedis = RedisUtil.getJedis();
jedis.del("nx");
Long setnx1 = jedis.setnx("nx", "nxvalue1");
System.out.println("设置nx的值为nxvalue1,返回结果:"+setnx1);
System.out.println("对nx重新设置值..");
Long setnx2 = jedis.setnx("nx", "nxvalue2");
System.out.println("设置nx的值为nxvalue2,返回结果:"+setnx2);
System.out.println("获取nx的最新值为:"+jedis.get("nx"));
}
/**
* key : 键
* value : 值
* nxxx : NX|XX
* 说明:NX -- Only set the key if it does not already exist. XX -- Only set the key if it already exist.
* expx : EX|PX
* 说明:expire time units: EX = seconds; PX = milliseconds
* time : 时间
*
* 该方法可以同时实现sexnx的功能,有实现expire的功能
* 在setnx后忽然当即,未来得及设置expire时间,容易导致该值一直存在,并对后面的操作造成极大的影响。
* 测试使用该方案可以有效的解决问题
*/
@Test
public void setnxAndexpire() throws InterruptedException {
Jedis jedis = RedisUtil.getJedis();
String set = jedis.set("nxe", "nxe", "NX", "EX", 8);
System.out.println("返回值:"+set);
String nxe = jedis.get("nxe");
System.out.println(nxe);
Thread.sleep(5000);
System.out.println("=======");
String nxx = jedis.get("nxe");
System.out.println(nxx);
Thread.sleep(5000);
System.out.println("--------");
String nxxx = jedis.get("nxe");
System.out.println(nxxx);
}
/**
* 将数据在指定的偏移量替换为新的值
* range的值为:hello world
* range的值为:hello redis
* @throws InterruptedException
*/
@Test
public void setrange() throws InterruptedException {
Jedis jedis = RedisUtil.getJedis();
jedis.set("range","hello world");
System.out.println("range的值为:"+jedis.get("range"));
jedis.setrange("range",6,"redis");
System.out.println("range的值为:"+jedis.get("range"));
}
}
RedisUtil
package com.redis.util;
import org.apache.log4j.Logger;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class RedisUtil {
private static final Logger logger = Logger.getLogger(RedisUtil.class);
//Redis服务器IP
private static String ADDR = "192.168.72.129";
//Redis的端口号
private static int PORT = 6380;
//可用连接实例的最大数目,默认值为8;
//如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。
private static int MAX_ACTIVE = 1024;
//控制一个pool最多有多少个状态为idle(空闲的)的jedis实例,默认值也是8。
private static int MAX_IDLE = 200;
//等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException;
private static int MAX_WAIT = 10000;
private static int TIMEOUT = 10000;
//在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;
private static boolean TEST_ON_BORROW = true;
private static JedisPool jedisPool = null;
static {
try {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(MAX_ACTIVE);
config.setMaxIdle(MAX_IDLE);
config.setMaxWaitMillis(MAX_WAIT);
config.setTestOnBorrow(TEST_ON_BORROW);
jedisPool = new JedisPool(config, ADDR, PORT, TIMEOUT);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取Jedis实例
* @return
*/
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
*/
public static void closeResource(final Jedis jedis) {
if (jedis != null) {
jedis.close();
}
}
/**
* 删除key
*/
public Long delkeyObject(String key) {
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
return jedis.del(key.getBytes());
}catch(Exception e) {
e.printStackTrace();
return null;
}finally{
if(jedis != null)
{
jedis.close();
}
}
}
public Boolean existsObject(String key) {
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
return jedis.exists(key.getBytes());
}catch(Exception e) {
e.printStackTrace();
return null;
}finally{
if(jedis != null)
{
jedis.close();
}
}
}
}