分布式服务器框架之Servers.Common中使用CSRedis测试操作Redis中的string、hash_table、list、set、zset

简介: 在Servers.Common类库总创建了一个TestRedis.cs文件,我是在Servers.GameServer中去初始化的。主要是测试了Redis中常用的数据类型和常用的API,有一些不常用的可能没有写。需要详细了解API的话可以安装上CSRedis之后F12追进去查看,上面有详细的API说明。

在Servers.Common类库总创建了一个TestRedis.cs文件,我是在Servers.GameServer中去初始化的。主要是测试了Redis中常用的数据类型和常用的API,有一些不常用的可能没有写。需要详细了解API的话可以安装上CSRedis之后F12追进去查看,上面有详细的API说明。

2d233b4373984ce8a248cd8ee4be059c.png

String类型


往redis里面写一个key为TestKey,value为111的键值对


private void TestAdd()
{
     RedisHelper.Set("TestKey", 111);
}


HashTable类型


hash table类型准确的来说是个二维的键值对结构key:{key:value},外层的key是一个hash table 的名字,里面的key才是真正的key,其实不光是hashTable,后面的集合set、list也是这样的结构只不过是少了一个key对应的value类似这样 key:{value1,value2,value3}


先写一个key作为Hash Table的名字


string key = "AccountHash";


往Hash Table里面添加元素(hash table 的操作都是以H开头)


RedisHelper.HSet(key, "1", "account1");
RedisHelper.HSet(key, "2", "account2");
RedisHelper.HSet(key, "3", "account3");
RedisHelper.HSet(key, "999", "account999");


通过key和filedKey获取到value


string value = RedisHelper.HGet(key, "1");


通过缓存壳获取(如果没有这个key和fieldKey对应的value,则会创建value,只不过需要注意的是如果通过这个函数创建的value会有一层外壳,会记录真实的value和创建时间,在实际开发中不可以混用,否则会出问题)=GetOrAdd


string value = RedisHelper.CacheShell(key, "4", -1, () => { return "account4"; });


根绝key和filedKey删除value


RedisHelper.HDel(key,"4");


通过key获取到hash table内的所有内容


//get all item
 RedisScan<(string field, string value)> m_pair = RedisHelper.HScan(key, 0);
(string field, string value) item;
(string field, string value)[] items = m_pair.Items;
for (int i = 0; i < items.Length; ++i)
{
    item = items[i];
    Console.WriteLine("for:{0} filed{1} value{2}", i, item.field, item.value);
}


根绝key获取到hash table的长度


RedisHelper.HLen(key)


List类型


需要定义一个List的key和上面的hash table 要取一个合理的名字,操作list的大部分API都是以L开头。


List添加元素(如果list已经存在,会往该list的尾部插入元素)


RedisHelper.RPush(key, "角色1", "角色2", "角色3");


根据Index获取List中的value (如果没有该index返回空字符换)


 RedisHelper.LIndex(key, 10)


获取范围内的value(如果写的范围超出了,会返回所有的元素,不会报错)


string[] arrValue = RedisHelper.LRange(key, 0, 3);
for (int i = 0; i < arrValue.Length; ++i)
{
     Console.WriteLine(" i:{0} value:{1}", i, arrValue[i]);
}


在某个元素之前插入元素


RedisHelper.LInsertBefore(key, "角色1", "Before角色1");


在某个元素之后插入元素


RedisHelper.LInsertAfter(key, "角色3", "After角色3");


从尾巴弹出value(redis中的list其实更像一个和栈的混合体)


RedisHelper.RPop(key)


从头部弹出value(感觉同上)


RedisHelper.LPop(key)


设置Value(其实这个API更应该叫Repleace,如果该index没有元素,redis会抛出异常)


RedisHelper.LSet(key,3, "角色11");


Set类型


set类型也叫集合类型,存的时候会计算这个key的hash值,一个key只允许存在一次。操作Set的API大多是以S开头。 还是像上面一样需要设置一个Set的名字作为Key去操作这个Set。


