Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >初识Redis · C++客户端set和zset

初识Redis · C++客户端set和zset

作者头像
_lazy
发布于 2025-04-22 01:11:45
发布于 2025-04-22 01:11:45
13500
代码可运行
举报
文章被收录于专栏:Initial programmingInitial programming
运行总次数:0
代码可运行

前言:

前文我们已经介绍了string list hash在Redis-plus-plus的使用,本文我们开始介绍set和zset在redis-plus-plus的使用。

本文作为Redis初阶的一个收尾,介绍完对应的使用之后,我们就可以进入到Redis的底层原理了。

set

sadd sismember smembers

对于sadd来说,它就是set add的意思嘛,在命令行中,我们可以直接sadd key v1 v2 v3,在这里,我们可以单次插入,也可以是初始化列表,也可以是迭代器,它的讨论和前面的list几乎是一样的。对于sismember来说,就是判断value是否在key里面,命令行的用法是sismember key member,这里其实用法也是,不过我们需要用bool类型接受而已。对于smembers来说,就是用来得到所有的member的,按照之前的套路,我们需要用一个迭代器来带出对应的member:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void test_1(Redis &redis)
{
    redis.flushall();
    redis.sadd("key","1");
    redis.sadd("key",{"2", "3"});
    std::vector<std::string> vec{"4","5"};
    redis.sadd("key",vec.begin(), vec.end());

    bool ans = redis.sismember("key", "3");
    if(ans) std::cout << "is member" << std::endl;
    else std::cout << "not member" << std::endl;

    auto iter = std::inserter(vec, vec.end());
    redis.smembers("key", iter);
    
    for(auto e : vec)
        std::cout << e << " ";
    std::cout << std::endl;


}

spop scard

我们仍然要注意一个点是,set的删除是随即删除的,所以我们删除的时候是没有办法指定的,对于scard,它就是一个用来计数的,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void test_2(Redis &redis)
{
    redis.flushall();
    redis.sadd("key","1");
    redis.sadd("key",{"2", "3"});
    
    auto ans = redis.spop("key");
    if(ans) std::cout << ans.value() << std::endl;
    else std::cout << "set is empty" << std::endl;
    
    long long res = redis.scard("key");
    std::cout << res << std::endl;

}

sinter sinterstore

在命令行中,使用sinter是直接返回交集的结果,在redis-plus-plus中,我们可以将结果存储到一个容器里面,sinterstore是可以将结果存储到另一个key中,不过是存储的位置不同罢了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void test_3(Redis &redis)
{
    redis.flushall();
    redis.sadd("key", "1");
    redis.sadd("key", {"2", "3"});

    redis.sadd("key1", {"1", "2", "4"});
    
    std::vector<std::string> vec;
    auto iter = std::back_inserter(vec);
    redis.sinter({"key", "key1"}, iter);

    for(auto e : vec)
        std::cout << e << " ";
    std::cout << std::endl;

}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void test_4(Redis &redis)
{
    redis.flushall();
    redis.sadd("key", "1");
    redis.sadd("key", {"2", "3"});

    redis.sadd("key1", {"1", "2", "4"});
    
    long long n = redis.sinterstore("key2", {"key", "key1"});
    std::cout << n << std::endl;
    
    std::vector<std::string> vec;
    auto iter = std::back_inserter(vec);
    redis.smembers("key2", iter);
    for(auto e : vec)
        std::cout << e << " ";
    std::cout << std::endl;
}

对于set的交集并集差集都是一样的,所以这里我们就使用交集来介绍了,其他的两个我们完全可以依次类推。


zset

对于zset来说,相对就要麻烦一点,因为它的查询,就会带着两种风格进行查询,一种是带着score的,一种是不带着score的,并且因为分数的存在,就还可以引入排名,虽然是分数的附属品,但是也为zset的难度增加了一点。

zadd zrange zcard

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void test_1(Redis &redis)
{
    redis.flushall();
    redis.zadd("key", "zhangsan",10);
    redis.zadd("key", {std::make_pair("wangwu",30),std::make_pair("lisi",20)});
    std::vector<std::pair<std::string, double>> vec{
        std::make_pair("zhaoliu",40),
        std::make_pair("tianqi",50)
    };
    redis.zadd("key", vec.begin(), vec.end());

    std::vector<std::pair<std::string, double>> ans;
    auto res = std::back_inserter(ans);
    redis.zrange("key", 0, -1, res);

    for(auto e : ans)
        std::cout << e.first  << ":" << e.second<< std::endl;

    std::cout << redis.zcard("key") << std::endl;
}

