C#Redis使⽤
概念
  Redis是⼀个开源的使⽤ANSI C语⾔编写、⽀持⽹络、可基于内存亦可持久化的⽇志型、Key-Value数据库,和Memcached类似,它⽀持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。在此基础
上,redis⽀持各种不同⽅式的排序。与memcached⼀样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写⼊磁盘或者把修改操作写⼊追加的记录⽂件,并且在此基础上实现了master-slave(主从)同步。
  Redis⽀持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis 可执⾏单层树复制。存盘可以有意⽆意的对数据进⾏写操作。
Redis 与 Memcached 区别
Memcached是多线程,⽽Redis使⽤单线程。(个⼈认为Memcached在读写处理速度上由于Redis)
Memcached使⽤预分配的内存池的⽅式,Redis使⽤现场申请内存的⽅式来存储数据,并且可以配置虚拟内存。
Redis可以实现持久化(也就是说redis需要经常将内存中的数据同步到硬盘中来保证持久化),主从复制,实现故障恢复。
Memcached只是简单的key与value,但是Redis⽀持数据类型⽐较多。包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。
Redis⽀持两种持久化⽅式:
(1):snapshotting(快照)也是默认⽅式.(把数据做⼀个备份,将数据存储到⽂件)
(2)Append-only file(缩写aof)的⽅式
快照是默认的持久化⽅式,这种⽅式是将内存中数据以快照的⽅式写到⼆进制⽂件中,默认的⽂件名称为dump.rdb.可以通过配置设置⾃动做快照持久化的⽅式。我们可以配置redis在n秒内如果超过m个key键修改就⾃动做快照.
aof⽅式:由于快照⽅式是在⼀定间隔时间做⼀次的,所以如果redis意外down掉的话,就会丢失最后⼀次快照后的所有修改。aof⽐快照⽅式有更好的持久化性,是由于在使⽤aof时,redis会将每⼀个收到的写命令都通过write函数追加到⽂件中,当redis重启时会通过重新执⾏⽂件中保存的写命令来在内存中重建整个数据库的内容。
Windows安装Redis
以cmd安装⽅法:
1.下载安装包:
2.安装包下载后根据操作系统选择对应版本⽂件,⾥⾯会有⼏个dll分别为:
<:服务程序
<:本地数据库检查
<:更新⽇志检查
<:性能测试,⽤以模拟同时由N个客户端发送M个 SETs/GETs 查询.
<:服务端开启后,我们的客户端就可以输⼊各种命令测试了
⾸先以管理员⾝份打开cmd (窗⼝+R),进⼊到安装包下载的位置。输⼊: f  开启Redis服务。提⽰信息没有报错表⽰启动成功。
此窗⼝要保持开启状态,如果关闭Redis服务也会相即被关闭。使⽤客户端测试⼀下数据。
现在来观察Redis是怎么持久化存储数据到硬盘上。(快照是默认的持久化⽅式,默认的⽂件名称为dump.rdb)
可以看到Redis服务端在⼀段时间后将数据库保存在磁盘上,⽂件为:dump.rdb。
以weindows服务安装Redis⽅法:
下载完成后直接点击.exe下⼀步下⼀步OK。安装完后我们会在windows服务中到Redis Service服务。注意启动服务后在进⾏相关测试。代码实例
在调⽤Redis服务前需要准备三个DLL。下载地址:在项⽬中引⽤即可。
使⽤Redis中存储常⽤的5种数据类型:String,Hash,List,SetSorted set编写实例代码
static void Main(string[] args)
{
//在Redis中存储常⽤的5种数据类型:String,Hash,List,SetSorted set
RedisClient client = new RedisClient("172.21.0.192", 6379);
client.FlushAll();
#region string
client.Add<string>("StringValueTime", "我已设置过期时间噢30秒后会消失", DateTime.Now.AddMilliseconds(30000));
while (true)
{
if (client.ContainsKey("StringValueTime"))
{
Console.WriteLine("String.键:StringValue,值:{0} {1}", client.Get<string>("StringValueTime"), DateTime.Now);
Thread.Sleep(10000);
}
else
{
Console.WriteLine("键:StringValue,值:我已过期 {0}", DateTime.Now);
break;
}
}
client.Add<string>("StringValue", " String和Memcached操作⽅法差不多");
Console.WriteLine("数据类型为:String.键:StringValue,值:{0}", client.Get<string>("StringValue"));
Student stud = new Student() { id = "1001", name = "李四" };
client.Add<Student>("StringEntity", stud);
Student Get_stud = client.Get<Student>("StringEntity");
Console.WriteLine("数据类型为:String.键:StringEntity,值:{0} {1}", Get_stud.id, Get_stud.name);
#endregion
#region Hash
client.SetEntryInHash("HashID", "Name", "张三");
client.SetEntryInHash("HashID", "Age", "24");
client.SetEntryInHash("HashID", "Sex", "男");
client.SetEntryInHash("HashID", "Address", "上海市XX号XX室");
List<string> HaskKey = client.GetHashKeys("HashID");
foreach (string key in HaskKey)
{
Console.WriteLine("HashID--Key:{0}", key);
}
List<string> HaskValue = client.GetHashValues("HashID");
foreach (string value in HaskValue)
{
Console.WriteLine("HashID--Value:{0}", value);
}
List<string> AllKey = client.GetAllKeys(); //获取所有的key。
foreach (string Key in AllKey)
{
Console.WriteLine("AllKey--Key:{0}", Key);
}
#endregion
#region List
/*
* list是⼀个链表结构,主要功能是push,pop,获取⼀个范围的所有的值等,操作中key理解为链表名字。
* Redis的list类型其实就是⼀个每个⼦元素都是string类型的双向链表。我们可以通过push,pop操作从链表的头部或者尾部添加删除元素,
* 这样list既可以作为栈,⼜可以作为队列。Redis list的实现为⼀个双向链表,即可以⽀持反向查和
遍历,更⽅便操作,不过带来了部分额外的内存开销,    * Redis内部的很多实现,包括发送缓冲队列等也都是⽤的这个数据结构
*/
client.EnqueueItemOnList("QueueListId", "1.张三");  //⼊队
client.EnqueueItemOnList("QueueListId", "2.张四");
client.EnqueueItemOnList("QueueListId", "3.王五");
client.EnqueueItemOnList("QueueListId", "4.王⿇⼦");
int q = client.GetListCount("QueueListId");
for (int i = 0; i < q; i++)
{
Console.WriteLine("QueueListId出队值:{0}", client.DequeueItemFromList("QueueListId"));  //出队(队列先进先出)
}
client.PushItemToList("StackListId", "1.张三");  //⼊栈
client.PushItemToList("StackListId", "2.张四");
client.PushItemToList("StackListId", "3.王五");
client.PushItemToList("StackListId", "4.王⿇⼦");
int p = client.GetListCount("StackListId");
for (int i = 0; i < p; i++)
{
Console.WriteLine("StackListId出栈值:{0}", client.PopItemFromList("StackListId"));  //出栈(栈先进后出)
}
#endregion
#region Set⽆序集合
/*
它是string类型的⽆序集合。set是通过hash table实现的,添加,删除和查,对集合我们可以取并集,交集,差集
*/
client.AddItemToSet("Set1001", "⼩A");
client.AddItemToSet("Set1001", "⼩B");
client.AddItemToSet("Set1001", "⼩C");
client.AddItemToSet("Set1001", "⼩D");
HashSet<string> hastsetA = client.GetAllItemsFromSet("Set1001");
foreach (string item in hastsetA)
{
Console.WriteLine("Set⽆序集合ValueA:{0}", item); //出来的结果是⽆须的
}
client.AddItemToSet("Set1002", "⼩K");
client.AddItemToSet("Set1002", "⼩C");
client.AddItemToSet("Set1002", "⼩A");
client.AddItemToSet("Set1002", "⼩J");
HashSet<string> hastsetB = client.GetAllItemsFromSet("Set1002");
foreach (string item in hastsetB)
{
Console.WriteLine("Set⽆序集合ValueB:{0}", item); //出来的结果是⽆须的
}
HashSet<string> hashUnion = client.GetUnionFromSets(new string[] { "Set1001", "Set1002" });
foreach (string item in hashUnion)
{
Console.WriteLine("求Set1001和Set1002的并集:{0}", item); //并集
}
HashSet<string> hashG = client.GetIntersectFromSets(new string[] { "Set1001", "Set1002" });
foreach (string item in hashG)
{
Console.WriteLine("求Set1001和Set1002的交集:{0}", item);  //交集
}
redis支持的数据结构
HashSet<string> hashD = client.GetDifferencesFromSet("Set1001", new string[] { "Set1002" });  //[返回存在于第⼀个集合,但是不存在于其他集合的数据。差集]
foreach (string item in hashD)
{
Console.WriteLine("求Set1001和Set1002的差集:{0}", item);  //差集
}
#endregion
#region  SetSorted 有序集合
/*
sorted set 是set的⼀个升级版本,它在set的基础上增加了⼀个顺序的属性,这⼀属性在添加修改.元素的时候可以指定,
* 每次指定后,zset(表⽰有序集合)会⾃动重新按新的值调整顺序。可以理解为有列的表,⼀列存 value,⼀列存顺序。操作中key理解为zset的名字.
*/
client.AddItemToSortedSet("SetSorted1001", "1.刘仔");
client.AddItemToSortedSet("SetSorted1001", "2.星仔");
client.AddItemToSortedSet("SetSorted1001", "3.猪仔");
List<string> listSetSorted = client.GetAllItemsFromSortedSet("SetSorted1001");
foreach (string item in listSetSorted)
{
Console.WriteLine("SetSorted有序集合{0}", item);
}
#endregion
}
View Code
输出结果:
总结
  Redis的存储容灾性⽐较完善,所⽀持的存储数据类型⽐较全。⽐较坑的是版本2.X之下都不⽀持服务器集,只能单机。在Redis 3.0中服务器集功能才亮相。操作起来总体感觉⽐较简单容易上⼿

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。