在 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()
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)