Redis实战-Redis命令

1 字符串

由字节组成的序列,可以存储字符串、整数和浮点数。

表 1 redis字符串的自增和自减命令
命令用例和描述
INCRINCR key-name,将键的存储值加1
DECRDECR key-name,将键的存储值减一
DECRBYDECRBY key-name amount,将键存储值减少amount
INCRBYINCRBY key-name amount,将键存储值增加amount

Java示例demo-1:

/**
     * 字符串基本命令操作
     */
    @Test
    void strCommandTest() {
        //自增自减命令
        redisTemplate.opsForValue().set("age", 10);
        Assertions.assertEquals(redisTemplate.opsForValue().get("age"), 10);
        redisTemplate.opsForValue().increment("age");
        redisTemplate.opsForValue().increment("age", 20);
        Assertions.assertEquals(redisTemplate.opsForValue().get("age"), 31);
        redisTemplate.opsForValue().decrement("age");
        redisTemplate.opsForValue().decrement("age", 20);
        Assertions.assertEquals(redisTemplate.opsForValue().get("age"), 10);
    }
表 2 redis字符串高级命令
命令用例和描述
APPENDAPPEND key-name value,将给定value追加到给定键存储值末尾
GETRANGEGETRANGE key-name start end,获取偏移量start-end的子串
SETRANGESETRANGE key-name offset value,从offset开始设置value覆盖后续字符串内容

Java示例demo-2:

/**
     * 字符串高级命令操作
     */
    @Test
    void strAdvancedCommandTest() {
        //不适用默认的配置序列化解析器
        redisTemplate.setValueSerializer(new StringRedisSerializer());
        redisTemplate.opsForValue().set("hello", "world");
        redisTemplate.opsForValue().append("hello", "nihao");
        Assertions.assertEquals("worldnihao", redisTemplate.opsForValue().get("hello"));
        Assertions.assertEquals("world", redisTemplate.opsForValue().get("hello", 0, 4));
        //会覆盖之后的字符
        redisTemplate.opsForValue().set("hello", "aaa", 0);
        Assertions.assertEquals("aaaldnihao", redisTemplate.opsForValue().get("hello"));
    }

注意:这里将Value序列化设置为字符串,不使用我们之前配置的序列化器,因为append默认是使用字符串序列化器进行序列化添加内容,如果不设置可能导致无法解析出正确结果。

2 列表

列表允许从两端推入或者弹出元素。

表 3 redis列表的常用命令
命令用例和描述
RPUSHRPUSH key-name value……,将一个多个value从列表右侧推入
LPUSHLPUSH key-name value……,将一个多个value从列表左侧推入
RPOPRPOP key-name ,移除并返回最右侧元素
LPOPLPOP key-name ,移除并返回最左侧元素
LINDEXLINDEX key-name offset,返回列表中偏移量为offset的元素
LRANGELRANGE key-name start end,返回start-end范围的所以元素
LTRIMLTRIM key-name start end,修建列表为start-end范围内元素

Java代码示例demo-3:

@Test
    void listCommandTest() {
        redisTemplate.opsForList().rightPushAll("list1", "aa", "bb", "cc", "dd");
        System.out.println(redisTemplate.opsForList().range("list1", 0, -1));
        Assertions.assertEquals(redisTemplate.opsForList().index("list1", 1), "bb");
        redisTemplate.opsForList().trim("list1", 0, 2);
        System.out.println(redisTemplate.opsForList().range("list1", 0, -1));
    }

列表还有一些阻塞命令,通过阻塞直到存在元素。

表 4 redis列表的高级命令
命令用例和描述
BLPOPBLPOP key-name …… timeout,从第一个非空列表弹出最左端元素,等待时间timeout
BRPOPBRPOP key-name…… timeout,从第一个非空列表弹出最右端元素,等待时间timeout
RPOPLPUSHRPOPLPUSH source-key dest-key,从source-key弹出右侧元素,推入dest-key左侧
BRPOPLPUSHBRPOPLPUSH source-key dest-key timeout,从source-key弹出右侧元素,推入dest-key左侧,等待阻塞时间timeout

