当前位置: 首页 > news >正文

Redis-CPP 5大类型操作

这篇文章不会讲解所有关于5大基础类型的所有命令,只讲解几个常用的命令操作。如果想看全部的命令操作,可以看其它的文章。

string

set

先来看一看set操作在服务器端的函数原型:
SET key value [expiration EX seconds|PX milliseconds] [NX|XX]
其中有[NX | XX]选项,而且还能设置过期时间,在通用接口中我们已经见过了函数原型。只是还有2个参数没有讲解,接下来就讲解另外2个参数。

bool set(const sw::redis::StringView &key, const sw::redis::StringView &val, const std::chrono::milliseconds &ttl = std::chrono::milliseconds(0), sw::redis::UpdateType type = sw::redis::UpdateType::ALWAYS)

第三个参数用于设置超时时间,第四个参数可以选择设置[NX | XX]。有三种选项可以选择:

  • ALWAYS:默认值是这个。表示的是总是插入新的数据。
  • NOT_EXISTkey不存在时才会插入,key存在时则不设置(返回nil)。与NX一样。
  • EXISTkey存在时则更新(相当于更新key的value),不存在时不会设置。与XX一样。

代码示例:

using sw::redis::Redis;
using namespace std;void test1(Redis &redis)
{cout << "get 和 set" << std::endl;redis.flushall();redis.set("key1", "111");auto value = redis.get("key1");if (value)cout << "value:" << value.value() << endl;redis.set("key2", "222");value = redis.get("key2");if (value)cout << "value:" << value.value() << endl;cout << "带上超时时间" << endl;redis.set("key3", "333", 10s);   // 设置10秒后过期this_thread::sleep_for(3s);   // 休眠3秒long long time = redis.ttl("key3");cout << "time: " << time << endl;
}

请添加图片描述


void test2(Redis &redis)
{cout << "set NX 和 XX" << endl;redis.flushall();redis.set("key1", "111");// set的重载版本中,没有单独提供NX和XX的版本,必须搭配过期时间版本来使用。redis.set("key1", "222", 5s, sw::redis::UpdateType::EXIST); // 如果不想设置过期时间的话,写0s就行,不能省略第三个参数auto value = redis.get("key1");if (value)cout << "value: " << value.value() << endl;elsecout << "key不存在" << endl;
}

请添加图片描述

mset

用于同时设置多个key。函数原型如下:

 template <typename Input>void mset(Input first, Input last);template <typename T>void mset(std::initializer_list<T> il) {mset(il.begin(), il.end());}

第一个版本是可以使用容器迭代器,类型是std::pair<std::string, std::string>。例如,可以使用vector,然后存入pair;也可以使用map或者unordered_map来进行存储。
第二个版本是使用初始化列表,列表中的每个元素都是std::pair<std::string, std::string>

  • 代码示例:
void test3(Redis &redis)
{cout << "mset" << endl;redis.flushall();// 使用初始化列表redis.mset({make_pair("key1", "111"), make_pair("key2", "222")});// 使用迭代器方法vector<pair<string, string>> v = {{"key3", "333"},{"key4", "444"},};redis.mset(v.begin(), v.end());auto value = redis.get("key1");if (value)std::cout << "value: " << value.value() << std::endl;value = redis.get("key2");if (value)std::cout << "value: " << value.value() << std::endl;value = redis.get("key3");if (value)std::cout << "value: " << value.value() << std::endl;
}

mget

用于同时获取多个key。函数原型如下:

template <typename Input, typename Output>void mget(Input first, Input last, Output output);template <typename T, typename Output>void mget(std::initializer_list<T> il, Output output) {mget(il.begin(), il.end(), output);}

也有两个版本,一种是使用迭代器类型,把要查询的key放入到input容器中,然后输入容器的头尾迭代器。第三个参数是一个output迭代器,用于接收输出的value。另一种是使用初始化列表,把要查询的key放入到列表当中。

  • 代码示例:
