Redis之 散列(hashes)

来源:互联网 发布:电脑软件开发学校 编辑:程序博客网 时间:2024/06/06 00:01

Redis hash 看起来就像一个 “hash” 的样子,由键值对组成:

Hash 便于表示 objects,实际上,你可以放入一个 hash 的域数量实际上没有限制(除了可用内存以外)。所以,你可以在你的应用中以不同的方式使用 hash。

值得注意的是,小的 hash 被用特殊方式编码,非常节约内存。


1、删除操作

        /// <summary>        /// 根据hashId移除指定key的数据        /// 原指令:HDEL key field [field ...]        /// 时间复杂度:O(1)        /// 参考:http://www.redis.cn/commands/hdel.html        /// </summary>        public bool Remove(string hashId, string key)        {            return Redis.RemoveEntryFromHash(hashId, key);        }        /// <summary>        /// 移除未指定hashId的key数据        /// 从 key 指定的哈希集中移除指定的域。在哈希集中不存在的域将被忽略。        /// 如果 key 指定的哈希集不存在,它将被认为是一个空的哈希集,该命令将返回0。        /// 原指令:HDEL key field [field ...]        /// 时间复杂度:O(N) N是被删除的字段数量。        /// </summary>        public bool Remove(string key)        {            return Redis.Remove(key);        }        /// <summary>        /// 移除未指定hashId的所有keys的数据        /// 原指令:HDEL key field [field ...]        /// 时间复杂度:O(N) N是被删除的字段数量。        /// </summary>        /// <param name="keys"></param>        /// <returns></returns>        public void RemoveAll(string[] keys)        {            Redis.RemoveAll(keys);        }       
2、Set操作

/// <summary>        /// 设置 key 指定的哈希集中指定字段的值。        /// 如果 key 指定的哈希集不存在,会创建一个新的哈希集并与 key 关联。        /// 如果字段在哈希集中存在,它将被重写,返回False。        /// 原指令:HSET key field value        /// 时间复杂度:O(1)        ///         /// </summary>        public bool Set<T>(string hashId, string key, T t)        {            string value = redisOper.SerializeToString<T>(t);            return Redis.SetEntryInHash(hashId, key, value);        }        /// <summary>        /// 设置 key 指定的哈希集中指定字段的值。        /// 如果不存在则写入,true,如果存在则不写入返回false        /// </summary>        /// <typeparam name="T"></typeparam>        /// <param name="hashId"></param>        /// <param name="key"></param>        /// <param name="t"></param>        /// <returns></returns>        public bool SetIfNotExists<T>(string hashId, string key, T t)        {            string value = redisOper.SerializeToString<T>(t);            return Redis.SetEntryInHashIfNotExists(hashId, key, value);        }

3、Get 操作

/// <summary>        /// 返回 key 指定的哈希集包含的字段的数量。        /// 原指令:HLEN key        /// 时间复杂度:O(1)        /// 参考:http://www.redis.cn/commands/hlen.html        /// </summary>        /// <param name="hashId"></param>        /// <returns></returns>        public long GetLen(string hashId)        {            return Redis.GetHashCount(hashId);        }        /// <summary>        /// 返回 key 指定的哈希集中该字段所关联的值        /// 原指令:HGET key field        /// 时间复杂度:O(1)        /// 参考:http://www.redis.cn/commands/hget.html        /// </summary>        public T Get<T>(string hashId, string key)        {            string value = Redis.GetValueFromHash(hashId, key);            return redisOper.DeserializeFromString<T>(value);        }        /// <summary>        /// 返回 key 指定的哈希集中指定字段的值。        /// 对于哈希集中不存在的每个字段,返回 nil 值。因为不存在的keys被认为是一个空的哈希集,        /// 对一个不存在的 key 执行 HMGET 将返回一个只含有 nil 值的列表        /// 原指令:HMGET key field [field ...]        /// 时间复杂度:O(N)        /// 参考:http://www.redis.cn/commands/hmget.html        /// </summary>        /// <typeparam name="T"></typeparam>        /// <param name="hashId"></param>        /// <param name="keys"></param>        /// <returns></returns>        public List<T> GetMValues<T>(string hashId, string[] keys)        {            var result = new List<T>();            var list = Redis.GetValuesFromHash(hashId, keys);            if (list != null && list.Count > 0)            {                list.ForEach(x =>                {                    result.Add(redisOper.DeserializeFromString<T>(x));                });            }            return result;        }        /// <summary>        /// 返回 hashId 指定的哈希集中所有字段的key。        /// 原指令:HGETALL key 返回 key 指定的哈希集中所有的字段和值。返回值中,每个字段名的下一个是它的值,所以返回值的长度是哈希集大小的两倍        /// 时间复杂度:O(N)        /// 参考:http://www.redis.cn/commands/hgetall.html        /// </summary>        /// <param name="hashId"></param>        /// <returns></returns>        public List<string> GetAllKeys(string hashId)        {            return Redis.GetHashKeys(hashId);        }        /// <summary>        /// 返回 hashId 指定的哈希集中所有字段的值。        /// 原指令:HVALS key/HGETALL key 这2个命令都可以 未看源码具体实现未知        /// 时间复杂度:O(N)        /// 参考:http://www.redis.cn/commands/hvals.html        /// </summary>        public List<T> GetAllValues<T>(string hashId)        {            var result = new List<T>();            var list = Redis.GetHashValues(hashId);            if (list != null && list.Count > 0)            {                list.ForEach(x =>                {                    result.Add(redisOper.DeserializeFromString<T>(x));                });            }            return result;        }        /// <summary>        /// 获取所有hashid数据集的key/value数据集合        /// </summary>        public Dictionary<string, T> GetAllEntriesFromHash<T>(string hashId)        {            var result = new Dictionary<string, T>();            var list = Redis.GetAllEntriesFromHash(hashId);            if (list != null && list.Count > 0)            {                foreach (var kv in list)                {                    result.Add(kv.Key, redisOper.DeserializeFromString<T>(kv.Value));                }            }            return result;        }

