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

本文涉及的产品
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]);
} 


相关文章
|
3月前
|
存储 消息中间件 NoSQL
【Redis】常用数据结构之List篇:从常用命令到典型使用场景
本文将系统探讨 Redis List 的核心特性、完整命令体系、底层存储实现以及典型实践场景,为读者构建从理论到应用的完整认知框架,助力开发者在实际业务中高效运用这一数据结构解决问题。
|
算法 Java 数据处理
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其“不重复性”要求,彻底改变了处理唯一性数据的方式。
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其“不重复性”要求,彻底改变了处理唯一性数据的方式。HashSet基于哈希表实现,提供高效的元素操作;TreeSet则通过红黑树实现元素的自然排序,适合需要有序访问的场景。本文通过示例代码详细介绍了两者的特性和应用场景。
193 6
|
存储 Java 数据处理
Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位
【10月更文挑战第16天】Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位。本文通过快速去重和高效查找两个案例,展示了Set如何简化数据处理流程,提升代码效率。使用HashSet可轻松实现数据去重,而contains方法则提供了快速查找的功能,彰显了Set在处理大量数据时的优势。
166 2
|
存储 消息中间件 NoSQL
Redis数据结构:List类型全面解析
Redis数据结构——List类型全面解析:存储多个有序的字符串,列表中每个字符串成为元素 Eelement,最多可以存储 2^32-1 个元素。可对列表两端插入(push)和弹出(pop)、获取指定范围的元素列表等,常见命令。 底层数据结构:3.2版本之前,底层采用**压缩链表ZipList**和**双向链表LinkedList**;3.2版本之后,底层数据结构为**快速链表QuickList** 列表是一种比较灵活的数据结构,可以充当栈、队列、阻塞队列,在实际开发中有很多应用场景。
|
存储 Java 数据处理
Set 是 Java 集合框架中的一个接口,不包含重复元素且不保证元素顺序。
【10月更文挑战第16天】Java Set:无序之美,不重复之魅!Set 是 Java 集合框架中的一个接口,不包含重复元素且不保证元素顺序。通过 hashCode() 和 equals() 方法实现唯一性,适用于需要唯一性约束的数据处理。示例代码展示了如何使用 HashSet 添加和遍历元素,体现了 Set 的高效性和简洁性。
209 4
|
存储 Java 数据处理
Set 是 Java 集合框架中的一个接口,不包含重复元素且不保证元素顺序。
Java Set:无序之美,不重复之魅!Set 是 Java 集合框架中的一个接口,不包含重复元素且不保证元素顺序。它通过 hashCode() 和 equals() 方法确保元素唯一性,适用于需要唯一性约束的数据处理。示例代码展示了如何使用 HashSet 实现这一特性。
168 5
|
NoSQL 关系型数据库 MySQL
Redis 列表(List)
10月更文挑战第16天
179 2
|
算法 Java 数据处理
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其独特的“不重复性”要求,彻底改变了处理唯一性约束数据的方式。
【10月更文挑战第14天】从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其独特的“不重复性”要求,彻底改变了处理唯一性约束数据的方式。本文深入探讨Set的核心理念,并通过示例代码展示了HashSet和TreeSet的特点和应用场景。
126 2
|
缓存 NoSQL Redis
更换Redis后,需要测试那些东西
个人简单的一些理解
1350 0
|
7月前
|
缓存 NoSQL 关系型数据库
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?

热门文章

最新文章