Java示例demo-4:

/**
     * 列表阻塞命令操作
     */
    @Test
    void listBlockCommandTest() {
        ExecutorService executorService = Executors.newSingleThreadExecutor();
        redisTemplate.delete(Arrays.asList("listTwo", "listDestinagtion"));
        redisTemplate.opsForList().leftPushAll("listTwo", "aa");
        redisTemplate.opsForList().rightPopAndLeftPush("listTwo", "listDestination");
        //测试阻塞弹出-类似生产者-消费者
        try {
            executorService.execute(() -> {
                //生产者
                redisTemplate.opsForList().leftPushAll("listTwo", "dd", "ee");
            });
        } finally {
            executorService.shutdown();
        }
        //消费者
        Object leftPop = redisTemplate.opsForList().leftPop("listTwo", 2, TimeUnit.SECONDS);
        Assertions.assertEquals(leftPop, "ee");
        Assertions.assertEquals(redisTemplate.opsForList().rightPop("listTwo", 2, TimeUnit.SECONDS), "dd");
    }

这里需要通过多线程进行演示阻塞情况。
阻塞命令常用于消息传递和任务队列。

3 集合

以无序方式存储多个各不相同的元素。

表 5 redis集合的基本命令
命令用例和描述
SADDSADD key-name item……,将一个或多个item添加到集合
SREMSREM key-name item……,将一个或多个元素从集合移除
SISMEMBERSISMEMBER key-name item,检查item是否存在于集合中
SCARDSCARD key-name,返回集合包含元素个数
SMEMBERSSMEMBERS key-name,返回集合包含的所以元素
SRANDMEMBERSRANDMEMBER key-name count,从集合随机返回count个元素
SPOPSPOP key-name,随机移除集合中一个元素,并返回
SMOVESMOVE source-key dest-key item,如果元素存在于源key,则移动到目的key

Java示例demo-5:

/**
     * 集合基本命令
     */
    @Test
    void collectionCommandTest() {
        redisTemplate.opsForSet().add("collOne", "v1", "v2", "v3");
        Assertions.assertTrue(redisTemplate.opsForSet().isMember("collOne", "v1"));
        redisTemplate.opsForSet().remove("collOne", "v1");
        //随机返回一个
        System.out.println(redisTemplate.opsForSet().randomMember("collOne"));
        Assertions.assertEquals(redisTemplate.opsForSet().size("collOne"), 2);
        redisTemplate.delete("collOne");
    }

集合还有一些高级命令可以操作多个集合。

以无序方式存储多个各不相同的元素。

表 6 redis集合的高级命令
命令用例和描述
SDIFFSDIFF key-name [key-name……],返回存在于第一个集合,不存在其它集合的元素,差集
SDIFFSTORESDIFFSTORE dest-key key-name [key-name……],将差集内容存储到集合dest-key
SINTERSINTER key-name [key-name……],返回同时存在于集合中的元素,交集
SINTERSTORESINTERSTORE dest-key key-name [key-name……],将交集存储到dest-key
SUNIONSUNION key-name [key-name……],返回至少存在于一个集合中的元素,并集
SUNIONSTORESUNIONSTORE dest-key key-name [key-name……],将并集存储到dest-key

Java示例demo-6:

/**
     * 集合并集、交集和差集操作。
     */
    @Test
    void collectionAdvancedCommandTest() {
        redisTemplate.opsForSet().add("skey1", "a", "b", "c", "d");
        redisTemplate.opsForSet().add("skey2", "c", "d", "e", "f");
        redisTemplate.opsForSet().difference("skey1", "skey2").stream().forEach(System.out::print);
        redisTemplate.opsForSet().differenceAndStore("skey1", "skey2", "diffColl");
        Assertions.assertEquals(2, redisTemplate.opsForSet().size("diffColl"));
        System.out.println();
        redisTemplate.opsForSet().intersect("skey1", "skey2").stream().forEach(System.out::print);
        redisTemplate.opsForSet().intersectAndStore("skey1", "skey2", "intersectColl");
        Assertions.assertEquals(2, redisTemplate.opsForSet().size("intersectColl"));
        System.out.println();
        redisTemplate.opsForSet().union("skey1", "skey2").stream().forEach(System.out::print);
        redisTemplate.opsForSet().unionAndStore("skey1", "skey2", "unionColl");
        Assertions.assertEquals(6, redisTemplate.opsForSet().size("unionColl"));
        redisTemplate.delete(Arrays.asList("skey1", "skey2", "diffColl", "intersectColl", "unionColl"));
    }

