Redis ⑨-Jedis | Spring Redis

Jedis

通过 Jedis 可以连接 Redis 服务器。

通过 Maven 引入 Jedis 依赖。

xml 复制代码
<!-- 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 的配置文件:

  1. 将 bind 的地址改为 0.0.0.0
  2. 将 protected-mode 改为 no
Java 复制代码
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

Java 复制代码
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"));
}

输出:

bash 复制代码
111
222 | null

EXISTS、DEL

java 复制代码
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);
}

输出:

bash 复制代码
2
1

KEYS

java 复制代码
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);
}

输出:

bash 复制代码
[k1, k2, k3, k4]

EXPIRE、TTL

java 复制代码
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);
}

输出:

bash 复制代码
10

type

java 复制代码
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"));
}

输出:

bash 复制代码
type:string
type:list
type:hash
type:set
type:zset

string 类型

MSET、MGET

java 复制代码
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);
}

输出:

bash 复制代码
[111, 222, 你好, null]

SETRANGE、GETRANGE

java 复制代码
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));
}

输出:

bash 复制代码
world
hello redis

APPEND

java 复制代码
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"));
}

输出:

bash 复制代码
10
It's MyGO!!!!!

INCR、DECR

java 复制代码
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);
}

输出:

bash 复制代码
101
99

list 类型

LPUSH、LRANGE

java 复制代码
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);
}

输出:

bash 复制代码
[333, 222, 111]

RPUSH

java 复制代码
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);
}

输出:

bash 复制代码
[111, 222, 333]

LPOP、RPOP

java 复制代码
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);
}

输出:

bash 复制代码
333
222
111
null
333
222
111

BLPOP、LLEN

java 复制代码
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);
}

输出:

bash 复制代码
key:k1
val:111
2

set 类型

SADD、SMEMBERS、SCARD

java 复制代码
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);
}

输出:

bash 复制代码
[111, 222, 333]
3

SISMEMBER、SPOP

java 复制代码
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);
}

输出:

bash 复制代码
true
111
222
333
null

SINTER、SINNTERSTORE

java 复制代码
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);
}

输出:

bash 复制代码
[111, 222]
[111, 222]

hash 类型

HSET、HGET

java 复制代码
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);
}

输出:

bash 复制代码
222

HEXISTS、HDEL

java 复制代码
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);
}

输出:

bash 复制代码
true
3

HKEYS、HVALS

java 复制代码
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);
}

输出:

bash 复制代码
[f1, f2, f3]
[111, 222, 333]

HMSET、HMGET

java 复制代码
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);
}

输出:

bash 复制代码
[111, 222, 333, null]

Zset 类型

ZADD、ZRANGE

java 复制代码
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());
}

输出:

bash 复制代码
[zhangsan, lishi, wangwu]
[[zhangsan,10.0], [lishi,20.0], [wangwu,30.0]]
zhangsan
10.0

ZCARD、ZREM

java 复制代码
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);
}

输出:

bash 复制代码
3
2

ZSCORE、ZRANK

java 复制代码
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);
}

输出:

bash 复制代码
10.0
1

Spring Boot 集成 Redis

在创建 spring-boot 项目时,选择 Redis 依赖。

在 application.yml 中配置 Redis 连接信息。

这里配置了端口转发,正常输入服务器的公网 IP 地址和 6379 端口即可。

yaml 复制代码
spring:
  data:
    redis:
      port: 8888
      host: 127.0.0.1

string 类型

Java 复制代码
@RestController
public class StringController {
    @Autowired
    StringRedisTemplate 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");
    }
}

输出:

bash 复制代码
111

list 类型

java 复制代码
@RestController
public class ListController {
    @Autowired
    StringRedisTemplate 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);
    }
}

输出:

JSON 复制代码
[
    "333",
    "222",
    "111"
]

set 类型

java 复制代码
@RestController
public class SetController {
    @Autowired
    StringRedisTemplate 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");
    }
}

输出:

bash 复制代码
size:3
isMember:true
remove:1
JSON 复制代码
[
    "111",
    "222",
    "333"
]

hash 类型

java 复制代码
@RestController
public class HashController {
    @Autowired
    StringRedisTemplate 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");
    }
}

输出:

bash 复制代码
size:4
hasKey:true
delete:1
JSON 复制代码
{
    "f1": "v1",
    "f3": "v3",
    "f2": "v2"
}

zset 类型

java 复制代码
@RestController
public class ZsetController {
    @Autowired
    StringRedisTemplate 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);
    }
}

输出:

bash 复制代码
remove:1
rank:1
size:3
[lishi=20.0, zhangsan=10.0, zhaoliu=40.0]
JSON 复制代码
[
    {
        "value": "zhangsan",
        "score": 10.0
    },
    {
        "value": "lishi",
        "score": 20.0
    },
    {
        "value": "zhaoliu",
        "score": 40.0
    }
]
相关推荐
JANYI20182 分钟前
C文件在C++平台编译时的注意事项
java·c语言·c++
m0_6161884930 分钟前
vue3 - keepAlive缓存组件
前端·vue.js·缓存
benpaodeDD1 小时前
双列集合——map集合和三种遍历方式
java
千月落1 小时前
ClickHouse副本集群
服务器·数据库·clickhouse
jjkkzzzz1 小时前
Mysql常用语句汇总
数据库·mysql
找不到、了1 小时前
聊聊对Mysql的理解
数据库·mysql
kngines1 小时前
【PostgreSQL数据分析实战:从数据清洗到可视化全流程】4.2 数据类型转换(CAST函数/自定义函数)
数据库·postgresql·数据分析·filter·自定义函数·cte
Q_Boom2 小时前
前端跨域问题怎么在后端解决
java·前端·后端·spring
搬砖工程师Cola2 小时前
<Revit二次开发> 通过一组模型线构成墙面,并生成墙。Create(Document, IList.Curve., Boolean)
java·前端·javascript
等什么君!2 小时前
学习spring boot-拦截器Interceptor,过滤器Filter
java·spring boot·学习