添加操作  (会返回成功添加的数量,会自动去重)


RedisHelper.SAdd(key, "账号1", "账号2", "账号3", "账号3", "账号4", "账号5", "账号5");


检查Set中的key是否存在


RedisHelper.SIsMember(key, "账号11")


检查Set中的数量(这个名字很有意思叫Card)


RedisHelper.SCard(key)


移除并返回集合中的一个或多个随机元素(其实这个功能比较诡异,想不通哪里会用到会弹出随机数量的功能)


//随机弹出一个
RedisHelper.SPop(key, 1)


删除


RedisHelper.SRem(key, "账号1");


获得集合的数组(和redis里的顺序不一样)


string[] arrMembers = RedisHelper.SMembers(key);
for (int i = 0; i < arrMembers.Length; ++i)
{
   Console.WriteLine("i:{0} value:{1}", i, arrMembers[i]);
}


ZSet类型


ZSet也叫ZOrderSet或者是自动排序集合,可以根据用户指定的规则在Redis内部进行自动排序。无需用户操心排序的问题,只管插入就行。下文说的key其实=value,其实感觉用value不太合适,这个感觉像是第二个维度的key,score更像是value。操作ZSet的API大都是以Z开头。


添加数据(如果有相同的key的话,会用后插入的覆盖先插入的数据)


for (int i = 1; i <= 30; ++i)
{
   int iRoleId = 1000 + i;
   double score = new Random().Next(1, 1000);
   RedisHelper.ZAdd(key, ((decimal, object))(score, iRoleId));
   Console.WriteLine("ZAdd key:{0} roleId:{1} score:{2}", key, iRoleId, score);
}


获取到指定排名的key(我是获取到前20的key)


string[] szZRange = RedisHelper.ZRange(key,0,20);
for (int i = 0; i < szZRange.Length; ++i)
{
   Console.WriteLine("ZRange i:{0} value:{1}",i,szZRange[i]);
}


获取到排名前20的数据(最常用排序,包括score和key)


(string value, decimal score) tpKv;
(string value,decimal score)[] tpszKv= RedisHelper.ZRangeWithScores(key, 0, 20);
for (int i = 0; i < tpszKv.Length; ++i)
{
   tpKv = tpszKv[i];
   Console.WriteLine("ZRange i:{0} value:{1} score:{2}", i, tpKv.value, tpKv.score);
}


总数量


long count = RedisHelper.ZCard(key);


根据Score范围找到key数组


string[] szRoleId = RedisHelper.ZRangeByScore(key,100,200);
for (int i = 0; i < szRoleId.Length; ++i)
{
     Console.WriteLine(" ZRangeByScore i:{0} key:{1}",i, szRoleId[i]);
} 


