Redis ⑨-Jedis | Spring Redis
Jedis
通过 Jedis 可以连接 Redis 服务器。
通过 Maven 引入 Jedis 依赖。
<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>5.2.0</version>
</dependency>
连接 Redis 服务器。
这里设置了 ssh 端口转发,将本地的 8888 端口转发到远程的 6379 端口。
还需修改 Redis 的配置文件:
- 将 bind 的地址改为 0.0.0.0
- 将 protected-mode 改为 no
public class RedisCon {public static void main(String[] args) {try (JedisPool jedisPool = new JedisPool("tcp://127.0.0.1:8888");Jedis jedis = jedisPool.getResource()) {String pong = jedis.ping(); // 测试连接System.out.println(pong);}}
}
通用命令
GET、SET
private static void getAndSet(Jedis jedis) {jedis.flushAll(); // TODO 清除所有键避免影响操作jedis.set("k1", "111");System.out.println(jedis.get("k1"));SetParams params = new SetParams(); // ? 设置额外参数params.ex(1);params.nx();jedis.set("k2", "222", params); // ? 相当于设置了 1s 过期时间和添加方式为 NX
// Thread.sleep(2000);System.out.println(jedis.get("k2"));
}
输出:
111
222 | null
EXISTS、DEL
private static void existsAndDel(Jedis jedis) {jedis.flushAll();jedis.set("k1", "111");jedis.set("k2", "111");long trueExists = jedis.exists("k1", "k2"); // ? 这里的参数为变长参数System.out.println(trueExists);long successDel = jedis.del("k2", "k3");System.out.println(successDel);
}
输出:
2
1
KEYS
private static void keys(Jedis jedis) {jedis.flushAll();jedis.set("k1", "111");jedis.set("k2", "111");jedis.set("k3", "111");jedis.set("k4", "111");Set<String> keys = jedis.keys("*");System.out.println(keys);
}
输出:
[k1, k2, k3, k4]
EXPIRE、TTL
private static void expiresAndTTL(Jedis jedis) {jedis.flushAll();jedis.set("k1", "111");jedis.expire("k1", 10);long time = jedis.ttl("k1");System.out.println(time);
}
输出:
10
type
private static void type(Jedis jedis) {jedis.flushAll();jedis.set("k1", "111");System.out.println("type:" + jedis.type("k1"));jedis.lpush("k2", "111");System.out.println("type:" + jedis.type("k2"));jedis.hset("k3", "f1", "v1");System.out.println("type:" + jedis.type("k3"));jedis.sadd("k4", "111");System.out.println("type:" + jedis.type("k4"));jedis.zadd("k5", 30, "m1");System.out.println("type:" + jedis.type("k5"));
}
输出:
type:string
type:list
type:hash
type:set
type:zset
string 类型
MSET、MGET
private static void msetAndMget(Jedis jedis) {jedis.flushAll();jedis.mset("k1", "111", "k2", "222", "k3", "你好");List<String> mgetRes = jedis.mget("k1", "k2", "k3", "k4");System.out.println(mgetRes);
}
输出:
[111, 222, 你好, null]
SETRANGE、GETRANGE
private static void setrangeAndGetrange(Jedis jedis) {jedis.flushAll();jedis.set("k1", "hello world");String getrangeRes = jedis.getrange("k1", 6, 10);System.out.println(getrangeRes);jedis.setrange("k1", 6, "redis");System.out.println(jedis.getrange("k1", 0, -1));
}
输出:
world
hello redis
APPEND
private static void append(Jedis jedis) {jedis.flushAll();jedis.set("k1", "It's MyGO");long appendRes = jedis.append("k1", "!!!!!");System.out.println(appendRes);System.out.println(jedis.get("k1"));
}
输出:
10
It's MyGO!!!!!
INCR、DECR
private static void incrAndDecr(Jedis jedis) {jedis.flushAll();jedis.set("k1", "100");long incrRes = jedis.incr("k1");System.out.println(incrRes);jedis.set("k2", "100");long decrRes = jedis.decr("k2");System.out.println(decrRes);
}
输出:
101
99
list 类型
LPUSH、LRANGE
private static void lpushAndLrange(Jedis jedis) {jedis.flushAll();jedis.lpush("k1", "111", "222", "333");List<String> lrangeRes = jedis.lrange("k1", 0, -1);System.out.println(lrangeRes);
}
输出:
[333, 222, 111]
RPUSH
private static void rpush(Jedis jedis) {jedis.flushAll();jedis.rpush("k1", "111", "222", "333");List<String> lrangeRes = jedis.lrange("k1", 0, -1);System.out.println(lrangeRes);
}
输出:
[111, 222, 333]
LPOP、RPOP
private static void lpopAndRpop(Jedis jedis) {jedis.flushAll();jedis.rpush("k1", "111", "222", "333");String res = jedis.lpop("k1");System.out.println(res);res = jedis.lpop("k1");System.out.println(res);res = jedis.lpop("k1");System.out.println(res);res = jedis.lpop("k1");System.out.println(res);jedis.rpush("k1", "111", "222", "333");res = jedis.rpop("k1");System.out.println(res);res = jedis.rpop("k1");System.out.println(res);res = jedis.rpop("k1");System.out.println(res);res = jedis.rpop("k1");System.out.println(res);
}
输出:
333
222
111
null
333
222
111
BLPOP、LLEN
private static void blpopAndLlen(Jedis jedis) {jedis.flushAll();List<String> blpopRes = jedis.blpop(100, "k1");System.out.println("key:" + blpopRes.get(0));System.out.println("val:" + blpopRes.get(1));long len = jedis.llen("k1");System.out.println(len);
}
输出:
key:k1
val:111
2
set 类型
SADD、SMEMBERS、SCARD
private static void saddAndSmembersAndScard(Jedis jedis) {jedis.flushAll();jedis.sadd("k1", "111", "222", "333");Set<String> smembersRes = jedis.smembers("k1");System.out.println(smembersRes);long len = jedis.scard("k1");System.out.println(len);
}
输出:
[111, 222, 333]
3
SISMEMBER、SPOP
private static void sismemberAndSpop(Jedis jedis) {jedis.flushAll();jedis.sadd("k1", "111", "222", "333");boolean sismemberRes = jedis.sismember("k1", "111");System.out.println(sismemberRes);String spopRes = jedis.spop("k1");System.out.println(spopRes);spopRes = jedis.spop("k1");System.out.println(spopRes);spopRes = jedis.spop("k1");System.out.println(spopRes);spopRes = jedis.spop("k1");System.out.println(spopRes);
}
输出:
true
111
222
333
null
SINTER、SINNTERSTORE
private static void sinterAndSinterstore(Jedis jedis) {jedis.flushAll();jedis.sadd("k1", "111", "222", "333");jedis.sadd("k2", "111", "222", "444");Set<String> sinterRes = jedis.sinter("k1", "k2");System.out.println(sinterRes);jedis.sinterstore("k3","k1", "k2");Set<String> res = jedis.smembers("k3");System.out.println(res);
}
输出:
[111, 222]
[111, 222]
hash 类型
HSET、HGET
private static void hsetAndHget(Jedis jedis) {jedis.flushAll();jedis.hset("k1", "f1", "111");Map<String, String> fv = Map.of("f2", "222", "f3", "333");jedis.hset("k1", fv);String hgetRes = jedis.hget("k1", "f2");System.out.println(hgetRes);
}
输出:
222
HEXISTS、HDEL
private static void hexistsAndHdel(Jedis jedis) {jedis.flushAll();Map<String, String> fv = Map.of("f1", "111", "f2", "222", "f3", "333");jedis.hset("k1", fv);boolean hexistsRes = jedis.hexists("k1", "f1");System.out.println(hexistsRes);long hdelRes = jedis.hdel("k1", "f1", "f2", "f3", "f4");System.out.println(hdelRes);
}
输出:
true
3
HKEYS、HVALS
private static void hkeysAndHvals(Jedis jedis) {jedis.flushAll();Map<String, String> fv = Map.of("f1", "111", "f2", "222", "f3", "333");jedis.hset("k1", fv);Set<String> hkeysRes = jedis.hkeys("k1");System.out.println(hkeysRes);List<String> hvalsRes = jedis.hvals("k1");System.out.println(hvalsRes);
}
输出:
[f1, f2, f3]
[111, 222, 333]
HMSET、HMGET
private static void hmsetAndHmget(Jedis jedis) {jedis.flushAll();Map<String, String> fv = Map.of("f1", "111", "f2", "222", "f3", "333");jedis.hmset("k1", fv);List<String> hmgetRes = jedis.hmget("k1", "f1", "f2", "f3", "f4");System.out.println(hmgetRes);
}
输出:
[111, 222, 333, null]
Zset 类型
ZADD、ZRANGE
private static void zaddAndZrange(Jedis jedis) {jedis.flushAll();jedis.zadd("k1", 10.0, "zhangsan");Map<String, Double> ms = Map.of("lishi", 20.0, "wangwu", 30.0);jedis.zadd("k1", ms);List<String> zrangeRes = jedis.zrange("k1", 0, -1);System.out.println(zrangeRes);List<Tuple> membersWithScores = jedis.zrangeWithScores("k1", 0, -1);System.out.println(membersWithScores);System.out.println(membersWithScores.get(0).getElement());System.out.println(membersWithScores.get(0).getScore());
}
输出:
[zhangsan, lishi, wangwu]
[[zhangsan,10.0], [lishi,20.0], [wangwu,30.0]]
zhangsan
10.0
ZCARD、ZREM
private static void zcardAndZrem(Jedis jedis) {jedis.flushAll();Map<String, Double> ms = Map.of("zhangsan", 10.0, "lishi", 20.0, "wangwu", 30.0);jedis.zadd("k1", ms);long zcardRes = jedis.zcard("k1");System.out.println(zcardRes);long zremRes = jedis.zrem("k1", "zhangsan", "lishi", "zhaoliu");System.out.println(zremRes);
}
输出:
3
2
ZSCORE、ZRANK
private static void zscoreAndZrank(Jedis jedis) {jedis.flushAll();Map<String, Double> ms = Map.of("zhangsan", 10.0, "lishi", 20.0, "wangwu", 30.0);jedis.zadd("k1", ms);Double zscoreRes = jedis.zscore("k1", "zhangsan");System.out.println(zscoreRes);Long zrankRes = jedis.zrank("k1", "lishi");System.out.println(zrankRes);
}
输出:
10.0
1
Spring Boot 集成 Redis
在创建 spring-boot 项目时,选择 Redis 依赖。
在 application.yml 中配置 Redis 连接信息。
这里配置了端口转发,正常输入服务器的公网 IP 地址和 6379 端口即可。
spring:data:redis:port: 8888host: 127.0.0.1
string 类型
@RestController
public class StringController {@AutowiredStringRedisTemplate redisTemplate;@GetMapping("/string")public String string() {// TODO 先清除数据库redisTemplate.execute((RedisConnection connection) -> {connection.flushAll();return null;});redisTemplate.opsForValue().set("k1", "111");Map<String, String> kv = Map.of("k2", "222", "k3", "333");redisTemplate.opsForValue().multiSet(kv);return redisTemplate.opsForValue().get("k1");}
}
输出:
111
list 类型
@RestController
public class ListController {@AutowiredStringRedisTemplate redisTemplate;@GetMapping("/list")public List<String> list() {redisTemplate.execute((RedisConnection connection) -> {connection.flushAll();return null;});redisTemplate.opsForList().leftPush("k1", "111");redisTemplate.opsForList().leftPushAll("k1", "222", "333", "444");redisTemplate.opsForList().leftPop("k1");return redisTemplate.opsForList().range("k1", 0, -1);}
}
输出:
["333","222","111"
]
set 类型
@RestController
public class SetController {@AutowiredStringRedisTemplate redisTemplate;@GetMapping("/set")public Set<String> set() {redisTemplate.execute((RedisConnection connection) -> {connection.flushAll();return null;});redisTemplate.opsForSet().add("k1", "111", "222", "333", "444");Long size = redisTemplate.opsForSet().size("k1");System.out.println("size:" + size);Boolean isMember = redisTemplate.opsForSet().isMember("k1", "222");System.out.println("isMember:" + isMember);Long remove = redisTemplate.opsForSet().remove("k1", "444");System.out.println("remove:" + remove);return redisTemplate.opsForSet().members("k1");}
}
输出:
size:3
isMember:true
remove:1
["111","222","333"
]
hash 类型
@RestController
public class HashController {@AutowiredStringRedisTemplate redisTemplate;@GetMapping("/hash")public Map<Object, Object> hash() {redisTemplate.execute((RedisConnection connection) -> {connection.flushAll();return null;});redisTemplate.opsForHash().put("k1", "f1", "v1");Map<String, String> fv = Map.of("f2", "v2", "f3", "v3", "f4", "v4");redisTemplate.opsForHash().putAll("k1", fv);Long size = redisTemplate.opsForHash().size("k1");System.out.println("size:" + size);Boolean hasKey = redisTemplate.opsForHash().hasKey("k1", "f1");System.out.println("hasKey:" + hasKey);Long delete = redisTemplate.opsForHash().delete("k1", "f4");System.out.println("delete:" + delete);return redisTemplate.opsForHash().entries("k1");}
}
输出:
size:4
hasKey:true
delete:1
{"f1": "v1","f3": "v3","f2": "v2"
}
zset 类型
@RestController
public class ZsetController {@AutowiredStringRedisTemplate redisTemplate;@GetMapping("/zset")public Set<ZSetOperations.TypedTuple<String>> zset() {redisTemplate.execute((RedisConnection connection) -> {connection.flushAll();return null;});redisTemplate.opsForZSet().add("k1", "zhangsan", 10.0);redisTemplate.opsForZSet().add("k1", "lishi", 20.0);redisTemplate.opsForZSet().add("k1", "wangwu", 30.0);redisTemplate.opsForZSet().add("k1", "zhaoliu", 40.0);Long remove = redisTemplate.opsForZSet().remove("k1", "wangwu");System.out.println("remove:" + remove);Long rank = redisTemplate.opsForZSet().rank("k1", "lishi");System.out.println("rank:" + rank);Long size = redisTemplate.opsForZSet().size("k1");System.out.println("size:" + size);return redisTemplate.opsForZSet().rangeWithScores("k1", 0, -1);}
}
输出:
remove:1
rank:1
size:3
[lishi=20.0, zhangsan=10.0, zhaoliu=40.0]
[{"value": "zhangsan","score": 10.0},{"value": "lishi","score": 20.0},{"value": "zhaoliu","score": 40.0}
]