Redis之品鉴之旅(二)
2)hash类型,上代码
using (RedisClient client = new RedisClient("127.0.0.1", 6379, "12345", 10))
{
//删除当前数据库中的所有Key 默认删除的是db0
client.FlushDb();
//删除所有数据库中的key
//client.FlushAll();
//大key
string hashid = "pengbo";
#region 向hashid集合中添加key/value
client.SetEntryInHash(hashid, "id", "001");
Console.WriteLine(client.GetValuesFromHash(hashid, "id").FirstOrDefault());
client.SetEntryInHash(hashid, "name", "world");
Console.WriteLine(client.GetValuesFromHash(hashid, "name").FirstOrDefault());
client.SetEntryInHash(hashid, "socre", "100");
Console.WriteLine(client.GetValuesFromHash(hashid, "socre").FirstOrDefault());
#endregion
#region 批量新增key的值
client.FlushDb();
Dictionary<string, string> pairs = new Dictionary<string, string>();
pairs.Add("id", "001");
pairs.Add("name", "world");
client.SetRangeInHash(hashid, pairs);
//获取当前key的值
Console.WriteLine(client.GetValueFromHash(hashid, "id"));
Console.WriteLine(client.GetValueFromHash(hashid, "name"));
//一次性的获取所有想要获取的小key(属性的)值 如果key不存在,则返回空,不抛出异常
var list = client.GetValuesFromHash(hashid, "id", "name", "abc");
Console.WriteLine("*********");
foreach (var item in list)
{
Console.WriteLine(item);
}
#endregion
#region 如果hashid集合中存在key/value则不添加返回false,如果不存在在添加key/value,返回true
client.FlushDb();
Console.WriteLine(client.SetEntryInHashIfNotExists(hashid, "name", "你好美"));
Console.WriteLine(client.SetEntryInHashIfNotExists(hashid, "name", "你好美 哈哈哈"));
Console.WriteLine(client.GetValuesFromHash(hashid, "name").FirstOrDefault());
#endregion
#region 存储对象T t到hash集合中
client.FlushDb();
//urn: 类名: id的值
client.StoreAsHash<UserInfo>(new UserInfo() { Id = 2, Name = "world", number = 0 });
//如果id存在的话,则覆盖之前相同的id 他帮助我们序列化或者反射了一些事儿
client.StoreAsHash<UserInfo>(new UserInfo() { Id = 2, Name = "world2" });
//获取对象T中ID为id的数据。 必须要有属性id,不区分大小写
Console.WriteLine(client.GetFromHash<UserInfo>(2).Name);
var olduserinfo = client.GetFromHash<UserInfo>(2);
olduserinfo.number = 4;
client.StoreAsHash<UserInfo>(olduserinfo);
Console.WriteLine("最后的结果" + client.GetFromHash<UserInfo>(2).number);
client.StoreAsHash<UserInfoTwo>(new UserInfoTwo() { Id = "001", Name = "world2" });
Console.WriteLine(client.GetFromHash<UserInfoTwo>("001").Name);
client.StoreAsHash<UserInfoTwo>(new UserInfoTwo() { Id = "002", Name = "world" });
Console.WriteLine(client.GetFromHash<UserInfoTwo>("002").Name);
UserInfo lisi = new UserInfo() { Id = 1, Name = "李四", number = 0 };
client.StoreAsHash<UserInfo>(lisi);
Console.WriteLine(client.GetFromHash<UserInfo>(1).number);
//做个自增
var oldzhang = client.GetFromHash<UserInfo>(1);
oldzhang.number++;
client.StoreAsHash<UserInfo>(oldzhang);
#endregion
#region 获取所有hashid数据集的key/value数据集合
client.FlushDb();
Dictionary<string, string> pairs2 = new Dictionary<string, string>();
pairs2.Add("id", "001");
pairs2.Add("name", "world");
client.SetRangeInHash(hashid, pairs2);
var dics = client.GetAllEntriesFromHash(hashid);
foreach (var item in dics)
{
Console.WriteLine(item.Key + ":" + item.Value);
}
#endregion
#region 获取hashid数据集中的数据总数
client.FlushDb();
Dictionary<string, string> pairs3 = new Dictionary<string, string>();
pairs3.Add("id", "001");
pairs3.Add("name", "world");
client.SetRangeInHash(hashid, pairs3);
//自己做到心中有数
Console.WriteLine(client.GetHashCount(hashid));
#endregion
#region 获取hashid数据集中所有key的集合
client.FlushDb();
Dictionary<string, string> pairs4 = new Dictionary<string, string>();
pairs4.Add("id", "001");
pairs4.Add("name", "world");
client.SetRangeInHash(hashid, pairs4);
var keys = client.GetHashKeys(hashid);
foreach (var item in keys)
{
Console.WriteLine(item);
}
#endregion
#region 获取hashid数据集中的所有value集合
client.FlushDb();
Dictionary<string, string> pairs5 = new Dictionary<string, string>();
pairs5.Add("id", "001");
pairs5.Add("name", "world");
client.SetRangeInHash(hashid, pairs5);
var values = client.GetHashValues(hashid);
foreach (var item in values)
{
Console.WriteLine(item);
}
#endregion
#region 删除hashid数据集中的key数据
client.FlushDb();
Dictionary<string, string> pairs6 = new Dictionary<string, string>();
pairs6.Add("id", "001");
pairs6.Add("name", "world");
client.SetRangeInHash(hashid, pairs6);
client.RemoveEntryFromHash(hashid, "id");
var values6 = client.GetHashValues(hashid);
foreach (var item in values6)
{
Console.WriteLine(item);
}
#endregion
#region 判断hashid数据集中是否存在key的数据
client.FlushDb();
Dictionary<string, string> pairs7 = new Dictionary<string, string>();
pairs7.Add("id", "001");
pairs7.Add("name", "world");
client.SetRangeInHash(hashid, pairs7);
Console.WriteLine(client.HashContainsEntry(hashid, "id")); //T F
Console.WriteLine(client.HashContainsEntry(hashid, "number"));// T F
#endregion
#region 给hashid数据集key的value加countby,返回相加后的数据
client.FlushDb();
Dictionary<string, string> pairs8 = new Dictionary<string, string>();
pairs8.Add("id", "001");
pairs8.Add("name", "world");
pairs8.Add("number", "2");
client.SetRangeInHash(hashid, pairs8);
Console.WriteLine(client.IncrementValueInHash(hashid, "number", 2));
//注意,存的值必须是数字类型,否则抛出异常
#endregion
#region 自定义
HashTool.StoreAsHash<UserInfoTwo>(new UserInfoTwo() { Id = "10001", Name = "world" });
var user = HashTool.GetFromHash<UserInfoTwo>("10001");
Console.WriteLine("华丽丽的结束");
#endregion
}
hash在redis里面的存储格式有两种,ZipList和Hashtable。ZipList就是压缩版的list,field及其值会依次存储,这个时候在存储时都要先找到最后一个存储的位置。如果存储的key的长度越来越多了或者说这个类的属性越来越多,这个时候找到最后一个位置时就需要使用for循环。Redis经过测试发现,当这个key也就是类的属性个数不超过512或者任意一个key或value的长度小于等于64个字节时,redis的性能影响是忽略不计的,当超过这个限定值时,redis就会使用另外一种数据结构Hashtable进行存储。
HashTable存储时就是使用key-Value的形式进行存储。通过hash算法得出需要存储值对应的hash算法的出来的值作为特征,通过这个hash算法得出的特征值理论上是不会重复的。
哎, 后面全是算法+算法+算法 以后需要恶补一下算法,可能就恍然大悟了吧
Redis之品鉴之旅(二)的更多相关文章
- Redis之品鉴之旅(一)
Redis之品鉴之旅(一) 好知识就如好酒,需要我们坐下来,静静的慢慢的去品鉴.Redis作为主流nosql数据库,在提升性能的方面是不可或缺的.下面就拿好小板凳,我们慢慢的来一一品鉴. 1)redi ...
- Redis之品鉴之旅(七)
分布式锁 1)阻塞锁: 尝试在redis中创建一个字符串结构缓存,方法传入的key,value为锁的过期时间timeout的时间戳. 若redis中没有这个key,则创建成功(即抢到锁),然后立即返回 ...
- Redis之品鉴之旅(六)
持久化 快照的方式(RDB) 文件追加方式(AOF) 快照形式: save和bgsave能快速的备份数据.但是.........., Save命令:将内存数据镜像保存为rdb文件,由于redis是单线 ...
- Redis之品鉴之旅(五)
Redis事务 原子性:就是最小的单位 一致性:好多命令,要么全部执行成功,要么全部执行失败 隔离性:一个会话和另一个会话之间是互相隔离的 持久性:执行了就执行了,数据保存在硬盘上 典型例子:银行转账 ...
- Redis之品鉴之旅(四)
发布订阅,简单场景下的发布订阅完全可以使用. 可以简单的理解,将一个公众号视为发布者,关注公众号的人视作订阅者,公众号发布一条文章或者消息,凡事订阅公众号的都可以收到消息.一个人可以订阅多个公众号,一 ...
- Redis之品鉴之旅(三)
3)Set,可以去重的.无序的集合.可以取交集.并集.zset(sorted set),有序的.去重的集合,排序不是根据value排序,而是根据score排序. using (RedisClient ...
- redis成长之路——(二)
redis操作封装 针对这些常用结构,StackExchange.Redis已经做了一些封装,不过在实际应用场景中还必须添加一些功能,例如重试等 所以对一些常功能做了一些自行封装SERedisOper ...
- Redis源码阅读(二)高可用设计——复制
Redis源码阅读(二)高可用设计-复制 复制的概念:Redis的复制简单理解就是一个Redis服务器从另一台Redis服务器复制所有的Redis数据库数据,能保持两台Redis服务器的数据库数据一致 ...
- Redis指令与数据结构(二)
0.Redis目录结构 1)Redis介绍及部署在CentOS7上(一) 2)Redis指令与数据结构(二) 3)Redis客户端连接以及持久化数据(三) 4)Redis高可用之主从复制实践(四) 5 ...
随机推荐
- 03.SpringMVC之器
整体结构介绍 在Servlet的继承结构中一共有5个类,GenericServlet和HttpServlet在java中剩下的三个类HttpServletBean.FrameworkServlet和D ...
- ant的javac任务的相关属性配置
任务和javac命令是相似,它编译两种类型的Java文件1)没有被编译的java文件2)曾经编译过,但是class文件版本和当前对应的java文件版本不匹配的java文件. 1)javac命令支持的参 ...
- 面试必问题:JS防抖与节流
摘要:防抖与节流可谓是面试常见,其实很好理解,下面带你分分钟了解防抖与节流的基本思想与写法~ 本文分享自华为云社区<JS防抖与节流快速了解与应用>,作者:北极光之夜. . 一.速识防抖: ...
- Swift- 设置 UILabel 内边距
摘要 拿来即用短时间效率虽然挺高的,但是拿来的东西没有消化一次,就无法得心应手的使用它. 这次的探索思路就是,查询官方文档,设置不同的值测试单个方法中参数的变化,之后测试两个方法的执行顺序,处理的思路 ...
- 分布式协调组件Zookeeper之 选举机制与ZAB协议
Zookeeper简介: Zookeeper是什么: Zookeeper 是⼀个分布式协调服务的开源框架. 主要⽤来解决分布式集群中应⽤系统的⼀致性问题, 例如怎样避免同时操作同⼀数据造成脏读的问题. ...
- Git使用教程三
2.远程仓库 线上仓库的操作学习以Github为例 2.1完成线上仓库创建 注意:仓库要求在当前账号下唯一 2.2 两种常规使用方式 2.2.1基于http协议 a.创建空目录,名称就称为shop ...
- Python文件(File)及读写操作及生成器yield
open函数在内存中创建缓存区,将磁盘上的内容复制到此处.文件内容读入到文件对象缓冲区后,文件对象将缓冲区视为非常大的列表,其中每个元素都有一个索引.文件对象按字节(大约每个字符)来对文件对象缓冲区索 ...
- 搭建私服仓库:(一)Windows安装Nuxus
Nexus下载 官网.官网下载.百度云盘 提取码:su33 将nexus下载下来,以2.14.5的windows版本为例子(3.x暂时下载不下来,迅雷会员都不行) 下载后进行解压,得到以下目录: 其中 ...
- vue ele table表格 设置只能勾选一个
table 更改属性设置: <el-table ref="multipleTable" :data="tableData" tooltip-effect= ...
- shell运算方式
1.(())--整数运算 [root@m01 /server/scripts]# a=1 [root@m01 /server/scripts]# b=2 [root@m01 /server/scrip ...