4 散列

散列类似数据库的行,每个散列可以存储对应的各种属性项。

常见的散列操作:

表 7 redis散列的基本命令
命令用例和描述
HMGETHMGET key-name key [key……],从散列中取出一个或n个键值对
HMSETHMSET key-name key value [key value……],设置散列的一个或多个键值对
HDELHDEL key-name key [key……],从散列删除一个多个键值对
HLENHLEN key-name,返回散列的键值对数量

Java示例demo-7:

/**
     * hash基本操作
     */
    @Test
    void hashCommandTest() {
        Map<String, String> map = new HashMap<>();
        map.put("k1", "v1");
        map.put("k2", "v2");
        map.put("k3", "v3");
        redisTemplate.opsForHash().putAll("hashOne", map);
        redisTemplate.opsForHash().multiGet("hashOne", Arrays.asList("k1", "k2", "k3")).stream().forEach(System.out::print);
        redisTemplate.opsForHash().delete("hashOne", "k1");
        Assertions.assertEquals(2, redisTemplate.opsForHash().size("hashOne"));
        redisTemplate.delete("hashOne");
    }

散列还存在一些高级命令:

表 8 redis散列的高级命令
命令用例和描述
HEXISTSHEXISTS key-name key,检查key是否存在于散列中
HKEYSHKEYS key-name,返回散列所有键
HVALSHVALS key-name,返回散列所有值
HGETALLHGETALL key-name 返回散列所有键值对
HINCRBYHINCRBY key-name key increment,将key的值增加increment

Java示例demo-8:

/**
     * hash高级操作
     */
    @Test
    void hashAdvancedCommandTest() {
        Map<String, String> map = new HashMap<>();
        map.put("k1", "v1");
        map.put("k2", "v2");
        map.put("k3", "v3");
        redisTemplate.opsForHash().putAll("hashOne", map);
        Assertions.assertTrue(redisTemplate.opsForHash().hasKey("hashOne", "k1"));
        redisTemplate.opsForHash().keys("hashOne").stream().forEach(System.out::print);
        System.out.println();
        redisTemplate.opsForHash().values("hashOne").stream().forEach(System.out::print);
        System.out.println();
        redisTemplate.opsForHash().entries("hashOne").forEach((k, v) -> {
            System.out.printf("key-val: %s-%s; ", k, v);

        });
        redisTemplate.opsForHash().increment("hashOne", "k4", 10);
        Assertions.assertEquals(10, redisTemplate.opsForHash().get("hashOne", "k4"));
        redisTemplate.delete("hashOne");
    }

5 有序集合

存储键和值之间的映射。

常见的有序集合命令:

表 9 redis有序集合的基本命令
命令用例和描述
ZADDZADD key-name score member [score member……],添加一个多个成员
ZREMZREM key-name member [member……],移除一个或多个成员
ZCARDZCARD key-name,返回成员个数
ZINCRBYZINCRBY key-name increment member,增加成员对应分数
ZCOUNTZCOUNT key-name min max,返回分值介于min,max直接成员个数
ZRANKZRANK key-name member,返回成员的排名
ZSCOREZSCORE key-name member,返回成员分数
ZRANGEZRANGE key-name start end [withscores],返回介于指定范围的成员,可选项带分数返回

Java示例demo-9:

/**
     * 有序集合基本命令
     */
    @Test
    void orderedSetCommandTest() {
        @Data
        class Tuple implements ZSetOperations.TypedTuple<Object> {
            private String value;
            private double score;

            @Override
            public Object getValue() {
                return value;
            }

            @Override
            public Double getScore() {
                return score;
            }

            @Override
            public int compareTo(ZSetOperations.TypedTuple<Object> o) {
                return Double.compare(this.score, o.getScore());
            }
        }
        Tuple tupleOne = new Tuple();
        tupleOne.setScore(30);
        tupleOne.setValue("k1");
        Tuple tupleTwo = new Tuple();
        tupleTwo.setScore(40);
        tupleTwo.setValue("k2");
        Set<ZSetOperations.TypedTuple<Object>> set = new HashSet<>();
        set.add(tupleOne);
        set.add(tupleTwo);
        redisTemplate.opsForZSet().add("orderedsetOne", set);
        redisTemplate.opsForZSet().remove("orderedsetOne", "k1");
        Assertions.assertEquals(1, redisTemplate.opsForZSet().size("orderedsetOne"));
        redisTemplate.opsForZSet().incrementScore("orderedsetOne", "k2", 21);
        Assertions.assertEquals(61, redisTemplate.opsForZSet().score("orderedsetOne", "k2"));
        Assertions.assertEquals(1, redisTemplate.opsForZSet().count("orderedsetOne", 60, 62));
        Assertions.assertEquals(0, redisTemplate.opsForZSet().rank("orderedsetOne", "k2"));
        redisTemplate.opsForZSet().range("orderedsetOne", 0, -1).stream().forEach(System.out::print);
        redisTemplate.delete("orderedsetOne");
    }

高级的有序集合命令:

表 10 redis有序集合的高级命令
命令用例和描述
ZINTERSTOREZINTERSTORE dest-key key-count key [key……] [weight] [aggregate sum
ZUNIONSTOREZUNIONSTORE dest-key key-count key [key……] [weight] [aggregate sum

还包括各种rev命令同上述基本命令相反的从大到小的排列顺序。

Java示例demo-10:

@Test
    void orderedsetAdvancedCommandTest() {
        redisTemplate.opsForZSet().add("setOne", "k1", 10);
        redisTemplate.opsForZSet().add("setOne", "k2", 20);
        redisTemplate.opsForZSet().add("setOne", "k3", 30);
        redisTemplate.opsForZSet().add("setTwo", "k2", 20);
        redisTemplate.opsForZSet().add("setTwo", "k3", 30);
        redisTemplate.opsForZSet().add("setTwo", "k4", 40);
        //操作类似集合操作
        System.out.println();
        redisTemplate.opsForZSet().intersectAndStore("setOne", "setTwo", "intersect");
        Assertions.assertEquals(2, redisTemplate.opsForZSet().zCard("intersect"));
        System.out.println();
        redisTemplate.opsForZSet().unionAndStore("setOne", "setTwo", "union");
        Assertions.assertEquals(4, redisTemplate.opsForZSet().zCard("union"));
        redisTemplate.delete(Arrays.asList("setOne", "setTwo", "intersect", "union"));
    }
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
redis-trib.rb是一个redis集群管理工具,用于检查集群、创建删除节点、迁移key等操作。它已经合并到redis软件中,通常可以直接使用。如果找不到redis-trib.rb命令,可以检查环境变量设置或者从官方网站下载。这个工具支持交互模式,但在生产环境中更常用的是准备脚本来运行命令,而不是使用交互模式。一些常用的redis命令包括启动redis服务的redis-server命令,启动redis客户端的redis-cli命令,关闭redis服务的pkill redis-server命令,关闭redis客户端的redis-cli shutdown命令,以及查看redis默认端口号占用情况的netstat命令。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Redis集群(windows版本操作)](https://blog.csdn.net/qq_43163317/article/details/121604369)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [从redis-trib.rb到集群加减节点实战](https://blog.csdn.net/qq_40687433/article/details/131234885)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Redis下载以及安装](https://blog.csdn.net/yanghzaini/article/details/86481455)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LamaxiyaFc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值