怎么统计redis的hash中的某个字段个数,在线等

怎么统计redis的hash中的某个字段个数,在线等,第1张

Redis 的特性决定了它本身就不适合做统计方面的 *** 作。因为没有像 SQL 一样的结构化查询语言。这里为你提供一种解决思路,但是需要修改你的数据组织方式:

在 redis 中,如果的确有统计的需求,可以使用 SortedSet 有序集合。有序集合中每个 key 对应一个 score,可以根据 score 来排序取值。

举个例子:

redis>ZADD age 10 jack

(integer) 0

redis>ZADD age 15 tom

(integer) 0

redis>ZADD age 25 peter

(integer) 0

上面的代码为 age 这个有序集合插入了三条数据,以三人的 age 作为 score。如果你想统计年龄区间在10-20之间的,如下所示:

ZRANGEBYSCORE age 10 20

如果说你要存储的数据不是简单的字符串,没有办法直接作为 key 来存储,可以有以下两种方案解决:

将数据转为 json 格式的字符串作为 key,取出时再将 json 字符串还原为代码可支持的格式。比如在 python 中就可以使用 json.dumps 将字典转为字符串,从 redis 取出时再使用json.loads还原。

以 id 作为 key,然后再使用另外的 hash 或者其他数据结构来存储实际用户信息。这样就需要先根据统计字段查出 id,再根据 id 去查完整信息,需要有两次查询。

但是以上的解决方案只适用于你只有一个用来统计的字段,比如你提到的年龄。如果你有多种统计需求,理论上来说肯定也有解决方案,但是我觉得你应该考虑一下是否真的需要使用 redis 来完成这个工作。毕竟 redis 的使用场景限制了它无法做像 SQL 一样复杂多样的统计。你可以考虑一下其他的 NoSQL,比如 mongodb。

根据你的使用场景选择工具才是最明智的,而不是手里有把锤子就看什么都是钉子。

格式混乱,重新排版,费了好大劲。。。

你第一个函数 少了一个右面的大括号 }

if(first=='/'&&last=='/'&&star&"ation) //这句是什么意思

你自己好好看看吧,就是格式的问题。 下面是我修改完的。

#include <fstream>

#include <iostream>

#include <string>

#include <sstream>

#include <iomanip>

using namespace std

void printHash()

class Hash

{

public:

int frequency

string kw

Hash() {frequency=0}

}

Hash HashList[41]

int count=0

bool open=true

void CreateHash()//创建哈希表

{

ifstream in("keys.dat")

for(string sgetline(in,s))//逐行将数据读入到s中

{

istringstream sin(s)//创建sin流进行分离

for(string tsin>>t)//输入到t中

{

int n=t.size()

int key=((t[0]-96)*100+t[n-1]-96)%41

if(HashList[key].kw=="")

HashList[key].kw=t

else

{

while(HashList[key].kw!=t&&HashList[key].kw!="")

{

key++

if(key>40) key=0

if(HashList[key].kw=="")

HashList[key].kw=t

}

}

key=0

while(HashList[key].kw!=""&&HashList[key].kw!=t)

{

if(HashList[key].kw=="")

HashList[key].kw=t

}

}

}

}

void printHash ()

{

cout<<"@*****************Hash数组*********************@"<<endl

cout<<"数组下标"<<" 关键字"<<"出现频率"<<endl

for(int i=0i<41i++)

cout<<setw(5)<<i<<setw(14)<<HashList[i].kw<<setw(15)<<HashList[i].frequency<<endl

}

void HashCount (string t) //统计关键字

{

int n=t.size()

int key=((t[0]-96)*100+t[n-1]-96)%41

while(HashList[key].kw!="")

{

count++

if(HashList[key].kw==t)

{

HashList[key].frequency++

key++

break

}

else

key++

if(key>40)

key=0

}

if(HashList[key].kw=="")

count++

}

void HashSearch(char *file)//处理注释

{

ifstream in(file)

bool quotation=true//双引号

bool slash=true//双斜杠

bool star=true//杠星

char first='', last

string str

int tag=0

if(in.is_open())

{

for(string sgetline(in,s))

{

istringstream sin(s)

for(string tsin>>t)

{

int n=t.size()

slash=true

star=true

for(int i=0i<ni++)

{

last=t[i]

if(first<'a'||last>'z')

{

if (first == '/' &&last == '/' /* &&star &" ation */) // 这行什么意思?

{

slash=false

cout<<"slash\n"

}

else if(first=='/'&&last=='*')

{

star=false

cout<<"star\n"

}

else if (first=='*' &&last=='/' /*&" ation==false*/)

{

star=true

}

else if(last='"'/*&"ation==true*/)

quotation=false

else if( last= '"' /*&" ation==false*/)

quotation=true

if(slash &&star /*&"ation*/ )

{

t[tag++]=last

HashCount(t)

}

t[tag]='\0'

tag=0

first=last

}

}

if(!slash)break

if( /*star&"ation &&*/ t[tag]=='\0' &&tag==0 )

HashCount(t)

}

}

}

}

void printHash_2()

{

cout<<"@*****************Hash查找关键字*********************@"<<endl

cout<<"数组下标"<<" 关键字"<<"出现频率"<<endl

for(int i=0i<41i++)

cout<<setw(5)<<i<<setw(14)<<HashList[i].kw<<setw(15)<<HashList[i].frequency<<endl

cout<<count

}

void main()

{

CreateHash()

printHash()

HashSearch("file.cpp")

printHash_2()

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11355045.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存