void test4(Redis &redis)
{std::cout << "mget" << std::endl;redis.flushall();vector<std::pair<string, string>> keys = {{"key1", "111"},{"key2", "222"},{"key3", "333"}};redis.mset(keys.begin(), keys.end());vector<sw::redis::OptionalString> result;auto it = std::back_inserter(result);redis.mget({"key1", "key2", "key3", "key4"}, it);for (auto &elem : result){// 此处预期elem是一个optional类型的元素,打印之前,先判定一下,看是否有效。if (elem)cout << elem.value() << endl;elsecout << "元素无效" << endl;}
}

请添加图片描述

getrange

获取指定范围内的字符串。函数原型如下:
std::string getrange(const StringView &key, long long start, long long end);
第一个参数是需要查看的key,第二个和第三个参数都是查询的范围,下标可以是负数。

setrange

从指定下标覆盖字符串。函数原型如下:
long long setrange(const StringView &key, long long offset, const StringView &val);
第一个参数是指定的key;第二个参数是起始的下标,从起始下标往后的字符将被覆盖;第三个参数是用val进行覆盖。
返回值是此操作后字符串的长度。

  • 代码示例:
void test5(Redis &redis)
{cout << "getrange" << endl;redis.flushall();redis.set("key", "abcdefg");string result = redis.getrange("key", 2, 5);cout << "result: " << result << endl;redis.setrange("key", 2, "ooo");auto value = redis.get("key");cout << "value: " << value.value() << endl;
}

请添加图片描述

incrby

将 key 中储存的数字加上指定的增量值。函数原型如下:
long long incrby(const StringView &key, long long increment);

decrby

将 key 对应的 string 表⽰的数字减去对应的值。函数原型如下:
long long decrby(const StringView &key, long long decrement);

  • 代码示例:
void test6(Redis &redis)
{cout << "incrby和decrby" << endl;redis.flushall();redis.set("key1", "111");redis.set("key2", "222");long long result1 = redis.incrby("key1", 10);long long result2 = redis.decrby("key2", 10);cout << "result1: " << result1 << endl;cout << "result2: " << result2 << endl;
}

请添加图片描述

list

lpush

把元素头插到列表头部。函数原型如下:

long long lpush(const StringView &key, const StringView &val);template <typename Input>long long lpush(const StringView &key, Input first, Input last);template <typename T>long long lpush(const StringView &key, std::initializer_list<T> il) {return lpush(key, il.begin(), il.end());}

第一个版本很简单,每次只能插入一个元素。
第二个版本是迭代器类型,第三个版本是使用初始化列表。

  • 代码示例
void test1(Redis &redis)
{cout << "lpush 和 lrange用法" << endl;redis.flushall();// 插入单个元素redis.lpush("key1", "111");// 插入多个元素,使用初始化列表redis.lpush("key1", {"222", "333", "444"});// 使用迭代器vector<string> val = {"555", "666"};redis.lpush("key1", val.begin(), val.end());// 获取元素vector<string> ans;auto it = back_inserter(ans);redis.lrange("key1", 0, -1, it);for (auto &elem : ans){cout << elem << endl;}
}

请添加图片描述

rpush

把元素尾插到列表尾部。函数原型如下:

long long rpush(const StringView &key, const StringView &val);template <typename Input>
long long rpush(const StringView &key, Input first, Input last);template <typename T>
long long rpush(const StringView &key, std::initializer_list<T> il) {return rpush(key, il.begin(), il.end());
}

使用方法和lpush一样。

lpop

从头部删除元素。函数原型如下:

OptionalString lpop(const StringView &key);

此处需要注意返回的是OptionalString类型,需要进行检查,避免为空。

rpop

从尾部删除元素。函数原型如下:

OptionalString rpop(const StringView &key);
  • 代码示例:
void test2(Redis &redis)
{cout << "lpop 和 rpop 用法" << endl;redis.flushall();redis.rpush("key1", {"111", "222", "333", "444", "555"});auto ans = redis.lpop("key1");if (ans)cout << "lpop: " << ans.value() << endl;ans = redis.rpop("key1");if (ans)cout << "rpop: " << ans.value() << endl;ans = redis.lpop("key2");if (ans)cout << "lpop: " << ans.value() << endl;elsecout << "该key不存在" << endl;
}

请添加图片描述

lrange

获取指定范围内的元素。函数原型如下:

template <typename Output>
void lrange(const StringView &key, long long start, long long stop, Output output);

指定区间[start, top],然后把结果通过output迭代器输出到容器中。

llen

获取列表的长度。函数原型如下:

long long llen(const StringView &key);

blpop

阻塞等待,获取头部元素。函数原型如下:

// 单个key
OptionalStringPair blpop(const StringView &key, long long timeout);OptionalStringPair blpop(const StringView &key,const std::chrono::seconds &timeout = std::chrono::seconds{0});// 迭代器版本
template <typename Input>OptionalStringPair blpop(Input first, Input last, long long timeout);template <typename Input>OptionalStringPair blpop(Input first,Input last,const std::chrono::seconds &timeout = std::chrono::seconds{0});// 初始化列表版本
template <typename T>OptionalStringPair blpop(std::initializer_list<T> il, long long timeout) {return blpop(il.begin(), il.end(), timeout);}template <typename T>OptionalStringPair blpop(std::initializer_list<T> il,const std::chrono::seconds &timeout = std::chrono::seconds{0}) {return blpop(il.begin(), il.end(), timeout);}

blpop有6个重载但其实是同样的功能的不同传参形式而已。对于redis的等待,其可以传入一个或者多个key。前两个函数重载就是对单个key的特化、超时时间可以分为lonng long类型和std::chrono类型,所以有两个重载。
blpop的返回值一个是OptionalStringPair,第一个成员是key,表示该数据从哪一个list得到的,第二个成员OptionalStringPair.value().second才是获得到的值。
有两种方式可以访问成员,第一种是通过value()方法获取pair

OptionalStringPair.value().first;
OptionalStringPair.value().fsecond;

还有一种是通过->访问:

OptionalStringPair -> first;
OptionalStringPair -> second;

该函数可能返回一个空值,所以使用之前要检测是否为空。

  • 代码示例
void test3(Redis &redis)
{using namespace std::chrono_literals;cout << "blpop 和 brpop 用法" << endl;redis.flushall();auto result = redis.blpop({"key", "key2", "key3"}, 10s);   // 如果不设置超时时间,那么会一直阻塞住if (result){std::cout << "key:" << result.value().first << std::endl;std::cout << "elem:" << result->second << std::endl;}else{std::cout << "result 无效!" << std::endl;}
}

请添加图片描述

brpop

函数原型:

// 单key版本
OptionalStringPair brpop(const StringView &key, long long timeout);OptionalStringPair brpop(const StringView &key,const std::chrono::seconds &timeout = std::chrono::seconds{0});// 多key,容器迭代器版本
template <typename Input>
OptionalStringPair brpop(Input first, Input last, long long timeout);template <typename Input>
OptionalStringPair brpop(Input first,Input last,const std::chrono::seconds &timeout = std::chrono::seconds{0});// 多key,初始化列表版本
template <typename T>
OptionalStringPair brpop(std::initializer_list<T> il, long long timeout);template <typename T>
OptionalStringPair brpop(std::initializer_list<T> il,const std::chrono::seconds &timeout = std::chrono::seconds{0});

blpop一样

set

sadd

往集合中插入元素,或者创建一个集合。函数原型如下:

long long sadd(const StringView &key, const StringView &member);template <typename Input>long long sadd(const StringView &key, Input first, Input last);template <typename T>long long sadd(const StringView &key, std::initializer_list<T> il) {return sadd(key, il.begin(), il.end());}

第一个版本是一次添加一个元素。第二个版本是迭代器版本。第三个版本是使用初始化列表。

smembers

返回集合中的所有的成员。 不存在的集合 key 被视为空集合。函数原型如下:

template <typename Output>void smembers(const StringView &key, Output output);
  • 代码示例:
void test1(Redis &redis)
{cout << "sadd 和 smembers" << endl;redis.flushall();// 一次添加一个redis.sadd("key1", "111");// 使用初始化列表redis.sadd("key1", {"222", "333", "444"});// 使用迭代器set<string> elems = {"555", "666", "777"};redis.sadd("key1", elems.begin(), elems.end());vector<string> result;// auto it = back_inserter(result);// 由于此处set里的元素顺序是固定的,指定一个result.end()或者result.begin()或者其它位置的迭代器,都无所谓auto it = inserter(result, result.end());redis.smembers("key1", it);for (auto &elem : result){cout << "value: " << elem << endl;}
}

请添加图片描述

sismember

判断成员元素是否是集合的成员。函数原型:

bool sismember(const StringView &key, const StringView &member);

scard

返回集合中元素的数量。函数原型如下:

long long scard(const StringView &key);
  • 代码示例:
void test2(Redis &redis)
{cout << "scard使用" << endl;redis.flushall();redis.sadd("key1", {"111", "222", "333", "444"});auto ans = redis.scard("key1");cout << ans << endl;
}

请添加图片描述

spop

从 set 中删除并返回⼀个或者多个元素。函数原型:

OptionalString spop(const StringView &key);template <typename Output>void spop(const StringView &key, long long count, Output output);
  • 代码示例:
void test3(Redis &redis)
{std::cout << "spop" << std::endl;redis.flushall();redis.sadd("key", {"111", "222", "333", "444"});auto result = redis.spop("key");if (result){std::cout << "result: " << result.value() << std::endl;}else{std::cout << "result 无效!" << std::endl;}
}

sinter

返回给定所有给定集合的交集。 不存在的集合 key 被视为空集。函数原型:

template <typename Input, typename Output>void sinter(Input first, Input last, Output output);template <typename T, typename Output>void sinter(std::initializer_list<T> il, Output output) {sinter(il.begin(), il.end(), output);}

第一个版本是使用迭代器。第二个是使用初始化列表。最后把结果输出到output迭代器当中。

  • 代码示例:
void test4(Redis &redis)
{cout << "sinter" << endl;redis.flushall();redis.sadd("key1", {"111", "222", "333"});redis.sadd("key2", {"111", "222", "444"});set<string> result;auto it = inserter(result, result.end());redis.sinter({"key1", "key2"}, it);for (auto &elem : result){cout << "value: " << elem << endl;}
}

请添加图片描述

sinterstore

将给定集合之间的交集存储在指定的集合中。如果指定的集合已经存在,则将其覆盖。函数原型:

long long sinterstore(const StringView &destination, const StringView &key);template <typename Input>long long sinterstore(const StringView &destination,Input first,Input last);template <typename T>long long sinterstore(const StringView &destination,std::initializer_list<T> il) {return sinterstore(destination, il.begin(), il.end());}

重载的第一个参数都是destination,求出的交集会被存放到这个set中。第一个重载是对单个set的特化,后续两个重载分别输入一个迭代器或者初始化列表,内部放要求交集的多个set

  • 代码示例:
void test5(Redis &redis)
{cout << "sinterstore" << endl;redis.flushall();redis.sadd("key1", {"111", "222", "333"});redis.sadd("key2", {"111", "222", "444"});long long len = redis.sinterstore("key3", {"key1", "key2"});cout << "len: " << len << endl;set<string> result;auto it = inserter(result, result.end());redis.smembers("key3", it);for (auto &elem : result){cout << "value: " << elem << endl;}
}

请添加图片描述

hash

hset

用于为哈希表中的字段赋值 。如果哈希表不存在,一个新的哈希表被创建并进行 HSET 操作。如果字段已经存在于哈希表中,旧值将被覆盖。函数原型:

long long hset(const StringView &key, const StringView &field, const StringView &val);long long hset(const StringView &key, const std::pair<StringView, StringView> &item);template <typename Input>
auto hset(const StringView &key, Input first, Input last)-> typename std::enable_if<!std::is_convertible<Input, StringView>::value,         long long>::type;template <typename T>
long long hset(const StringView &key, std::initializer_list<T> il);

前2个版本是单个键值对。后两个版本是插入多个键值对。

hget

用于返回哈希表中指定字段的值。函数原型:

OptionalString hget(const StringView &key, const StringView &field);
  • 代码示例:
void test1(Redis &redis)
{cout << "hget 和 hset" << endl;redis.flushall();redis.hset("key1", "f1", "111");redis.hset("key1", make_pair("f2", "222"));// 一次性插入多个键值对redis.hset("key1", {make_pair("f3", "333"), make_pair("f4", "444")});vector<pair<string, string>> fields = {make_pair("f5", "555"), make_pair("f6", "666")};redis.hset("key1", fields.begin(), fields.end());auto ans = redis.hget("key1", "f3");if (ans)cout << "ans: " << ans.value() << endl;elsecout << "ans无效!" << endl;
}

请添加图片描述

hexists

用于查看哈希表的指定字段是否存在。函数原型:

bool hexists(const StringView &key, const StringView &field);

hdel

用于删除哈希表 key 中的一个或多个指定字段,不存在的字段将被忽略。函数原型:

long long hdel(const StringView &key, const StringView &field);template <typename Input>long long hdel(const StringView &key, Input first, Input last);template <typename T>long long hdel(const StringView &key, std::initializer_list<T> il) {return hdel(key, il.begin(), il.end());}
  • 代码示例:
void test2(Redis &redis)
{std::cout << "hdel" << std::endl;redis.flushall();redis.hset("key", "f1", "111");redis.hset("key", "f2", "222");redis.hset("key", "f3", "333");long long result = redis.hdel("key", "f1");std::cout << "result: " << result << std::endl;result = redis.hdel("key", {"f2", "f3"});std::cout << "result: " << result << std::endl;long long len = redis.hlen("key");std::cout << "len: " << len << std::endl;
}

请添加图片描述

hkeys

用于获取哈希表中的所有域(field)。函数原型:

template <typename Output>
void hkeys(const StringView &key, Output output);

hvals

返回哈希表所有的值。函数原型:

template <typename Output>
void hvals(const StringView &key, Output output);
  • 代码示例:
void test3(Redis &redis)
{cout << "hkeys 和 hvals" << endl;redis.flushall();redis.hset("key1", "f1", "111");redis.hset("key1", "f2", "222");redis.hset("key1", "f3", "333");vector<string> fields;auto itfie = back_inserter(fields);redis.hkeys("key1", itfie);for (auto &elem : fields){cout << "value: " << elem << endl;}vector<string> values;auto itval = back_inserter(values);redis.hvals("key1", itval);for (auto &elem : values){cout << "value: " << elem << endl;}
}

请添加图片描述

hmget

用于返回哈希表中,一个或多个给定字段的值。如果指定的字段不存在于哈希表,那么返回一个 nil 值。函数原型:

template <typename T, typename Output>void hmget(const StringView &key, std::initializer_list<T> il, Output output) {hmget(key, il.begin(), il.end(), output);}template <typename Input, typename Output>void hmget(const StringView &key, Input first, Input last, Output output);

hmset

用于同时将多个 field-value (字段-值)对设置到哈希表中。此命令会覆盖哈希表中已存在的字段。如果哈希表不存在,会创建一个空哈希表,并执行 HMSET 操作。函数原型:

template <typename Input>void hmset(const StringView &key, Input first, Input last);template <typename T>void hmset(const StringView &key, std::initializer_list<T> il) {hmset(key, il.begin(), il.end());}
  • 代码示例:
void test4(Redis &redis)
{cout << "hmget 和 hmset" << endl;redis.flushall();redis.hmset("key", {make_pair("f1", "111"),make_pair("f2", "222"),make_pair("f3", "333")});vector<pair<string, string>> pairs = {make_pair("f4", "444"),make_pair("f5", "555"),make_pair("f6", "666")};redis.hmset("key", pairs.begin(), pairs.end());vector<string> values;auto it = back_inserter(values);redis.hmget("key", {"f1", "f2", "f3"}, it);for (auto &elem : values){cout << "value: " << elem << endl;}
}

请添加图片描述

zset

zadd

往zset中插入元素。函数原型如下:

long long zadd(const StringView &key,const StringView &member,double score,UpdateType type = UpdateType::ALWAYS,bool changed = false);template <typename Input>
long long zadd(const StringView &key,Input first,Input last,UpdateType type = UpdateType::ALWAYS,bool changed = false);template <typename T>
long long zadd(const StringView &key,std::initializer_list<T> il,UpdateType type = UpdateType::ALWAYS,bool changed = false);

zrange

获取zset指定范围内的元素。函数原型如下:

template <typename Output>
void zrange(const StringView &key, long long start, long long stop, Output output);

zrange支持两种主要的风格:

  1. 只查询member,不带score
  2. 查询member同时带score
    这两种风格关键就是看插入迭代器指向的容器的类型。指向的容器只是一个string,就是查询member,指向的容器包含的是一个pair,里面有stringdouble,就是查询member同时带有string
  • 代码示例:
void test1(Redis &redis)
{cout << "zadd 和 zrange" << endl;redis.flushall();redis.zadd("key1", "吕布", 99);redis.zadd("key1", {make_pair("赵云", 98), make_pair("典韦", 97)});vector<pair<string, double>> members = {make_pair("关羽", 95), make_pair("张飞", 93)};redis.zadd("key1", members.begin(), members.end());// 只查询membersvector<string> memberRedults;auto it = back_inserter(memberRedults);redis.zrange("key1", 0, -1, it);for (auto &elem : memberRedults)cout << "members: " << elem << endl;// 查询member和scorevector<pair<string, double>> memberWithScore;auto it2 = back_inserter(memberWithScore);redis.zrange("key1", 0, -1, it2);for (const auto &elem : memberWithScore)cout << elem.first << ":" << elem.second << endl;
}

请添加图片描述

zcard

获取zset中的元素个数,函数原型如下:

long long zcard(const StringView &key);
  • 代码示例:
void test2(Redis &redis)
{cout << "zcard" << endl;redis.flushall();redis.zadd("key1", "吕布", 99);redis.zadd("key1", {make_pair("赵云", 98), make_pair("典韦", 97)});auto ans = redis.zcard("key1");cout << ans << endl;
}

请添加图片描述

zrem

删除zset中的元素。函数原型如下:

long long zrem(const StringView &key, const StringView &member);template <typename Input>long long zrem(const StringView &key, Input first, Input last);template <typename T>long long zrem(const StringView &key, std::initializer_list<T> il) {return zrem(key, il.begin(), il.end());}
  • 代码示例:
void test3(Redis &redis)
{cout << "zrem" << endl;redis.flushall();redis.zadd("key1", "张三", 90);redis.zadd("key1", "李四", 92);redis.zadd("key1", "王五", 93);redis.zadd("key1", "赵六", 88);redis.zrem("key1", "李四");long long ans = redis.zcard("key1");cout << ans << endl;
}

请添加图片描述

zscore

获取memberscore。函数原型如下:

OptionalDouble zscore(const StringView &key, const StringView &member);

zrank

获取member的排名,函数原型如下:

OptionalLongLong zrank(const StringView &key, const StringView &member);
  • 代码示例:
void test4(Redis &redis)
{cout << "zscore 和 zrank" << endl;redis.flushall();redis.zadd("key1", "张三", 90);redis.zadd("key1", "李四", 92);redis.zadd("key1", "王五", 93);redis.zadd("key1", "赵六", 88);auto score = redis.zscore("key1", "王五");if (score)cout << "score: " << score.value() << endl;elsecout << "score无效" << endl;auto rank = redis.zrank("key1", "赵六");if (rank)cout << "rank: " << rank.value() << endl;elsecout << "rank 无效" << endl;
}

请添加图片描述

相关文章:

Redis-CPP 5大类型操作

这篇文章不会讲解所有关于5大基础类型的所有命令&#xff0c;只讲解几个常用的命令操作。如果想看全部的命令操作&#xff0c;可以看其它的文章。 string set 先来看一看set操作在服务器端的函数原型&#xff1a; SET key value [expiration EX seconds|PX milliseconds] [N…...

Linux 下的 socket

1、简介 Socket&#xff0c;中文常称为“套接字”&#xff0c;是 UNIX 操作系统中引入的一种通信抽象接口&#xff0c;用于支持不同进程之间&#xff0c;特别是不同主机之间的通信。在 UNIX 哲学中&#xff0c;“一切皆文件”&#xff0c;包括网络通信也不例外。Socket 就是这种…...

链接脚本基础语法

目录 前言 ELF文件布局 链接脚本语法 段定义标准格式 地址计数器 . 地址计数器的动态特性 赋值 vs 引用 符号定义 通配符规则 COMMON块 COMMON 块的产生与处理 示例脚本 前言 由于嵌入式系统内存资源珍贵&#xff0c;链接脚本可指定代码段&#xff08;.text &#…...

Python期末速成

一.基础内容 赋值语句&#xff1a; a 1 b "mayday" 标识符规则&#xff1a; 1.字母&#xff0c;数字&#xff0c;下划线&#xff0c;汉字组成。但数字不能开头 2.不能是保留字 3.特殊符号不行&#xff0c;*&#xffe5;^等 注释是在语句前面加&#xff03; …...

Python打卡训练营Day56

DAY 56 时序数据的检验 知识点回顾&#xff1a; 假设检验基础知识 原假设与备择假设P值、统计量、显著水平、置信区间 白噪声 白噪声的定义自相关性检验&#xff1a;ACF检验和Ljung-Box 检验偏自相关性检验&#xff1a;PACF检验 平稳性 平稳性的定义单位根检验 季节性检验 ACF检…...

没掌握的知识点记录

1、微内核的主要优点在于结构清晰、内核代码量少&#xff0c;安全性和可靠性高、可移植性强、可伸缩性、可扩展性高&#xff1b;其缺点是难以进行良好的整体优化、进程间互相通信的开销大、内核功能代码不能被直接调用而带来服务的效率低。 2、题目&#xff1a; 分页内存管理…...

Python商务数据分析——Python 入门基础知识学习笔记

一、简介 1.1 Python 特性 解释型语言&#xff1a;代码无需编译可直接运行&#xff0c;适合快速开发。 动态类型&#xff1a;变量类型在运行时确定&#xff08;如x1后x"str"仍合法&#xff09;。 面向对象&#xff1a;支持类、对象、继承等特性&#xff0c;代码可…...

企业级安全实践:SSL 加密与权限管理(二)

权限管理&#xff1a;企业数据的守护者 权限管理的基本概念与重要性 权限管理&#xff0c;是指根据系统设置的安全规则或策略&#xff0c;用户可以访问且仅能访问自己被授权的资源&#xff0c;不多不少 。它是企业信息安全体系的重要组成部分&#xff0c;旨在确保只有授权的人…...

JavaScript 的 “==” 存在的坑

(双等) 指的是宽松相等 — 会做隐式类型转换 举例&#xff1a;0 // true 5 5 // true (三等) 指的是严格相等 — 类型和值都相等才 true 举例&#xff1a;0 // false 5 5 // false 在业务逻辑里经常因为隐式转换导致条件误判&#xff0c;业界普遍推荐 一律用 / !。 举…...

深度解析云计算网络架构:VLAN+OVS+Bonding构建高可靠虚拟化平台

——从物理设备到虚拟机流量的全链路剖析 核心技术组合&#xff1a;VLAN逻辑隔离 OVS虚拟交换 Bonding链路聚合 超融合网络管理 一、架构全景&#xff1a;物理与虚拟网络的协同&#xff08;附架构图&#xff09; 核心设计哲学 #mermaid-svg-VbGP3fCgNnoLVMgH {font-family:&…...

Git使用总结

1.基本概念&#xff1a; Git中的区域&#xff1a; git中有几个区域&#xff1b;本地工作区&#xff1b;本地提交区&#xff1b;origin远端。 一般来说的工作上传顺序是&#xff1a; 将修改文件添加到工作区域----提交到本地提交区域----push到远端分支 Git中的分支 远端和…...

爬虫入门练习(文字数据的爬取)

爬取csdn用户的用户简介 学习一下 BeautifulSoup方法 from bs4 import BeautifulSoup html_content """ <html> <head><title>示例网页</title> </head> <body><h1 class"main-title">欢迎学习Beauti…...

MySQL学习(1)——基础库操作

欢迎来到博主的专栏:MySQL学习 博主ID:代码小豪 文章目录 数据库原理基础库操作增删数据库数据库编码与校验规则验证不同的校验规则对于库中数据的影响 备份与恢复数据库 数据库原理 mysql版本:mysql8.0 操作系统:ubuntu22.4 为了减少由于环境配置以及权限限制带来的使用问题&…...

P99延迟:系统性能优化的关键指标

理解P99延迟 当谈论系统性能时&#xff0c;延迟指标扮演着至关重要的角色。其中&#xff0c;P99延迟作为最重要的性能指标之一&#xff0c;能够帮助我们识别系统的性能瓶颈&#xff0c;优化用户体验。 构建一个功能完善的后端系统&#xff0c;通过了所有功能测试&#xff0c;准…...

人工智能、机器人最容易取哪些体力劳动和脑力劳动

人工智能、机器人最容易取哪些体力劳动和脑力劳动 人工智能和机器人的发展可以替代人类简单的体力劳动和脑力劳动&#xff0c;但很难替代复杂的体力劳动和脑力劳动。 肌肉收缩的原理和运动特点 人类的体力劳动是靠肌肉的收缩完成的&#xff0c;其工作原理是肌肉内的肌球蛋白…...

【代码解析】opencv 安卓 SDK sample - 1 - HDR image

很久没有写安卓了&#xff0c;复习复习。用的是官方案例&#xff0c;详见opencv-Android-sdk 包 // 定义包名&#xff0c;表示该类的组织路径 package org.opencv.samples.tutorial1;// 导入所需的OpenCV和Android类库 import org.opencv.android.CameraActivity; // OpenCV…...

管理综合知识点

比与比例涉及的问题 比与比例基础知识比例的转换正反比例浓度问题利润问题增长率问题比例与面积行程问题 一、比例转换与性质 核心公式&#xff1a; 若 a : b c : d a:b c:d a:bc:d或 a b c d \frac{a}{b} \frac{c}{d} ba​dc​ → a d b c ad bc adbc&#xff08;交…...

机器学习:特征向量与数据维数概念

特征向量与数据维数概念 一、特征向量与维数的定义 特征向量与特征类别 在机器学习和数据处理中&#xff0c;每个样本通常由多个特征&#xff08;Feature&#xff09; 描述。例如&#xff0c;一张图片的特征可能包括颜色、形状、纹理等&#xff1b;一个客户的特征可能包括年龄…...

《情感反诈模拟器》2025学习版

1.2 专业内容支持 67篇情感诈骗案例研究14万字心理学分析资料783条专业配音对白 二、安装与运行 2.1 系统要求 最低配置&#xff1a; 显卡&#xff1a;GTX 1060CPU&#xff1a;i5-8400存储&#xff1a;25GB空间 2.2 运行步骤 解压游戏文件&#xff08;21.7GB&#xff09;…...

C++ - 标准库之 <string> npos(npos 概述、npos 的作用)

一、std::string::npos 概述 std::string::npos 是一个静态常量&#xff0c;表示 size_t 类型的最大值 std::string::npos 用于表示字符串操作中的未找到的位置或无效位置 std::string::npos 属于 C 标准库中的 <string> 头文件 二、std::string::npos 的作用 std::s…...

策略设计模式

1. 什么是策略模式 策略模式是一种行为型设计模式&#xff0c;它定义了一系列算法&#xff0c;并将每个算法封装起来&#xff0c;使它们可以相互替换&#xff0c;且算法的变化不会影响使用算法的客户端,客户端中的具体实现只需要了解上下文类。 2. 由什么组成 策略接口&…...

C++结构体初始化与成员函数实现语法详解

C结构体初始化与成员函数实现语法详解 一、结构体静态成员初始化语法 在C中&#xff0c;静态成员变量需要在类外部进行定义和初始化。提供的代码展示了如何为MAIN_PROPULSION_CAN类的静态成员变量进行初始化&#xff1a; MAIN_PROPULSION_CAN::VoltageThresholds MAIN_PROPU…...

第八章 网络安全

1 什么是网络安全 安全通信具有的性质&#xff1a; 机密性&#xff1a;只有发送方和希望的接收方能否理解传输的报文内容&#xff08;发送方加密报文&#xff0c;接收方解密报文&#xff09;认证&#xff08;端点鉴别&#xff09;&#xff1a;发送方和接收方需要确认对方的身…...

开源 python 应用 开发(一)python、pip、pyAutogui、python opencv安装

最近有个项目需要做视觉自动化处理的工具&#xff0c;最后选用的软件为python&#xff0c;刚好这个机会进行系统学习。短时间学习&#xff0c;需要快速开发&#xff0c;所以记录要点步骤&#xff0c;防止忘记。 链接&#xff1a; 开源 python 应用 开发&#xff08;一&#x…...

CMCC RAX3000M nand版 OpenWrt 可用空间变小的恢复方法

文章目录 问题背景尝试一、通过 Tftpd64 重新刷写 initramfs-recovery 镜像 &#xff08;不成功&#xff09;尝试二、重新分配 ubi 卷&#xff08;此操作存在一定的危险&#xff0c;请查阅相关资料&#xff0c;避免影响到核心分区&#xff09; 问题背景 CMCC RAX3000M Nand 版…...

云函数调测、部署及日志查看

1、调试云函数 业务函数开发完成后&#xff0c;需要验证函数代码的正确性&#xff0c;DevEco Studio工具支持本地调用和远程调用两种形式的调试函数方法&#xff0c;首先来看看通过本地调用方式调试函数。 1&#xff09;通过本地调用方式调试云函数 为了验证函数的正确性以及…...

逆向某物 App 登录接口:还原 newSign 算法全流程

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ newSign 参数分析 通过 Hook Java 层加密算法得到 newSign 参数相关信息如下&#xff1a; 具体参考&#xff1a;逆向某物 App 登录接口&#xff1a;抓包分析…...

2140、解决智力问题

题目 解答 正向不好做&#xff0c;反向遍历。 定义&#xff1a;dp[i] [i,n)的分数 初始化&#xff1a;dp[n]0 递推&#xff1a;dp[i]max(dp[i1],questions[i][0]dp[iquestions[i][1]1]) 如果越界了&#xff0c;就截断到dp[n] 最后return dp[0]即可 class Solution { publ…...

肖臻《区块链技术与应用》第六讲:比特币网络

一、分层架构&#xff1a;应用层之下的P2P网络 比特币并非凭空运作&#xff0c;它的协议运行在互联网的应用层之上。而在其底层&#xff0c;支撑整个系统的是一个对等网络&#xff08;Peer-to-Peer, P2P&#xff09;。可以这样理解&#xff1a; 应用层 (Application Layer): …...

(C++)素数的判断(C++教学)(C语言)

源代码&#xff1a; #include <iostream> using namespace std;int fun(int num){if(num<1){return 1;}if(num%20){return 0;}else{return 2;} }int main(){while (1){int y0;int num0;cout<<"请输入一个整数&#xff1a;\n";cin>>num;yfun(nu…...

openai-agents实现input_guardrails

目录 版本模块引入自定义LLM模型input_guardrail设置main函数 代码&#xff1a; input_guardrails.ipynb 版本 import agents print(agents.__version__)0.0.19模块引入 from __future__ import annotationsfrom pydantic import BaseModelfrom agents import (Agent,Guardr…...

在高数中 导数 微分 不定积分 定积分 的意义以及联系

在高等数学中&#xff0c;导数、微分、不定积分、定积分是微积分的核心概念&#xff0c;它们既有明确的定义和几何/物理意义&#xff0c;又相互关联。下面分别说明它们的意义&#xff0c;并总结它们之间的联系。 导数的意义 定义&#xff1a; 函数 y f(x) 在点 x 处的导数定义…...

Linux系统基本操作指令

Linux系统基本操作指令 文章目录 Linux系统基本操作指令一、介绍二、基础设置2.1 设置ubuntu与window的共享目录2.2 ubuntu系统简单介绍 三、Linux命令及工具介绍3.1 目录管理命令(功能&#xff0c;格式&#xff0c;参数&#xff0c;系统参数)3.2 文件操作命令 四、网络命令4.1…...

「Linux文件及目录管理」vi、vim编辑器

知识点解析 vi/vim编辑器简介 vi:Linux默认的文本编辑器,基于命令行操作,功能强大。vim:vi的增强版,支持语法高亮、多窗口编辑、插件扩展等功能。vi/vim基本模式 命令模式:默认模式,用于移动光标、复制、粘贴、删除等操作。插入模式:按i进入,用于输入文本。末行模式:…...

等等等等等等

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。 …...

JAVA集合篇--深入理解ConcurrentHashMap图解版

一、前言 在Java并发编程中&#xff0c;线程安全的Map实现一直是一个重要话题。虽然我们可以使用Collections.synchronizedMap()或者HashTable来获得线程安全的Map&#xff0c;但它们的性能在高并发场景下往往不尽人意。ConcurrentHashMap作为Java并发包中的重要组件&#xff0…...

Python嵌套循环

一、前言 在 Python 编程中&#xff0c;嵌套循环&#xff08;Nested Loops&#xff09; 是指在一个循环的内部再嵌套另一个循环。这种结构常用于处理多维数据结构&#xff08;如二维数组、矩阵&#xff09;、遍历组合数据、图形绘制等场景。 虽然嵌套循环在逻辑上更复杂&…...

linux编译安装nginx

1.到官网(nginx)下载nginx压缩包&#xff1a; 2.以&#xff08;nginx-1.24.0.tar.gz&#xff09;为例&#xff1a; 1.上传压缩包至linux服务器&#xff1a; rz 2.解压压缩包nginx-1.24.0.tar.gz&#xff1a; tar -zxvf nginx-1.24.0.tar.gz 3.在安装Nginx之前&#xff0c;需…...

算法-动态规划-钢条切割问题

钢条切割问题是一个经典的动态规划问题&#xff0c;旨在通过切割钢条获得最大收益。以下是详细解释和解决方案&#xff1a; 问题描述 给定长度为 n 的钢条和价格表 p&#xff0c;其中 p[i] 表示长度为 i 的钢条的价格&#xff08;i 1, 2, ..., n&#xff09;。目标&#xff…...

Java八股文——系统场景设计

如何设计一个秒杀场景&#xff1f; 面试官您好&#xff0c;设计一个秒杀系统&#xff0c;是对一个工程师综合技术能力的巨大考验。它的核心挑战在于&#xff0c;如何在极短的时间内&#xff0c;应对超高的并发请求&#xff0c;同时保证数据&#xff08;尤其是库存&#xff09;…...

如何在FastAPI中玩转GitHub认证,让用户一键登录?

title: 如何在FastAPI中玩转GitHub认证,让用户一键登录? date: 2025/06/22 09:11:47 updated: 2025/06/22 09:11:47 author: cmdragon excerpt: GitHub第三方认证集成通过OAuth2.0授权码流程实现,包含用户跳转GitHub认证、获取授权码、交换访问令牌及调用API获取用户信息四…...

[RPA] 影刀RPA实用技巧

1.给数字添加千分位分隔符 将变量variable的数值(2025.437)添加千分位分隔符&#xff0c;使其变为2,025.437 流程搭建&#xff1a; 关键指令&#xff1a; 2.删除网页元素 将bilibili官网的"动态"图标进行删除 流程搭建&#xff1a; 关键指令&#xff1a; 呈现效果…...

RA4M2开发IOT(7)----RA4M2驱动涂鸦CBU模组

RA4M2开发IOT.7--RA4M2驱动涂鸦CBU模组 概述视频教学样品申请硬件准备参考程序初始化 LSM6DSV16X 传感器初始化单双击识别主程序接口RA4M2接口生成UARTUART属性配置R_SCI_UART_Open()函数原型回调函数user_uart_callback0 ()变量定义更新敲击状态DP同步长按进入配网涂鸦协议解析…...

华为公布《鸿蒙编程语言白皮书》V1.0 版:解读适用场景

6 月 22 日消息&#xff0c;华为现已在其开发者网站上架《鸿蒙编程语言白皮书》V1.0 版本&#xff0c;主要围绕鸿蒙 HarmonyOS 整体框架、适用场景、演进策略、未来愿景四大角度进行阐述&#xff0c;文档访问地址&#xff08;https://developer.huawei.com/consumer/cn/doc/gui…...

多源异构数据接入与实时分析:衡石科技的技术突破

在数字化转型的浪潮中&#xff0c;企业每天产生的数据量呈指数级增长。这些数据来自CRM系统、IoT设备、日志文件、社交媒体、交易平台等众多源头&#xff0c;格式各异、结构混乱、流速不一。传统的数据处理方式如同在无数孤立的岛屿间划着小船传递信息&#xff0c;效率低下且无…...

多设备Obsidian笔记同步:WebDAV与内网穿透技术高效实现教程

文章目录 前言1. Windows开启Webdav服务2. 客户端测试3. 安装Cpolar内网穿透实现公网访问Webdav4. 同步PC端笔记至WebDav4.1 首先需要在IIS中添加md的格式4.2 在Obsidian中安装第三方插件 5. 同步手机端笔记至WebDav 前言 各位好&#xff01;在数字化浪潮席卷的当下&#xff0…...

Linux->进程概念(精讲)

引入&#xff1a;本文会讲到的东西有哪些&#xff1f; 注&#xff1a;要讲就讲清楚&#xff0c;所以从0到懂&#xff0c;目录在右侧 一&#xff1a;冯诺依曼体系结构 1&#xff1a;人物介绍 冯诺依曼是一个伟大的人&#xff0c;他提出了一个体系结构&#xff0c;被命名冯诺依…...

【舞蹈】PC-Dance:姿势可控的音乐驱动舞蹈合成

PC-Dance:姿势可控的音乐驱动舞蹈合成 自监督节奏对齐学习音乐到舞蹈的对齐嵌入-PC-Syn 中,依然怒了一种用于 自适应运动图构建(AMGC)的高效方案,可以基于图的优化效率并保持动作的多样性。 舞蹈合成 整体情况 我们的系统主要由音乐到舞蹈对齐嵌 入网络(M2D-Align)和姿势…...

uni-app项目实战笔记22--图片预览和切换

需求描述&#xff1a; 1、图片预览时&#xff0c;通常需要知道&#xff0c;当前预览的是第几张&#xff0c;总共有多少张图片&#xff1b; 2、当用户左右滑动切换预览图片时&#xff0c;当前预览索引需要随着进行切换。 下面简单介绍下实现过程&#xff1a; 1、在图片列表页…...

[特殊字符] AIGC工具深度实战:GPT与通义灵码如何彻底重构企业开发流程

&#x1f50d; 第一模块&#xff1a;理念颠覆——为什么AIGC不是“玩具”而是“效能倍增器”&#xff1f; ▍企业开发的核心痛点图谱&#xff08;2025版&#xff09; ​​研发效能瓶颈​​&#xff1a;需求膨胀与交付时限矛盾持续尖锐&#xff0c;传统敏捷方法论已触天花板​…...