不过大家把这段代码放在自己的机器上跑可能会出问题,因为对于zrange来说,旧版本的redis是可以直接不用参数,直接带分数返回的,但是新版本的需要带上第五个参数true。

zrem zrank zscore

对于zrem来说,就是删除元素,不过它和set不同的是它可以指定元素删除,对于zrank就是返回排名,对于zscore来说就是返回对应的分数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void test_2(Redis &redis)
{
    redis.flushall();
    redis.zadd("key", "zhangsan",10);
    redis.zadd("key", {std::make_pair("wangwu",30),std::make_pair("lisi",20)});

    redis.zrem("key", "zhangsan");
    long long n = redis.zcard("key");
    std::cout << n << std::endl;

    auto ans = redis.zscore("key", "lisi");
    if(ans) std::cout << ans.value() << std::endl;
    else std::cout << "not exist" << std::endl;

    auto res = redis.zrank("key", "lisi");
    if(res) std::cout << res.value() << std::endl;
    else std::cout << "not exist" << std::endl;
}

当然了,zset的操作远不止于此,不过很多类似的操作我们已经通过string list等其他介绍过了,比如zadd的NX和XX,我们自己清楚就行,用到的时候实在忘了,咱们再看也不迟~~

那么,基本的命令部分,我们就算是正式完结啦!

gogogo , 进入到原理部分咯~

