Jedis 是 Redis 官方首选的 Java 客户端开发包。
因篇幅有限,本章仅提供示例代码,不粘贴测试结果。下篇末提供原代码下载,可自行实验。
连接工具类
public class RedisUtil {
//Redis服务器IP
private static String ADDR = "127.0.0.1";
//Redis的端口号
private static int PORT = 6379;
//访问密码
// private static String AUTH = "heqing";
//可用连接实例的最大数目,默认值为8;
//如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。
private static int MAX_TOTAL = 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;
private static ShardedJedisPool shardedJedisPool = null;
//redis-server.exe redis.windows.conf //启动redis
/**
* 初始化Redis连接池
*/
static {
try {
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(MAX_TOTAL);
config.setMaxIdle(MAX_IDLE);
config.setMaxWaitMillis(MAX_WAIT);
config.setTestOnBorrow(TEST_ON_BORROW);
// jedisPool = new JedisPool(config, ADDR, PORT, TIMEOUT, AUTH); //有密码加入AUTH
jedisPool = new JedisPool(config, ADDR, PORT, TIMEOUT);
List<JedisShardInfo> jdsInfoList =new ArrayList<JedisShardInfo>();
JedisShardInfo infoA = new JedisShardInfo(ADDR, PORT);
// infoA.setPassword(AUTH); //有密码加入AUTH
jdsInfoList.add(infoA);
shardedJedisPool = new ShardedJedisPool(config, jdsInfoList);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取Jedis实例
* @return
*/
public synchronized static Jedis getJedis() {
try {
if (jedisPool != null) {
Jedis resource = jedisPool.getResource();
return resource;
} else {
jedisPool = new JedisPool(new JedisPoolConfig(), ADDR);
return jedisPool.getResource();
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public synchronized static ShardedJedis getShardedJedis() {
try {
if (shardedJedisPool != null) {
ShardedJedis shardedJedis = shardedJedisPool.getResource();
return shardedJedis;
}
return null;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 释放jedis资源
* @param jedis
*/
@SuppressWarnings("deprecation")
public static void returnResource(final Jedis jedis) {
if (jedis != null && jedisPool !=null ) {
jedisPool.returnResource(jedis);
}
}
@SuppressWarnings("deprecation")
public static void returnResource(final ShardedJedis shardedJedis) {
if (shardedJedis != null && shardedJedisPool !=null ) {
shardedJedisPool.returnResource(shardedJedis);
}
}
public static JedisPool getJedisPool() {
return jedisPool;
}
public static ShardedJedisPool getShardedJedisPool() {
return shardedJedisPool;
}
public static void destroyJedisPool() {
jedisPool.destroy();
}
public static void destroyShardedJedisPool() {
shardedJedisPool.destroy();
}
}
操作Key
public class TestKey {
private Jedis jedis; // 获取数据库的连接,非切片客户端连接
@Before
public void setup() {
jedis = RedisUtil.getJedis();
}
// @Test
public void testAdd() {
System.out.println("=============增=============");
// 判断key否存在
System.out.println("判断name键是否存在:"+jedis.exists("name"));
System.out.println("新增name,heqing键值对:"+jedis.set("name", "heqing"));
System.out.println("判断name键是否存在:"+jedis.exists("name"));
// 设置 qq的过期时间
System.out.println("判断qq是否存在:"+jedis.set("qq", "975656343"));
System.out.println("设置 qq的过期时间为3秒:"+jedis.expire("qq", 3));
try{
Thread.sleep(4000);
}
catch (InterruptedException e){
}
System.out.println("判断qq是否存在:"+jedis.exists("qq"));
// 查看某个key的剩余生存时间,单位【秒】.永久生存或者不存在的都返回-1
System.out.println("查看qq的剩余生存时间:"+jedis.ttl("qq"));
// 移除某个key的生存时间
System.out.println("移除qq的生存时间:"+jedis.persist("qq"));
}
// @Test
public void testFind() {
// 输出系统中所有的key
Set<String> keys = jedis.keys("*");
Iterator<String> it=keys.iterator() ;
while(it.hasNext()) {
String key = it.next();
System.out.println(key +" 的类型:"+ jedis.type(key));
}
}
@Test
public void testKey() {
// 删除某个key,若key不存在,则忽略该命令。
System.out.println("系统中删除name: "+jedis.del("name"));
System.out.println("判断name是否存在:"+jedis.exists("name"));
}
}
操作字符串(String)
public class TestString {
private Jedis jedis; // 获取数据库的连接,非切片客户端连接
@Before
public void setup() {
jedis = RedisUtil.getJedis();
}
/**
* jedis.setnx("name","***") 不存在便增加,存在不会修改原来的值
* jedis.set("name","***") 不存在便增加,存在会修改原来的值
*/
@Test
public void testAdd() {
System.out.println("=============增=============");
jedis.set("name","heqing");
jedis.set("age","26");
System.out.println(jedis.get("name"));
System.out.println(jedis.get("age"));
Set<String> keys = jedis.keys("*");
System.out.println("共有"+keys.size()+"个键值");
System.out.println("=============新增键值对时防止覆盖原先值=============");
System.out.println("当age存在时,尝试新增age:"+jedis.setnx("age", "27"));
System.out.println("获取age对应的值:"+jedis.get("age"));
System.out.println("原先age不存在时,新增age:"+jedis.set("age", "28"));
System.out.println("获取age对应的值:"+jedis.get("age"));
}
/**
* set 直接覆盖原来的数据
* append 在原来的数据后增加
* incr 进行加1操作,并返回增加后的值
*/
// @Test
public void testUpdate() {
System.out.println("=============改=============");
System.out.println("直接覆盖name原来的数据:"+jedis.set("name","heqing-update"));
System.out.println("获取name对应的新值:"+jedis.get("name"));
System.out.println("在name原来值后面追加:"+jedis.append("name","-append"));
System.out.println("获取name对应的新值:"+jedis.get("name"));
System.out.println("在age进行加1操作:"+jedis.incr("age"));
System.out.println("获取age对应的新值:"+jedis.get("age"));
System.out.println("=============获取原值,更新为新值一步完成=============");
System.out.println("name原值:"+jedis.getSet("name", "heqing-new"));
System.out.println("name新值:"+jedis.get("name"));
}
/**
* mset,mget同时新增,修改,查询多个键值对
* 等价于:
* jedis.set("name","ssss");
* jedis.set("jarorwar","xxxx");
*/
// @Test
public void testFind() {
System.out.println("=============获取子串=============");
System.out.println("获取name对应值中的子串:"+jedis.getrange("name", 3, 5));
System.out.println("=============增,删,查(多个)=============");
Set<String> keys = jedis.keys("*");
System.out.println("一次性新增name,age及其对应值:"+jedis.mset("name","heqing","age","26"));
System.out.println("一次性获取name,age各自对应的值:"+jedis.mget("name","age"));
keys = jedis.keys("*");
System.out.println("---->共有"+keys.size()+"个键值");
System.out.println("一次性删除name,age:"+jedis.del(new String[]{"name","age"}));
System.out.println("一次性获取name,age各自对应的值:"+jedis.mget("name","age"));
keys = jedis.keys("*");
System.out.println("---->共有"+keys.size()+"个键值");
}
// @Test
public void testDelete() {
System.out.println("=============删=============");
System.out.println("删除name键值对:"+jedis.del("name"));
System.out.println("获取name键对应的值:"+jedis.get("name"));
Set<String> keys = jedis.keys("*");
System.out.println("共有"+keys.size()+"个键值");
System.out.println("=============超过有效期键值对被删除=============");
// 设置key的有效期,并存储数据
System.out.println("新增age,并指定过期时间为2秒"+jedis.setex("age", 2, "27"));
System.out.println("获取age对应的值:"+jedis.get("age"));
try{
Thread.sleep(3000);
}
catch (InterruptedException e){
e.printStackTrace();
}
System.out.println("3秒之后,获取age对应的值:"+jedis.get("age"));
}
}
操作列表(List)
public class TestList {
private Jedis jedis; // 获取数据库的连接,非切片客户端连接
@Before
public void setup() {
jedis = RedisUtil.getJedis();
}
/**
* Lpush 命令将一个或多个值插入到列表头部(最左边)。
* 如果 key 不存在,一个空列表会被创建并执行 LPUSH 操作。 当 key 存在但不是列表类型时,返回一个错误
* Rpush 命令用于将一个或多个值插入到列表的尾部(最右边)。
* lrange 是按范围取出第一个是key,第二个是起始位置,第三个是结束位置,jedis.llen获取长度 -1表示取得所有
**/
@Test
public void testAdd() {
System.out.println("=============增=============");
jedis.lpush("java","1");
jedis.lpush("java","2");
jedis.lpush("java","3");
System.out.println("所有元素-java:"+jedis.lrange("java", 0, -1));
jedis.rpush("j2ee","test1");
jedis.rpush("j2ee","test2");
jedis.rpush("j2ee","test3");
System.out.println("所有元素-j2ee:"+jedis.lrange("j2ee", 0, -1));
}
// @Test
public void testUpdate() {
System.out.println("=============改=============");
System.out.println("j2ee修改前---->"+jedis.lrange("j2ee", 0, -1));
// 修改列表中指定下标的值
jedis.lset("j2ee", 0, "test0");
System.out.println("j2ee修改后---->"+jedis.lrange("j2ee", 0, -1));
}
// @Test
public void testFind() {
System.out.println("=============查=============");
System.out.println("所有元素-java:"+jedis.lrange("java", 0, -1));
// 数组长度
System.out.println("java的长度:"+jedis.llen("java"));
}
/*
* list中存字符串时必须指定参数为alpha,如果不使用SortingParams,而是直接使用sort("list"),
* 会出现"ERR One or more scores can't be converted into double"
*
* 排序之后返回元素的数量可以通过limit修饰符进行限制,修饰符接受offset和count两个参数。
* offset:指定要跳过的元素数量,即起始位置。count:指定跳过offset个指定的元素之后,要返回多少个对象。
* sort命令默认排序对象为数字,当需要对字符串进行排序时,需要显式地在sort命令之后添加alpha修饰符。
* ace返回键值从小到大排序的结果。 desc:返回键值从大到小排序的结果
* lrange 子串: start为元素下标,end也为元素下标;-1代表倒数一个元素,-2代表倒数第二个元素
* lindex 获取列表指定下标的值
*/
// @Test
public void testOrder() {
System.out.println("=============排序=============");
System.out.println("Java原始排序:"+jedis.lrange("java", 0, -1));
SortingParams sortingParameters = new SortingParams();
sortingParameters.alpha();
sortingParameters.limit(1, -1);
sortingParameters.desc();
System.out.println("返回排序后的结果:"+jedis.sort("java",sortingParameters));
System.out.println("返回排序后的结果-java:"+jedis.sort("java"));
System.out.println("子串-第二个开始到结束:"+jedis.lrange("java", 1, -1));
System.out.println("获取下标为1的元素:"+jedis.lindex("java", 1)+"\n");
}
/**
* lrem 根据参数 COUNT 的值,移除列表中与参数 VALUE 相等的元素 。
* count>0:从表头开始向表尾搜索,count<0:从表尾开始向表头搜索,count = 0:移除表中所有与 VALUE 相等的值
* Ltrim 让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
* 0 表示列表的第一个元素,以 1 表示列表的第二个元素 -1表示列表的最后一个元素, -2 表示列表的倒数第二个元素
* lpop 命令删除,并返回保存列表在key的第一个元素
**/
// @Test
public void testDelete(){
System.out.println("=============删=============");
System.out.println("所有元素-j2ee:"+jedis.lrange("j2ee", 0, -1));
// 删除列表指定的值 ,第二个参数为删除的个数(有重复时),后add进去的值先被删,类似于出栈
System.out.println("成功删除指定元素个数-java:"+jedis.lrem("j2ee", 1, "test0"));
System.out.println("删除指定元素之后-java:"+jedis.lrange("j2ee", 0, -1));
// 删除区间以外的数据
System.out.println("删除下标0-1区间之外的元素:"+jedis.ltrim("j2ee", 0, 1));
System.out.println("删除指定区间之外元素后-java:"+jedis.lrange("j2ee", 0, -1));
// 列表元素出栈
System.out.println("出栈元素:"+jedis.lpop("j2ee"));
System.out.println("元素出栈后-java:"+jedis.lrange("j2ee", 0, -1));
// 删除key
System.out.println("删除j2ee键值对:"+jedis.del("j2ee"));
}
}
操作集合(Set)
public class TestSet {
private Jedis jedis; // 获取数据库的连接,非切片客户端连接
@Before
public void setup() {
jedis = RedisUtil.getJedis();
}
// @Test
public void testAdd() {
System.out.println("=============增=============");
System.out.println("向user集合中加入元素name:"+jedis.sadd("user", "name"));
System.out.println("向user集合中加入元素age:"+jedis.sadd("user", "age"));
System.out.println("向user集合中加入元素age:"+jedis.sadd("user", "qq"));
System.out.println("查看user集合中的所有元素:"+jedis.smembers("user"));
}
// @Test
public void testFind() {
System.out.println("=============查=============");
System.out.println("判断name是否在集合user中:"+jedis.sismember("user", "name"));
System.out.println("判断who是否在集合user中:"+jedis.sismember("user", "who"));
System.out.println("循环查询获取sets中的每个元素:");
Set<String> set = jedis.smembers("user");
Iterator<String> it=set.iterator() ;
while(it.hasNext()){
Object obj=it.next();
System.out.println(obj);
}
System.out.println("随机返回key集合中的一个元素:"+jedis.srandmember("user"));
System.out.println("集合的元素个数 :"+jedis.scard("user"));
}
// @Test
public void testSet(){
System.out.println("=============删=============");
System.out.println("删除前:"+jedis.smembers("user"));
System.out.println("集合user中删除元素qq:"+jedis.srem("user", "qq"));
System.out.println("删除qq后:"+jedis.smembers("user"));
System.out.println("删除user键值对:"+jedis.del("user"));
System.out.println("删除后:"+jedis.smembers("user"));
}
@Test
public void testOperation() {
System.out.println("=============集合运算=============");
System.out.println("user1中添加元素name:"+jedis.sadd("user1", "name"));
System.out.println("user1中添加元素age:"+jedis.sadd("user1", "age"));
System.out.println("user1中添加元素qq:"+jedis.sadd("user1", "qq"));
System.out.println("user2中添加元素name:"+jedis.sadd("user2", "name"));
System.out.println("user2中添加元素age:"+jedis.sadd("user2", "age"));
System.out.println("user2中添加元素e_nail:"+jedis.sadd("user2", "e_nail"));
System.out.println("查看user1集合中的所有元素:"+jedis.smembers("user1"));
System.out.println("查看user2集合中的所有元素:"+jedis.smembers("user2"));
System.out.println("user1和user2交集:"+jedis.sinter("user1", "user2"));
System.out.println("user1和user2并集:"+jedis.sunion("user1", "user2"));
System.out.println("user1和user2差集:"+jedis.sdiff("user1", "user2"));
System.out.println("user2和user1差集:"+jedis.sdiff("user2", "user1"));
}
}
操作有序集合(sorted set)
private Jedis jedis; // 获取数据库的连接,非切片客户端连接
@Before
public void setup() {
jedis = RedisUtil.getJedis();
}
// @Test
public void testAdd() {
System.out.println("=============增=============");
System.out.println("user中添加元素name:"+jedis.zadd("user", 2.0, "name"));
System.out.println("user中添加元素age:"+jedis.zadd("user", 8.0, "age"));
System.out.println("user中添加元素qq:"+jedis.zadd("user", 5.0, "qq"));
System.out.println("user集合中的所有元素:"+jedis.zrange("user", 0, -1));//按照权重值排序 由小到大
}
// @Test
public void testFind() {
System.out.println("=============查=============");
System.out.println("user集合中的所有元素:"+jedis.zrange("user", 0, -1));//按照权重值排序 由小到大
System.out.println("统计zset集合中的元素中个数:"+jedis.zcard("user"));
System.out.println("统计zset集合中权重某个范围内(1.0——5.0),元素的个数:"+jedis.zcount("user", 1.0, 5.0));
System.out.println("查看zset集合中user的权重:"+jedis.zscore("user", "qq"));
System.out.println("查看下标1到2范围内的元素值:"+jedis.zrange("user", 1, 2));
}
@Test
public void testSortedSet(){
System.out.println("=============删=============");
System.out.println("user中删除元素age:"+jedis.zrem("user", "age"));
System.out.println("user集合中的所有元素:"+jedis.zrange("user", 0, -1));
// 删除key
System.out.println("删除user键值对:"+jedis.del("user"));
}
}
操作Map
public class TestMap {
private Jedis jedis; // 获取数据库的连接,非切片客户端连接
@Before
public void setup() {
jedis = RedisUtil.getJedis();
}
// @Test
public void testAddAndUpdate() {
System.out.println("=============增或改=============");
Map<String, String> map = new HashMap<String, String>();
map.put("name", "heqing");
map.put("age", "27");
map.put("qq", "975656343");
jedis.hmset("user",map);
Iterator<String> iter=jedis.hkeys("user").iterator();
while (iter.hasNext()){
String key = iter.next();
System.out.println("user集合中的键:"+key+",值:"+jedis.hmget("user",key));
}
}
// @Test
public void testFind() {
System.out.println("=============查=============");
System.out.println("user集合中所有的键:"+jedis.hkeys("user"));//返回map对象中的所有key
System.out.println("user集合中所有的值:"+jedis.hvals("user"));//返回map对象中的所有value
//取出user中的name,执行结果:[minxr]-->注意结果是一个泛型的List
//第一个参数是存入redis中map对象的key,后面跟的是放入map中的对象的key,后面的key可以跟多个,是可变参数
List<String> rsmap = jedis.hmget("user", "name", "age", "qq");
System.out.println("user集合中name,age,qq:"+rsmap);
}
@Test
public void testDelete() {
System.out.println("=============删=============");
System.out.println("删除前的值为:"+jedis.hmget("user", "age"));
jedis.hdel("user","age");
System.out.println("删除后的值为:"+jedis.hmget("user", "age")); //因为删除了,所以返回的是null
System.out.println("user中键的个数为:"+jedis.hlen("user")); //返回key为user的键中存放的值的个数2
System.out.println("是否存在key为user:"+jedis.exists("user"));//是否存在key为user的记录 返回true
System.out.println("删除user键值对:"+jedis.del("user"));
System.out.println("是否存在key为user:"+jedis.exists("user"));//是否存在key为user的记录 返回true
}
}
操作HashMap
public class TestHashMap {
private Jedis jedis; // 获取数据库的连接,非切片客户端连接
@Before
public void setup() {
jedis = RedisUtil.getJedis();
}
// @Test
public void testAdd() {
System.out.println("=============增=============");
System.out.println("user中添加name和heqing键值对:"+jedis.hset("user", "name", "heqing"));
System.out.println("user中添加qq和975656343键值对:"+jedis.hset("user", "qq", "975656343"));
System.out.println("新增age和26的整型键值对:"+jedis.hincrBy("user", "age", 26));
System.out.println("user中的所有值:"+jedis.hvals("user"));
}
// @Test
public void testUpdate() {
System.out.println("=============改=============");
System.out.println("修改前user中的所有值:"+jedis.hvals("user"));
System.out.println("age整型键值的值增加100:"+jedis.hincrBy("user", "age", 100l));
System.out.println("修改后user中的所有值:"+jedis.hvals("user"));
}
// @Test
public void testFind() {
System.out.println("=============查=============");
System.out.println("判断name是否存在:"+jedis.hexists("user", "name"));
System.out.println("获取name对应的值:"+jedis.hget("user", "name"));
System.out.println("批量获取age和qq对应的值:"+jedis.hmget("user", "age", "qq"));
System.out.println("获取user中所有的key:"+jedis.hkeys("user"));
System.out.println("获取user中所有的value:"+jedis.hvals("user"));
}
@Test
public void HashOperate() {
System.out.println("=============删=============");
System.out.println("删除前user中的所有值:"+jedis.hvals("user"));
System.out.println("user中删除qq键值对:"+jedis.hdel("user", "qq"));
System.out.println("删除后qquser中的所有值:"+jedis.hvals("user"));
System.out.println("删除user键值对:"+jedis.del("user"));
System.out.println("删除后user中的所有值:"+jedis.hvals("user"));
}
}