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