Redis 笔记之 Java 操作 Redis(Jedis)

    技术2024-09-30  61

    Java 操作 Redis

    环境准备引入依赖创建 jedis 对象 操作 Key 相关 API操作 String 相关 API操作 List 相关 API操作 Set 的相关 API操作 ZSet 相关 API操作 Hash 相关 API

    环境准备

    引入依赖

    <!--引入jedis连接依赖--> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency>

    创建 jedis 对象

    Centos 7 关闭防火墙:

    systemctl stop firewalld.service

    开启远程连接:详见 Redis入门之Redis安装、配置及常用指令

    /** * 测试 Redis 连接 */ public class TestRedis { public static void main(String[] args) { // 1.创建 jedis 对象 // redis服务必须关闭防火墙 // redis服务必须开始远程连接 Jedis jedis = new Jedis("192.168.3.65", "6379"); // 2.执行相关操作 jedis.select(0); // 选择操作的数据库, 默认0号 // ...... // 3.释放资源 jedis.close(); } }

    操作 Key 相关 API

    DEL 指令

    语法 : DEL key [key ...]作用 : 删除给定的一个或多个 key,不存在的 key 会被忽略。可用版本: >= 1.0.0返回值: 被删除 key 的数量。

    EXISTS 指令

    语法: EXISTS key作用: 检查给定 key 是否存在。可用版本: >= 1.0.0返回值: 若 key 存在,返回1 ,否则返回0。

    EXPIRE 指令

    语法: EXPIRE key seconds作用: 为给定 key 设置生存时间(秒),当 key 过期时(生存时间为 0),它会被自动删除。可用版本: >= 1.0.0时间复杂度: O(1)返回值:设置成功返回 1 。

    KEYS 指令

    语法 : KEYS pattern作用 : 查找所有符合给定模式 pattern 的 key 。语法: KEYS *:匹配数据库中所有 key 。 KEYS h?llo:匹配 hello ,hallo 和 hxllo 等。 KEYS h*llo:匹配 hllo 和 heeeeello 等。 KEYS h[ae]llo: 匹配 hello 和 hallo ,但不匹配 hillo 。特殊符号用 \ 隔开可用版本: >= 1.0.0返回值: 符合给定模式的 key 列表。

    MOVE 指令

    语法 : MOVE key db作用 : 将当前数据库的 key 移动到给定的数据库 db 当中。可用版本: >= 1.0.0返回值: 移动成功返回 1 ,失败则返回 0 。

    PEXPIRE 指令

    语法 : PEXPIRE key milliseconds作用 : 这个命令和 EXPIRE 命令的作用类似,但是它以 毫秒 为单位设置 key 的生存时间 (EXPIRE 以秒为单位)可用版本: >= 2.6.0时间复杂度: O(1)返回值:设置成功,返回1。key 不存在或设置失败,返回0

    PEXPIREAT 指令

    语法 : PEXPIREAT key milliseconds-timestamp作用 : 这个命令和 EXPIREAT 命令类似,但它以 毫秒 为单位设置 key 的过期 unix 时间戳(EXPIREAT 以秒为单位)可用版本: >= 2.6.0返回值:如果生存时间设置成功,返回 1 。当 key 不存在或没办法设置生存时间时,返回 0 。 (查看EXPIRE 命令获取更多信息)

    TTL 指令

    语法 : TTL key作用 : 以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)。可用版本: >= 1.0.0返回值: 当 key 不存在时,返回 -2 。 当 key 存在但没有设置剩余生存时间时,返回 -1 。 否则,以秒为单位,返回 key 的剩余生存时间。Note : Redis 2.8 以前,当 key 不存在,或者 key 没有设置剩余生存时间时,命令都返回 -1 。

    PTTL 指令

    语法 : PTTL key作用 : 这个命令类似于 TTL 命令,但它以毫秒为单位返回 key 的剩余生存时间 (TTL 以秒为单位)可用版本: >= 2.6.0返回值: 当 key 不存在时,返回 -2 。当 key 存在但没有设置剩余生存时间时,返回 -1 。否则,以毫秒为单位,返回 key 的剩余生存时间。注意 : Redis 2.8 以前,当 key 不存在,或者 key 没有设置剩余生存时间时,命令都返回 -1 。

    RANDOMKEY 指令

    语法 : RANDOMKEY作用 : 从当前数据库中随机返回(不删除) 一个 key 。可用版本: >= 1.0.0返回值:当数据库不为空时,返回一个 key 。当数据库为空时,返回 nil 。

    RENAME 指令

    语法 : RENAME key newkey作用 : 将 key 改名为 newkey 。 当 key 和 newkey 相同,或者 key 不存在时,返回一个错误。 当 newkey 已经存在时,RENAME 命令将覆盖旧值。可用版本: >= 1.0.0返回值: 改名成功时提示OK ,失败时候返回一个错误。

    TYPE 指令

    语法 : TYPE key作用 : 返回 key 所储存的值的类型。可用版本: >= 1.0.0返回值: none:key 不存在 string:字符串 list:列表 set:集合 zset:有序集 hash:哈希表 public class TestKeys { private Jedis jedis; @Before public void before() { // 连接开启了redis服务的虚拟机 jedis = new Jedis("192.168.3.65", 6379); } @After public void after() { jedis.close(); } @Test public void testKeys() { // 删除一个key jedis.del("name"); // 删除多个key jedis.del("name", "age"); // 设置一个key jedis.set("age", "hello"); // 判断一个key是否存在 Boolean name = jedis.exists("name"); System.out.println(name); // 设置一个key超时时间 Long age = jedis.expire("age", 100); System.out.println(age); // 获取一个key超时时间 Long ttl = jedis.ttl("age"); System.out.println(ttl); // 随机获取一个key String s = jedis.randomKey(); // 修改key名称 jedis.rename("age", "newage"); // 查看对应值的类型 String type1 = jedis.type("name"); System.out.println(type1); String type2 = jedis.type("maps"); System.out.println(type2); } }

    操作 String 相关 API

    命令说明set设置一个key/valueget根据key获得对应的valuemset一次设置多个key valuemget一次获得多个key的valuegetset获得原始key的值,同时设置新值strlen获得对应key存储value的长度append为对应key的value追加内容getrange 索引0开始截取value的内容setex设置一个key存活的有效期(秒)psetex设置一个key存活的有效期(毫秒)setnx存在不做任何操作,不存在添加msetnx原子操作(只要有一个存在不做任何操作)可以同时设置多个key,只要有一个存在都不保存decr进行数值类型的-1操作decrby根据提供的数据进行减法操作incr进行数值类型的+1操作incrby根据提供的数据进行加法操作incrbyfloat根据提供的数据加入浮点数 public class TestString { private Jedis jedis; @Before public void before() { jedis = new Jedis("192.168.3.65", 6379); } @After public void after() { jedis.close(); } @Test public void testString() { jedis.set("name", "zhenyu"); // set String name = jedis.get("name"); // get System.out.println(name); jedis.mset("content", "好人", "address", "苏州市"); // mset List<String> mget = jedis.mget("name", "content", "address"); // mget mget.forEach(v -> System.out.println("v = " + v)); String set = jedis.getSet("name", "yusael"); System.out.println(set); // ... } }

    操作 List 相关 API

    命令说明lpush将某个值加入到一个key列表头部lpushx同lpush,但是必须要保证这个key存在rpush将某个值加入到一个key列表末尾rpushx同rpush,但是必须要保证这个key存在lpop返回和移除列表左边的第一个元素rpop返回和移除列表右边的第一个元素lrange获取某一个下标区间内的元素llen获取列表元素个数lset设置某一个指定索引的值(索引必须存在)lindex获取某一个指定索引位置的元素lrem删除重复元素ltrim保留列表中特定区间内的元素linsert在某一个元素之前,之后插入新元素 public class TestList { private Jedis jedis; @Before public void before() { jedis = new Jedis("192.168.3.65", 6379); } @After public void after() { jedis.close(); } @Test public void testList() { jedis.flushDB(); // 清除当前数据库 jedis.lpush("names1", "1", "2", "3", "4", "5"); // lpush jedis.rpush("names1", "a", "b", "c", "d", "e"); // rpush List<String> names1 = jedis.lrange("names1", 0, -1); names1.forEach(v -> System.out.println("name = " + v)); String name = jedis.lpop("names1"); // lpop rpop System.out.println(name); // 5 System.out.println(jedis.llen("names1")); // llen // names1 中 2 左边插入一个 world Long linsert = jedis.linsert("names1", BinaryClient.LIST_POSITION.BEFORE, "2", "world");// linsert System.out.println("linsert: " + linsert); names1 = jedis.lrange("names1", 0, -1); names1.forEach(v -> System.out.println("name = " + v)); // ... } }

    操作 Set 的相关 API

    命令说明sadd为集合添加元素smembers显示集合中所有元素 无序scard返回集合中元素的个数spop随机返回一个元素 并将元素在集合中删除smove从一个集合中向另一个集合移动元素 必须是同一种类型srem从集合中删除一个元素sismember判断一个集合中是否含有这个元素srandmember随机返回元素sdiff去掉第一个集合中其它集合含有的相同元素sinter求交集sunion求和集 public class TestSet { private Jedis jedis; @Before public void before() { jedis = new Jedis("192.168.3.65", 6379); } @After public void after() { jedis.close(); } @Test public void testSet() { jedis.sadd("names","zhangsan", "lisi"); Set<String> names = jedis.smembers("names"); names.forEach(v -> System.out.println("v = " + v)); Boolean sismember = jedis.sismember("names", "zhenyu"); System.out.println(sismember); } }

    操作 ZSet 相关 API

    命令说明zadd添加一个有序集合元素zcard返回集合的元素个数zrange 升序 zrevrange 降序返回一个范围内的元素zrangebyscore按照分数查找一个范围内的元素zrank返回排名zrevrank倒序排名zscore显示某一个元素的分数zrem移除某一个元素zincrby给某个特定元素加分 public class TestZSet { private Jedis jedis; @Before public void before() { jedis = new Jedis("192.168.3.65", 6379); } @After public void after() { jedis.close(); } @Test public void testZSet() { jedis.zadd("zset", 8, "张三"); jedis.zadd("zset", 5, "李四"); jedis.zadd("zset", 7, "王五"); jedis.zadd("zset", 2, "赵六"); jedis.zadd("zset", 33, "Win7"); jedis.zadd("zset", 6, "Win8"); jedis.zadd("zset", 77, "Win9"); Set<String> names = jedis.zrange("zset", 0, -1); names.forEach(v -> System.out.println("v = " + v +", zscore = " + jedis.zscore("zset", v))); Long zcard = jedis.zcard("zset"); System.out.println(zcard); names = jedis.zrangeByScore("zset", "0", "100", 0, 5); names.forEach(v -> System.out.println("v = " + v +", zscore = " + jedis.zscore("zset", v))); } }

    操作 Hash 相关 API

    命令说明hset设置一个key/value对hget获得一个key对应的valuehgetall获得所有的key/value对hdel删除某一个key/value对hexists判断一个key是否存在hkeys获得所有的keyhvals获得所有的valuehmset设置多个key/valuehmget获得多个key的valuehsetnx设置一个不存在的key的值hincrby为value进行加法运算hincrbyfloat为value加入浮点值 public class TestHash { private Jedis jedis; @Before public void before() { jedis = new Jedis("192.168.3.65", 6379); } @After public void after() { jedis.close(); } @Test public void testHash() { jedis.hset("maps","name","zhangsan"); Map<String, String> map = new HashMap<>(); map.put("age", "12"); map.put("content", "好人"); jedis.hmset("maps", map); String maps = jedis.hget("maps", "name"); System.out.println(maps); Map<String, String> all = jedis.hgetAll("maps"); all.forEach((k, v) -> System.out.println("k = " + k + ", v = " + v)); } }
    Processed: 0.010, SQL: 9