java使用Lettuce客户端连接redis学习基本redis指令

关注我,精彩文章第一时间推送给你

公众号.jpg

java使用Lettuce客户端连接redis学习基本redis指令

  • 参考try.redis.io进行以下几种存储类型的指令学习

  • string、list、set、zset、hash

由于Springboot 2.0 中redis客户端使用了Lettue,所以没使用jedis进行学习,依赖由于项目中引入了以下依赖,所以就不用别的了。

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--因为Springboot 2.0 中redis客户端使用了Lettue, 其依赖于commons-->
<dependency>
   <groupId>org.apache.commons</groupId>
   <artifactId>commons-pool2</artifactId>
</dependency>

操作基本指令代码如下:

/**
 * @author yunqing
 * @description 参考 try.redis.io
 * @date 2020/6/3 16:08
 */
@SpringBootTest
@Slf4j
public class LettuceTest {

    RedisClient redisClient;
    StatefulRedisConnection<String, String> redisConnection;
    RedisCommands<String, String> sync;

    /**
     * @BeforeEach 注解在非静态方法上,所有测试方法之前执行
     * @BeforeAll 注解在静态方法上,所有测试方法之前执行
     */
    @BeforeEach
    void connRedisByLettuce() {
        RedisURI redisUri = RedisURI.builder()
            .withHost("127.0.0.1")
            .withPort(6379)
            .withTimeout(Duration.of(10, ChronoUnit.SECONDS))
            .build();
        redisClient = RedisClient.create(redisUri);
        redisConnection = redisClient.connect();
        sync = redisConnection.sync();
    }

    /**
     * 关闭连接
     */
    @AfterEach
    void closeConn() {
        redisConnection.close();
        redisClient.shutdown();
    }

    /**
     * string类型set get
     * ttl 返回-1永不超时
     * ttl 返回-2不存在此key
     */
    @Test
    void string() {
        log.info(sync.set("k1", "v1"));
        sync.expire("k1", 1000); //设置1000秒超时
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        log.info(sync.ttl("k1").toString()); //获取剩余超时时间
        log.info(sync.get("k1"));
    }

    /**
     * redis 列表,相当于链表
     * lpush 左侧添加,是可变参数,可同时追加多个
     * rpush 右侧添加,是可变参数,可同时追加多个
     * lrange key 0 -1 获取列表第一到最后一个
     * lpop key 删除列表左侧第一个
     * rpop key 删除列表右侧第一个
     * llen key 获取当前列表长度
     */
    @Test
    void redisList() {
        sync.rpush("friends", "Tom", "yunqing");
        sync.rpush("friends", "Bob", "kkk");
        sync.lpush("friends", "peter");
        log.info(sync.llen("friends").toString());
        List<String> friends = sync.lrange("friends", 0, -1);
        friends.forEach(System.out::println);
        sync.lpop("friends");
        sync.rpop("friends");
        List<String> friends2 = sync.lrange("friends", 0, -1);
        friends2.forEach(System.out::println);
        log.info(sync.llen("friends").toString());
        sync.expire("friends", 10);//设置1000秒过期
    }

    /**
     * redis  set集合
     * 测试
     */
    @Test
    void redisSet() {
        sync.sadd("names", "yunqing", "kkk", "tom", "tom", "a", "c", "b");
        log.info("输出set集合[{}]", String.valueOf(sync.smembers("names")));
        log.info("测试是否存在---------[{}]", sync.sismember("names", "yunqing"));
        log.info("删除结果1成功,0失败---------[{}}]", sync.srem("names", "tom"));
        log.info("输出集合[{}]", sync.smembers("names"));
        sync.expire("names", 10);
    }

    /**
     * 带排序的set集合
     */
    @Test
    void redisZSet() {
        sync.zadd("names", 1, "yunqing");
        sync.zadd("names", 3, "tom");
        sync.zadd("names", 2, "kkk");
        sync.zadd("names", 10, "tom");
        sync.zadd("names", 5, "peter");
        sync.zadd("names", 5, "bob");
        log.info("查看集合所有[{}]---------", sync.zrange("names", 0, -1));
        log.info("删除一个-----[{}]", sync.zrem("names", "peter"));
        log.info("查看集合所有[{}]---------", sync.zrange("names", 0, -1));
        sync.expire("names", 10);
    }

    /**
     * hash格式存储
     */
    @Test
    void hash() {
        sync.hset("user", "name", "yunqing");
        sync.hset("user", "age", "26");
        log.info("获取所有-----[{}]", sync.hgetall("user"));
        Map<String, String> map = new HashMap<>();
        map.put("sex", "男");
        map.put("email", "10001");
        sync.hmset("user", map);
        log.info("获取所有-----[{}]", sync.hgetall("user"));
        log.info("获取一个------[{}]", sync.hget("user", "email"));
        sync.expire("user", 10);
    }

}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352