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

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 在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]);
} 


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
2天前
|
机器学习/深度学习 前端开发 测试技术
探索软件测试中的自动化测试框架选择与优化策略####
本文深入探讨了在当前软件开发生命周期中,自动化测试框架的选择对于提升测试效率、保障产品质量的重要性。通过分析市场上主流的自动化测试工具,如Selenium、Appium、Jest等,结合具体项目需求,提出了一套系统化的选型与优化策略。文章首先概述了自动化测试的基本原理及其在现代软件开发中的角色变迁,随后详细对比了各主流框架的功能特点、适用场景及优缺点,最后基于实际案例,阐述了如何根据项目特性量身定制自动化测试解决方案,并给出了持续集成/持续部署(CI/CD)环境下的最佳实践建议。 --- ####
|
3天前
|
Java 测试技术 持续交付
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
本文重点讲解如何搭建App自动化测试框架的思路,而非完整源码。主要内容包括实现目的、框架设计、环境依赖和框架的主要组成部分。适用于初学者,旨在帮助其快速掌握App自动化测试的基本技能。文中详细介绍了从需求分析到技术栈选择,再到具体模块的封装与实现,包括登录、截图、日志、测试报告和邮件服务等。同时提供了运行效果的展示,便于理解和实践。
21 4
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
|
2天前
|
测试技术 API Android开发
探索软件测试中的自动化框架选择与实践####
本文深入探讨了软件测试领域内,面对众多自动化测试框架时,如何依据项目特性和团队需求做出明智选择,并分享了实践中的有效策略与技巧。不同于传统摘要的概述方式,本文将直接以一段实践指南的形式,简述在选择自动化测试框架时应考虑的核心要素及推荐路径,旨在为读者提供即时可用的参考。 ####
|
6天前
|
测试技术 Android开发 UED
探索软件测试中的自动化框架选择
【10月更文挑战第29天】 在软件开发的复杂过程中,测试环节扮演着至关重要的角色。本文将深入探讨自动化测试框架的选择,分析不同框架的特点和适用场景,旨在为软件开发团队提供决策支持。通过对比主流自动化测试工具的优势与局限,我们将揭示如何根据项目需求和团队技能来选择最合适的自动化测试解决方案。此外,文章还将讨论自动化测试实施过程中的关键考虑因素,包括成本效益分析、维护难度和扩展性等,确保读者能够全面理解自动化测试框架选择的重要性。
23 1
|
8天前
|
机器学习/深度学习 自然语言处理 并行计算
DeepSpeed分布式训练框架深度学习指南
【11月更文挑战第6天】随着深度学习模型规模的日益增大,训练这些模型所需的计算资源和时间成本也随之增加。传统的单机训练方式已难以应对大规模模型的训练需求。
35 3
|
4天前
|
机器学习/深度学习 自然语言处理 物联网
探索自动化测试框架的演变与未来趋势
随着软件开发行业的蓬勃发展,软件测试作为保障软件质量的重要环节,其方法和工具也在不断进化。本文将深入探讨自动化测试框架从诞生至今的发展历程,分析当前主流框架的特点和应用场景,并预测未来的发展趋势,为软件开发团队选择合适的自动化测试解决方案提供参考。
|
7天前
|
测试技术 持续交付
探索软件测试中的自动化框架:优势与挑战
【10月更文挑战第28天】 随着软件开发的快速进步,自动化测试已成为确保软件质量的关键步骤。本文将探讨自动化测试框架的优势和面临的挑战,以及如何有效地克服这些挑战。
21 0
|
2月前
|
Java 索引
java基础(13)String类
本文介绍了Java中String类的多种操作方法,包括字符串拼接、获取长度、去除空格、替换、截取、分割、比较和查找字符等。
36 0
java基础(13)String类
|
25天前
|
Java
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
本文深入探讨了Java中方法参数的传递机制,包括值传递和引用传递的区别,以及String类对象的不可变性。通过详细讲解和示例代码,帮助读者理解参数传递的内部原理,并掌握在实际编程中正确处理参数传递的方法。关键词:Java, 方法参数传递, 值传递, 引用传递, String不可变性。
50 1
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
|
21天前
|
安全 Java 测试技术
Java零基础-StringBuffer 类详解
【10月更文挑战第9天】Java零基础教学篇,手把手实践教学!
21 2
下一篇
无影云桌面