阅读量:0
笔记内容来自B站博主《遇见狂神说》:Redis视频链接
Jedis 是一个用于 Java 的 Redis 客户端库,它提供了一组 API 用于与 Redis 数据库进行交互。Redis 是一个高性能的键值存储数据库,广泛用于缓存、消息队列等场景。Jedis 使得 Java 开发者能够方便地与 Redis 进行通信,执行 Redis 命令,并操作 Redis 数据结构。
1、简单了解Jedis
SpringBoot 引入 Jedis
pom.xml
<dependencies> <!-- jedis --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>4.2.3</version> </dependency> <!-- fastjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>2.0.49</version> </dependency> </dependencies>
Jedis源码
可以进入 Jedis 源码看一下,Jedis 构造函数还是挺多的,一般我们用的也就是ip+端口号。jedis.class
2、代码测试
连接数据库
package oldfe.study; import redis.clients.jedis.Jedis; public class Main { public static void main(String[] args) { // 1、 new Jedis 对象 Jedis jedis = new Jedis("127.0.0.1", 6379); // 2、如果设置密码,需要 auth方法进行密码认证 jedis.auth("123456"); // 3、ping System.out.println(jedis.ping()); jedis.close(); // 关闭连接 } }
输出:
返回表示 PONG 已经连接上
常用 API
基本API
package oldfe.study; import redis.clients.jedis.Jedis; import java.util.Set; public class Main { public static void main(String[] args) { Jedis jedis = new Jedis("127.0.0.1", 6379); jedis.auth("123456"); System.out.printf("清空全部数据库:%s %n", jedis.flushAll()); System.out.printf("清空当前数据库:%s %n", jedis.flushDB()); System.out.printf("判断某个键是否存在:%s %n", jedis.exists("name")); System.out.printf("新增<'name', 'OldFe'>键值对::%s %n", jedis.set("name", "OldFe")); System.out.printf("新增<'age', '16'>键值对::%s %n", jedis.set("age", "16")); System.out.printf("在集合的键值列表头部插入一个值:%s %n", jedis.lpush("listKey", "listValue")); System.out.printf("系统中所有的键如下:"); Set<String> keys = jedis.keys("*"); System.out.println(keys); System.out.printf("删除键age:%s %n", jedis.del("age")); System.out.printf("判断键age是否存在: %s %n", jedis.exists("age")); System.out.printf("判断键name所储存的值的类型: %s %n", jedis.type("name")); System.out.printf("判断键listKey所储存的值的类型: %s %n", jedis.type("listKey")); System.out.printf("随机返回可以空间的一个: %s %n", jedis.randomKey()); System.out.printf("重命名键name为name1: %s %n", jedis.rename("name", "name1")); System.out.printf("返回键name1的值: %s %n", jedis.get("name1")); System.out.printf("按索引查询第1个数据库: %s %n", jedis.select(0)); // Redis 一共有16个数据库(索引下标:0-15) System.out.printf("返回当前数据库的键: %s %n", jedis.keys("*")); System.out.printf("返回当前数据库键的数目: %s %n", jedis.dbSize()); } } // 输出: 清空全部数据库:OK 清空当前数据库:OK 判断某个键是否存在:false 新增<'name', 'OldFe'>键值对::OK 新增<'age', '16'>键值对::OK 在集合的键值列表头部插入一个值:1 系统中所有的键如下:[name, listKey, age] 删除键age:1 判断键age是否存在: false 判断键name所储存的值的类型: string 判断键listKey所储存的值的类型: list 随机返回可以空间的一个: listKey 重命名键name为name1: OK 返回键name1的值: OldFe 按索引查询第1个数据库: OK 返回当前数据库的键: [name1, listKey] 返回当前数据库键的数目: 2
字符串 String
package oldfe.study; import redis.clients.jedis.Jedis; import java.util.concurrent.TimeUnit; public class TestString { public static void main(String[] args) { Jedis jedis = new Jedis("127.0.0.1", 6379); jedis.auth("123456"); jedis.flushDB(); System.out.println("===========增加数据==========="); System.out.println(jedis.set("key1","value1")); System.out.println(jedis.set("key2","value2")); System.out.println(jedis.set("key3", "value3")); System.out.println("删除键key2:"+jedis.del("key2")); System.out.println("获取键key2:"+jedis.get("key2")); System.out.println("修改key1:"+jedis.set("key1", "value1Changed")); System.out.println("获取key1的值:"+jedis.get("key1")); System.out.println("在key3后面加入值:"+jedis.append("key3", "End")); System.out.println("key3的值:"+jedis.get("key3")); System.out.println("增加多个键值对:"+jedis.mset("key01","value01","key02","value02","key03","value03")); System.out.println("获取多个键值对:"+jedis.mget("key01","key02","key03")); System.out.println("获取多个键值对:"+jedis.mget("key01","key02","key03","key04")); System.out.println("删除多个键值对:"+jedis.del("key01","key02")); System.out.println("获取多个键值对:"+jedis.mget("key01","key02","key03")); jedis.flushDB(); System.out.println("===========新增键值对防止覆盖原先值=============="); System.out.println(jedis.setnx("key1", "value1")); System.out.println(jedis.setnx("key2", "value2")); System.out.println(jedis.setnx("key2", "value2-new")); System.out.println(jedis.get("key1")); System.out.println(jedis.get("key2")); System.out.println("===========新增键值对并设置有效时间============="); System.out.println(jedis.setex("key3", 2, "value3")); System.out.println(jedis.get("key3")); try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(jedis.get("key3")); System.out.println("===========获取原值,更新为新值=========="); System.out.println(jedis.getSet("key2", "key2GetSet")); System.out.println(jedis.get("key2")); System.out.println("获得key2的值的字串:"+jedis.getrange("key2", 2, 4)); } } // 输出: ===========增加数据=========== OK OK OK 删除键key2:1 获取键key2:null 修改key1:OK 获取key1的值:value1Changed 在key3后面加入值:9 key3的值:value3End 增加多个键值对:OK 获取多个键值对:[value01, value02, value03] 获取多个键值对:[value01, value02, value03, null] 删除多个键值对:2 获取多个键值对:[null, null, value03] ===========新增键值对防止覆盖原先值============== 1 1 0 value1 value2 ===========新增键值对并设置有效时间============= OK value3 null ===========获取原值,更新为新值========== value2 key2GetSet 获得key2的值的字串:y2G
列表 List
package oldfe.study; import redis.clients.jedis.Jedis; public class TestList { public static void main(String[] args) { Jedis jedis = new Jedis("127.0.0.1", 6379); jedis.auth("123456"); jedis.flushDB(); System.out.println("===========添加一个list==========="); jedis.lpush("collections", "ArrayList", "Vector", "Stack", "HashMap", "WeakHashMap", "LinkedHashMap"); jedis.lpush("collections", "HashSet"); jedis.lpush("collections", "TreeSet"); jedis.lpush("collections", "TreeMap"); System.out.println("collections的内容:"+jedis.lrange("collections", 0, -1));//-1代表倒数第一个元素,-2代表倒数第二个元素,end为-1表示查询全部 System.out.println("collections区间0-3的元素:"+jedis.lrange("collections",0,3)); System.out.println("==============================="); // 删除列表指定的值 ,第二个参数为删除的个数(有重复时),后add进去的值先被删,类似于出栈 System.out.println("删除指定元素个数:"+jedis.lrem("collections", 2, "HashMap")); System.out.println("collections的内容:"+jedis.lrange("collections", 0, -1)); System.out.println("删除下表0-3区间之外的元素:"+jedis.ltrim("collections", 0, 3)); System.out.println("collections的内容:"+jedis.lrange("collections", 0, -1)); System.out.println("collections列表出栈(左端):"+jedis.lpop("collections")); System.out.println("collections的内容:"+jedis.lrange("collections", 0, -1)); System.out.println("collections添加元素,从列表右端,与lpush相对应:"+jedis.rpush("collections", "EnumMap")); System.out.println("collections的内容:"+jedis.lrange("collections", 0, -1)); System.out.println("collections列表出栈(右端):"+jedis.rpop("collections")); System.out.println("collections的内容:"+jedis.lrange("collections", 0, -1)); System.out.println("修改collections指定下标1的内容:"+jedis.lset("collections", 1, "LinkedArrayList")); System.out.println("collections的内容:"+jedis.lrange("collections", 0, -1)); System.out.println("==============================="); System.out.println("collections的长度:"+jedis.llen("collections")); System.out.println("获取collections下标为2的元素:"+jedis.lindex("collections", 2)); System.out.println("==============================="); jedis.lpush("sortedList", "3","6","2","0","7","4"); System.out.println("sortedList排序前:"+jedis.lrange("sortedList", 0, -1)); System.out.println(jedis.sort("sortedList")); System.out.println("sortedList排序后:"+jedis.lrange("sortedList", 0, -1)); } } // 输出: ===========添加一个list=========== collections的内容:[TreeMap, TreeSet, HashSet, LinkedHashMap, WeakHashMap, HashMap, Stack, Vector, ArrayList] collections区间0-3的元素:[TreeMap, TreeSet, HashSet, LinkedHashMap] =============================== 删除指定元素个数:1 collections的内容:[TreeMap, TreeSet, HashSet, LinkedHashMap, WeakHashMap, Stack, Vector, ArrayList] 删除下表0-3区间之外的元素:OK collections的内容:[TreeMap, TreeSet, HashSet, LinkedHashMap] collections列表出栈(左端):TreeMap collections的内容:[TreeSet, HashSet, LinkedHashMap] collections添加元素,从列表右端,与lpush相对应:4 collections的内容:[TreeSet, HashSet, LinkedHashMap, EnumMap] collections列表出栈(右端):EnumMap collections的内容:[TreeSet, HashSet, LinkedHashMap] 修改collections指定下标1的内容:OK collections的内容:[TreeSet, LinkedArrayList, LinkedHashMap] =============================== collections的长度:3 获取collections下标为2的元素:LinkedHashMap =============================== sortedList排序前:[4, 7, 0, 2, 6, 3] [0, 2, 3, 4, 6, 7] sortedList排序后:[4, 7, 0, 2, 6, 3]
集合 Set
package oldfe.study; import redis.clients.jedis.Jedis; public class TestSet { public static void main(String[] args) { Jedis jedis = new Jedis("127.0.0.1", 6379); jedis.auth("123456"); jedis.flushDB(); System.out.println("============向集合中添加元素(不重复)============"); System.out.println(jedis.sadd("eleSet", "e1","e2","e4","e3","e0","e8","e7","e5")); System.out.println(jedis.sadd("eleSet", "e6")); System.out.println(jedis.sadd("eleSet", "e6")); System.out.println("eleSet的所有元素为:"+jedis.smembers("eleSet")); System.out.println("删除一个元素e0:"+jedis.srem("eleSet", "e0")); System.out.println("eleSet的所有元素为:"+jedis.smembers("eleSet")); System.out.println("删除两个元素e7和e6:"+jedis.srem("eleSet", "e7","e6")); System.out.println("eleSet的所有元素为:"+jedis.smembers("eleSet")); System.out.println("随机的移除集合中的一个元素:"+jedis.spop("eleSet")); System.out.println("随机的移除集合中的一个元素:"+jedis.spop("eleSet")); System.out.println("eleSet的所有元素为:"+jedis.smembers("eleSet")); System.out.println("eleSet中包含元素的个数:"+jedis.scard("eleSet")); System.out.println("e3是否在eleSet中:"+jedis.sismember("eleSet", "e3")); System.out.println("e1是否在eleSet中:"+jedis.sismember("eleSet", "e1")); System.out.println("e1是否在eleSet中:"+jedis.sismember("eleSet", "e5")); System.out.println("================================="); System.out.println(jedis.sadd("eleSet1", "e1","e2","e4","e3","e0","e8","e7","e5")); System.out.println(jedis.sadd("eleSet2", "e1","e2","e4","e3","e0","e8")); System.out.println("将eleSet1中删除e1并存入eleSet3中:"+jedis.smove("eleSet1", "eleSet3", "e1"));//移到集合元素 System.out.println("将eleSet1中删除e2并存入eleSet3中:"+jedis.smove("eleSet1", "eleSet3", "e2")); System.out.println("eleSet1中的元素:"+jedis.smembers("eleSet1")); System.out.println("eleSet3中的元素:"+jedis.smembers("eleSet3")); System.out.println("============集合运算================="); System.out.println("eleSet1中的元素:"+jedis.smembers("eleSet1")); System.out.println("eleSet2中的元素:"+jedis.smembers("eleSet2")); System.out.println("eleSet1和eleSet2的交集:"+jedis.sinter("eleSet1","eleSet2")); System.out.println("eleSet1和eleSet2的并集:"+jedis.sunion("eleSet1","eleSet2")); System.out.println("eleSet1和eleSet2的差集:"+jedis.sdiff("eleSet1","eleSet2"));//eleSet1中有,eleSet2中没有 jedis.sinterstore("eleSet4","eleSet1","eleSet2");//求交集并将交集保存到dstkey的集合 System.out.println("eleSet4中的元素:"+jedis.smembers("eleSet4")); } } // 输出: ============向集合中添加元素(不重复)============ 8 1 0 eleSet的所有元素为:[e5, e6, e7, e8, e0, e1, e2, e3, e4] 删除一个元素e0:1 eleSet的所有元素为:[e5, e6, e7, e8, e1, e2, e3, e4] 删除两个元素e7和e6:2 eleSet的所有元素为:[e5, e8, e1, e2, e3, e4] 随机的移除集合中的一个元素:e5 随机的移除集合中的一个元素:e1 eleSet的所有元素为:[e2, e3, e4, e8] eleSet中包含元素的个数:4 e3是否在eleSet中:true e1是否在eleSet中:false e1是否在eleSet中:false ================================= 8 6 将eleSet1中删除e1并存入eleSet3中:1 将eleSet1中删除e2并存入eleSet3中:1 eleSet1中的元素:[e5, e7, e0, e8, e3, e4] eleSet3中的元素:[e1, e2] ============集合运算================= eleSet1中的元素:[e5, e7, e0, e8, e3, e4] eleSet2中的元素:[e0, e8, e1, e2, e3, e4] eleSet1和eleSet2的交集:[e3, e4, e0, e8] eleSet1和eleSet2的并集:[e5, e7, e0, e8, e1, e2, e3, e4] eleSet1和eleSet2的差集:[e7, e5] eleSet4中的元素:[e3, e4, e0, e8]
哈希 Hash
package oldfe.study; import redis.clients.jedis.Jedis; import java.util.HashMap; import java.util.Map; public class TestHash { public static void main(String[] args) { Jedis jedis = new Jedis("127.0.0.1", 6379); jedis.auth("123456"); jedis.flushDB(); Map<String,String> map = new HashMap<String,String>(); map.put("key1","value1"); map.put("key2","value2"); map.put("key3","value3"); map.put("key4","value4"); //添加名称为hash(key)的hash元素 jedis.hmset("hash",map); //向名称为hash的hash中添加key为key5,value为value5元素 jedis.hset("hash", "key5", "value5"); System.out.println("散列hash的所有键值对为:"+jedis.hgetAll("hash"));//return Map<String,String> System.out.println("散列hash的所有键为:"+jedis.hkeys("hash"));//return Set<String> System.out.println("散列hash的所有值为:"+jedis.hvals("hash"));//return List<String> System.out.println("将key6保存的值加上一个整数,如果key6不存在则添加key6:"+jedis.hincrBy("hash", "key6", 6)); System.out.println("散列hash的所有键值对为:"+jedis.hgetAll("hash")); System.out.println("将key6保存的值加上一个整数,如果key6不存在则添加key6:"+jedis.hincrBy("hash", "key6", 3)); System.out.println("散列hash的所有键值对为:"+jedis.hgetAll("hash")); System.out.println("删除一个或者多个键值对:"+jedis.hdel("hash", "key2")); System.out.println("散列hash的所有键值对为:"+jedis.hgetAll("hash")); System.out.println("散列hash中键值对的个数:"+jedis.hlen("hash")); System.out.println("判断hash中是否存在key2:"+jedis.hexists("hash","key2")); System.out.println("判断hash中是否存在key3:"+jedis.hexists("hash","key3")); System.out.println("获取hash中的值:"+jedis.hmget("hash","key3")); System.out.println("获取hash中的值:"+jedis.hmget("hash","key3","key4")); } } // 输出: 散列hash的所有键值对为:{key1=value1, key2=value2, key5=value5, key3=value3, key4=value4} 散列hash的所有键为:[key1, key2, key5, key3, key4] 散列hash的所有值为:[value1, value2, value3, value4, value5] 将key6保存的值加上一个整数,如果key6不存在则添加key6:6 散列hash的所有键值对为:{key1=value1, key2=value2, key5=value5, key6=6, key3=value3, key4=value4} 将key6保存的值加上一个整数,如果key6不存在则添加key6:9 散列hash的所有键值对为:{key1=value1, key2=value2, key5=value5, key6=9, key3=value3, key4=value4} 删除一个或者多个键值对:1 散列hash的所有键值对为:{key1=value1, key5=value5, key6=9, key3=value3, key4=value4} 散列hash中键值对的个数:5 判断hash中是否存在key2:false 判断hash中是否存在key3:true 获取hash中的值:[value3] 获取hash中的值:[value3, value4]