感谢阅读!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-04-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
初识Redis · C++客户端string
在前文,我们已经学习了Redis的定制化客户端怎么来的,以及如何配置好Redis定制化客户端,并且简单学习了一下RESP,其实也就是了解了一下为什么Redis可以定制化客户端而已,那么,我们现在有了Redis定制化客户端的条件,我们自然就可以使用大佬们封装好的Redis的API了。
_lazy
2025/04/19
690
初识Redis · C++客户端string
Redis 入门
Redis 安装安装依赖yum install -y gcc tcl上传安装包并解压tar -zxvf redis-6.2.6.tar.gz链接: https://pan.baidu.com/s/1uBw8qC2JMcbagrX7U9mlOA 提取码: wbs6编译make && make installRedis 启动前台启动redis-server指定配置文件启动- 备份```shellcp redis.conf redis.conf.bck```- 修改配置文件```shell# 允许访问地址bind
ruochen
2022/07/25
2.9K0
【Redis】在Java中以及Spring环境下操作Redis
防止Redis的端口被黑客攻击     将云服务器的redis端口映射到本地主机中
用户11369558
2025/01/24
1140
【Redis】在Java中以及Spring环境下操作Redis
详细介绍5种Redis常用数据类型操作
一、Redis常用操作 (string, list) 如果一个key设置两个不同的值,第二个值会覆盖第一个值。 127.0.0.1:6379> set key1 zhang OK 127.0.0.1:6379> set key2 duan OK 127.0.0.1:6379> set key1 asdqwe OK 127.0.0.1:6379> get key1 "asdqwe" SETNX 检测键值是否有value 如果有直接返回一个 0 如果没有直接返回一个 1 并且创建此 value 127.0.0.
老七Linux
2018/05/31
6760
Redis 数据类型
Redis支持五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及Zset(sorted set:有序集合)。
星哥玩云
2022/09/15
9130
redis学习之redis基本数据类型前言:数据类型详解:
前言: redis有5种基本数据类型,分别是String(字符串)、Hash(字典)、List(列表)、Set(集合)、Zset(有序集合),下面就分别来说一下这五种数据类型。 数据类型详解: 1、String: 二进制安全的数据类型,类似于Java中的Map,以key、value的形式存储数据。它有如下方法: ①、set和get方法:赋值和获取值 语法: set key value get key 例子: set username tom get username ②、del方法:删除指定的
贪挽懒月
2018/06/26
5250
初识Redis · set和zset
在前几篇Redis的基本数据类型中,我们已经了解了string list hash,并且了解了对应的内部编码和实际的应用场景,也是对于基本的命令操作花了比较多的文字描述的去介绍。那么在本文呢,既然有了前几个类型多个基础,我们学习set和zset也是会比较轻松的了。
_lazy
2025/04/17
1350
初识Redis · set和zset
Redis 基础学习
最近想解决 [一刻社区] 中的一个 Issue [“增加用户活跃度统计”],其中的要求就是:利用 redis 位计算算法实现用户活跃度计算,突然发现有点不知所以然,虽然之前也用过 redis ,但是总的来说自己连它的文档都没读过,哈哈,就借着这个机会把 redis 基础知识巩固一下,然后解决 Issue 真棒,哈哈。
overtrue
2019/03/18
5180
【redis】Jedis 操作 Redis 基础指令(下)
返回分数在 min 和 max 之间元素的个数,默认情况下 min 和 max 都是包含的,可以通过 () 排除
椰椰椰耶
2025/03/18
1090
【redis】Jedis 操作 Redis 基础指令(下)
redis常用命令
kaiqi redis 清空Redis所有key: flushdb # 清除当前数据库的所有keysflushall # 清除所有数据库的所有keys 查询匹配key: keys * # 查看所有keyskeys prefix_* # 查看前缀为"prefix_"的所有keys key基本操作: exists key # 确认一个key是否存在set key value # 设置key和valueget key # 获取key的valu
Python之道
2021/09/07
6520
Redis应用总结
首先, 我带大家简单的了解一下Redis Redis常用数据类型(最为常用的数据类型主要有以下五种) ●String ●Hash ●List ●Set ●Sorted set 下面我们先来逐一的分析下这五种数据类型的使用和内部实现方式: 1、String 常用命令: set,get,decr,incr,mget 等。 常用方法: set -- 设置key对应的的值为String类型的value get -- 获取对应key对应的String的值,如果不存在返回nil setnx -- 设置可以为对应的值为
范蠡
2018/04/04
8600
Redis应用总结
高并发架构系列:Redis的基本介绍,五种数据类型及应用场景分析
Redis数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。
用户5546570
2019/07/02
1K0
高并发架构系列:Redis的基本介绍,五种数据类型及应用场景分析
【Redis篇】Set和Zset 有序集合基本使用
SMEMBERS 是一个用于获取集合(Set)中所有成员的命令。Redis 中的集合是一个无序且不重复的元素集合。
用户11369558
2024/12/24
6870
【Redis篇】Set和Zset 有序集合基本使用
Redis初识~Set命令
Redis中得集合以无序得方式来存储多个各不相同得元素,用户可以快速得对集合执行添加,移除操作或者检查一个元素是否存在集合中。 Set集合命令操作 sadd:将一个元素或者多个元素插入到集合key中 已存在的集合元素会被忽略。 key不存在的情况下会创建一个集合。 时间复杂度是O(N),n是被添加的元素的数量。 sadd key member member scard: 返回集合中key的基数 时间复杂度是O(1). scard key sdiff: 返回一个集合的全部成员,该集合是所有的给定集合之间
用户2196435
2018/07/19
4400
新人入坑Redis必会的吐血总结
Redis是一个使用C语言开发的开源的高性能的key-value存储系统,我们可以把它近似理解为Java Map。简单来讲,Redis是一种NOSQL内存数据库,小伙伴们可不要把它理解为NO SQL(不是SQL),它的全称是Not Only SQL(不仅仅是SQL),换个层面来讲,它是一种非关系型的数据库,它是作为关系型数据库的良好补充,它与传统的MySQL,Oracle不同之处在于,它是通过在内存中读写数据,大大提高了读写速度。可以说,Redis是为了解决网站高并发、高可用、高可扩展、大数据存储等一系列问题而产生的数据库解决方案,不可或缺的一部分。
Angel_Kitty
2018/09/21
4.2K0
新人入坑Redis必会的吐血总结
PHP操作Redis详解案例
$redis = new Redis(); connect, open 链接redis服务 参数 host: string,服务地址 port: int,端口号 timeout: float,链接时长 (可选, 默认为 0 ,不限链接时间) 注: 在redis.conf中也有时间,默认为300 pconnect, popen 不会主动关闭的链接 参考上面 setOption 设置redis模式 getOption 查看redis设置的模式 ping 查看连接状态 get 得到某个key的值(string值)
思梦php
2018/03/09
1.4K0
【C#与Redis】--Redis 命令
Redis 提供了许多命令用于在内存中存储和检索数据。以下是一些常用的 Redis 命令,它们涵盖了各种功能,包括字符串、列表、集合、有序集合、哈希等数据结构的操作。
喵叔
2023/12/24
2940
php中redis函数总结
phpredis是php的一个扩展,效率是相当高有链表排序功能,对创建内存级的模块业务关系
IT工作者
2022/01/04
5930
Redis-五种数据类型解析
Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
yaphetsfang
2020/07/30
4610
Redis-五种数据类型解析
浅谈Redis的五大数据类型及其应用
Redis是一种开源的内存数据结构存储系统,它支持多种数据类型,包括字符串String、列表list、集合、哈希表和有序集合。这些数据类型在Redis中有着广泛的应用场景,可以满足不同的业务需求。本文将介绍Redis的五大数据类型及其应用。
小明爱吃火锅
2023/10/31
1.1K0
浅谈Redis的五大数据类型及其应用
相关推荐
初识Redis · C++客户端string
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验