4、其他
/// <summary>        /// 判断某个数据是否存在        /// 原指令:HEXISTS key field        /// 时间复杂度:O(1)        /// 参考:http://www.redis.cn/commands/hexists.html        /// </summary>        public bool Exist(string hashId, string key)        {            return Redis.HashContainsEntry(hashId, key);        }        /// <summary>        /// i++,i--操作 自增自减操作        /// 给hashid数据集key的value加countby,返回相加后的数据        /// 为指定key的hash的field字段值执行float类型的increment加。如果field不存在,则在执行该操作前设置为0.如果出现下列情况之一,则返回错误:         /// field的值包含的类型错误(不是字符串)。当前field或者increment不能解析为一个float类型。        /// 原指令:HINCRBYFLOAT key field increment        /// 时间复杂度:O(1)        /// 参考:http://www.redis.cn/commands/hincrbyfloat.html        /// </summary>        public long IncrementValueInHash(string hashId, string key, int countBy)        {            return Redis.IncrementValueInHash(hashId, key, countBy);        }        /// <summary>        /// i++,i--操作 自增自减操作        /// 给hashid数据集key的value加countby,返回相加后的数据        /// 为指定key的hash的field字段值执行float类型的increment加。如果field不存在,则在执行该操作前设置为0.如果出现下列情况之一,则返回错误:         /// field的值包含的类型错误(不是字符串)。当前field或者increment不能解析为一个float类型。        /// 原指令:HINCRBYFLOAT key field increment        /// 时间复杂度:O(1)        /// 参考:http://www.redis.cn/commands/hincrbyfloat.html        /// </summary>        public double IncrementValueInHash(string hashId, string key, double countBy)        {            return Redis.IncrementValueInHash(hashId, key, countBy);        }        /// <summary>        /// i++,i--操作 自增自减操作        /// </summary>        /// <param name="key"></param>        /// <returns></returns>        public long IncrementValueBy(string key)        {            return Redis.IncrementValue(key);        }        /// <summary>        /// i++,i--操作 自增自减操作        /// 增加 key 指定的哈希集中指定字段的数值。如果 key 不存在,会创建一个新的哈希集并与 key 关联。        /// 如果字段不存在,则字段的值在该操作执行前被设置为 0HINCRBY 支持的值的范围限定在 64位 有符号整数        /// 原指令:HINCRBY key field increment        /// 时间复杂度:O(1)        /// 参考:http://www.redis.cn/commands/hincrby.html        /// </summary>        public long IncrementValueBy(string key, int countBy)        {            return Redis.IncrementValueBy(key, countBy);        }        public long IncrementValueBy(string key, long countBy)        {            return Redis.IncrementValueBy(key, countBy);        }        public double IncrementValueBy(string key, double countBy)        {            return Redis.IncrementValueBy(key, countBy);        }        /// <summary>        /// 设置缓存过期        /// 未指定hashId 可以设置过期时间        /// </summary>        /// <param name="key"></param>        /// <param name="datetime"></param>        /// <returns></returns>        public bool SetExpire(string key, DateTime datetime)        {            return Redis.ExpireEntryAt(key, datetime);        }        /// <summary>        /// 设置缓存过期        /// 未指定hashId 可以设置过期时间        /// </summary>        /// <param name="key"></param>        /// <param name="expireIn"></param>        /// <returns></returns>        public bool ExpireEntryIn(string key, TimeSpan expireIn)        {            return Redis.ExpireEntryIn(key, expireIn);        }



原创粉丝点击