相关文章
|
数据采集 存储 数据可视化
分布式爬虫框架Scrapy-Redis实战指南
本文介绍如何使用Scrapy-Redis构建分布式爬虫系统,采集携程平台上热门城市的酒店价格与评价信息。通过代理IP、Cookie和User-Agent设置规避反爬策略,实现高效数据抓取。结合价格动态趋势分析,助力酒店业优化市场策略、提升服务质量。技术架构涵盖Scrapy-Redis核心调度、代理中间件及数据解析存储,提供完整的技术路线图与代码示例。
1782 0
分布式爬虫框架Scrapy-Redis实战指南
|
9月前
|
存储 消息中间件 NoSQL
【Redis】常用数据结构之List篇:从常用命令到典型使用场景
本文将系统探讨 Redis List 的核心特性、完整命令体系、底层存储实现以及典型实践场景,为读者构建从理论到应用的完整认知框架,助力开发者在实际业务中高效运用这一数据结构解决问题。
|
消息中间件 运维 数据库
Seata框架和其他分布式事务框架有什么区别
Seata框架和其他分布式事务框架有什么区别
587 153
|
监控 Java 调度
SpringBoot中@Scheduled和Quartz的区别是什么?分布式定时任务框架选型实战
本文对比分析了SpringBoot中的`@Scheduled`与Quartz定时任务框架。`@Scheduled`轻量易用,适合单机简单场景,但存在多实例重复执行、无持久化等缺陷;Quartz功能强大,支持分布式调度、任务持久化、动态调整和失败重试,适用于复杂企业级需求。文章通过特性对比、代码示例及常见问题解答,帮助开发者理解两者差异,合理选择方案。记住口诀:单机简单用注解,多节点上Quartz;若是任务要可靠,持久化配置不能少。
1060 4
|
存储 监控 数据可视化
常见的分布式定时任务调度框架
分布式定时任务调度框架用于在分布式系统中管理和调度定时任务,确保任务按预定时间和频率执行。其核心概念包括Job(任务)、Trigger(触发器)、Executor(执行器)和Scheduler(调度器)。这类框架应具备任务管理、任务监控、良好的可扩展性和高可用性等功能。常用的Java生态中的分布式任务调度框架有Quartz Scheduler、ElasticJob和XXL-JOB。
5843 66
|
数据采集 人工智能 分布式计算
MaxFrame:链接大数据与AI的高效分布式计算框架深度评测与实践!
阿里云推出的MaxFrame是链接大数据与AI的分布式Python计算框架,提供类似Pandas的操作接口和分布式处理能力。本文从部署、功能验证到实际场景全面评测MaxFrame,涵盖分布式Pandas操作、大语言模型数据预处理及企业级应用。结果显示,MaxFrame在处理大规模数据时性能显著提升,代码兼容性强,适合从数据清洗到训练数据生成的全链路场景...
872 5
MaxFrame:链接大数据与AI的高效分布式计算框架深度评测与实践!
|
人工智能 分布式计算 大数据
MaxFrame 产品评测:大数据与AI融合的Python分布式计算框架
MaxFrame是阿里云MaxCompute推出的自研Python分布式计算框架,支持大规模数据处理与AI应用。它提供类似Pandas的API,简化开发流程,并兼容多种机器学习库,加速模型训练前的数据准备。MaxFrame融合大数据和AI,提升效率、促进协作、增强创新能力。尽管初次配置稍显复杂,但其强大的功能集、性能优化及开放性使其成为现代企业与研究机构的理想选择。未来有望进一步简化使用门槛并加强社区建设。
692 8
|
存储 缓存 安全
只会“有序无序”?面试官嫌弃的List、Set、Map回答!
小米,一位热衷于技术分享的程序员,通过与朋友小林的对话,详细解析了Java面试中常见的List、Set、Map三者之间的区别,不仅涵盖了它们的基本特性,还深入探讨了各自的实现原理及应用场景,帮助面试者更好地准备相关问题。
491 20
|
运维 数据挖掘 索引
服务器数据恢复—Lustre分布式文件系统服务器数据恢复案例
5台节点服务器,每台节点服务器上有一组RAID5阵列。每组RAID5阵列上有6块硬盘(其中1块硬盘设置为热备盘,其他5块硬盘为数据盘)。上层系统环境为Lustre分布式文件系统。 机房天花板漏水导致这5台节点服务器进水,每台服务器都有至少2块硬盘出现故障。每台服务器中的RAID5阵列短时间内同时掉线2块或以上数量的硬盘,导致RAID崩溃,服务器中数据无法正常读取。
|
分布式计算 大数据 数据处理
技术评测:MaxCompute MaxFrame——阿里云自研分布式计算框架的Python编程接口
随着大数据和人工智能技术的发展,数据处理的需求日益增长。阿里云推出的MaxCompute MaxFrame(简称“MaxFrame”)是一个专为Python开发者设计的分布式计算框架,它不仅支持Python编程接口,还能直接利用MaxCompute的云原生大数据计算资源和服务。本文将通过一系列最佳实践测评,探讨MaxFrame在分布式Pandas处理以及大语言模型数据处理场景中的表现,并分析其在实际工作中的应用潜力。
646 2