分布式服务器框架之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]);
} 


相关文章
|
运维 Prometheus 监控
如何在测试环境中保持操作系统、浏览器版本和服务器配置的稳定性和一致性?
如何在测试环境中保持操作系统、浏览器版本和服务器配置的稳定性和一致性?
|
JavaScript 数据可视化 Docker
简易制作MCP服务器并测试
本文介绍了如何简易制作并测试MCP服务器,包括环境搭建、代码实现及Docker部署。首先通过uv包创建项目,在main.py中定义MCP服务器及其工具和资源函数。接着详细说明了在Windows上安装uv、配置Docker镜像加速、生成requirements.txt文件以及编写Dockerfile的过程。最后,通过构建和运行Docker容器部署MCP服务器,并使用Node.js工具测试其功能,确保服务器正常工作。此教程适合初学者快速上手MCP服务器的开发与部署。
4958 63
|
10月前
|
存储 消息中间件 NoSQL
【Redis】常用数据结构之List篇:从常用命令到典型使用场景
本文将系统探讨 Redis List 的核心特性、完整命令体系、底层存储实现以及典型实践场景,为读者构建从理论到应用的完整认知框架,助力开发者在实际业务中高效运用这一数据结构解决问题。
|
存储 缓存 安全
只会“有序无序”?面试官嫌弃的List、Set、Map回答!
小米,一位热衷于技术分享的程序员,通过与朋友小林的对话,详细解析了Java面试中常见的List、Set、Map三者之间的区别,不仅涵盖了它们的基本特性,还深入探讨了各自的实现原理及应用场景,帮助面试者更好地准备相关问题。
530 20
|
缓存 Ubuntu Linux
Linux环境下测试服务器的DDR5内存性能
通过使用 `memtester`和 `sysbench`等工具,可以有效地测试Linux环境下服务器的DDR5内存性能。这些工具不仅可以评估内存的读写速度,还可以检测内存中的潜在问题,帮助确保系统的稳定性和性能。通过合理配置和使用这些工具,系统管理员可以深入了解服务器内存的性能状况,为系统优化提供数据支持。
1865 4
|
存储 消息中间件 NoSQL
Redis数据结构:List类型全面解析
Redis数据结构——List类型全面解析:存储多个有序的字符串,列表中每个字符串成为元素 Eelement,最多可以存储 2^32-1 个元素。可对列表两端插入(push)和弹出(pop)、获取指定范围的元素列表等,常见命令。 底层数据结构:3.2版本之前,底层采用**压缩链表ZipList**和**双向链表LinkedList**;3.2版本之后,底层数据结构为**快速链表QuickList** 列表是一种比较灵活的数据结构,可以充当栈、队列、阻塞队列,在实际开发中有很多应用场景。
|
NoSQL 测试技术 Redis
Redis 性能测试
10月更文挑战第21天
353 2
|
NoSQL 关系型数据库 MySQL
Redis 列表(List)
10月更文挑战第16天
270 2
|
数据可视化 前端开发 测试技术
接口测试新选择:Postman替代方案全解析
在软件开发中,接口测试工具至关重要。Postman长期占据主导地位,但随着国产工具的崛起,越来越多开发者转向更适合中国市场的替代方案——Apifox。它不仅支持中英文切换、完全免费不限人数,还具备强大的可视化操作、自动生成文档和API调试功能,极大简化了开发流程。
|
Java 测试技术 容器
Jmeter工具使用:HTTP接口性能测试实战
希望这篇文章能够帮助你初步理解如何使用JMeter进行HTTP接口性能测试,有兴趣的话,你可以研究更多关于JMeter的内容。记住,只有理解并掌握了这些工具,你才能充分利用它们发挥其应有的价值。+
1628 23