一、Redis定义——百度百科
redis的官网地址,是redis.io。
Redis 是一个高性能的key-value数据库。
和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。
这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。
与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。
二、存储——百度百科
全量数据和增量请求。
全量数据格式是把内存中的数据写入磁盘,便于下次读取文件进行加载;
增量请求文件则是把内存中的数据序列化为操作请求,用于读取文件进行replay得到数据,序列化的操作包括SET、RPUSH、SADD、ZADD。
Redis的存储分为内存存储、磁盘存储和log文件三部分,配置文件中有三个参数对其进行配置。
三、Windows安装
Redis的代码遵循ANSI-C编写,可以在所有POSIX系统(如Linux, *BSD, Mac OS X, Solaris等)上安装运行。而且Redis并不依赖任何非标准库,也没有编译参数必需添加。
下面介绍一下Windows安装。
1、安装包下载:https://github.com/dmajkic/redis/downloads
2、安装包下载后根据操作系统选择对应版本文件,里面会有几个dll分别为:
redis-server.exe:服务程序
redis-check-dump.exe:本地数据库检查
redis-check-aof.exe:更新日志检查
redis-benchmark.exe:性能测试,用以模拟同时由N个客户端发送M个 SETs/GETs 查询.
redis-cli.exe: 服务端开启后,我们的客户端就可以输入各种命令测试了
3、使用
打开cmd (win+R),进入到安装包下载的位置。输入:redis-server.exe redis.conf 开启Redis服务。双击redis-server.exe文件也可以启动服务。
提示信息没有报错表示启动成功。
此窗口要一直保持打开状态,如果关闭Redis服务也会被关闭。
再打开一个cmd窗口,使用redis-cli.exe测试一下数据。
Redis客户端还可下载https://github.com/rgl/redis/downloads,双击exe安装即可
关闭Redis服务命令redis-cli SHUTDOWN
四、常用命令——百度百科
Redis根本是使用内存存储,持久化的关键是这三条指令:SAVE BGSAVE LASTSAVE …
TYPE key — 用来获取某key的类型
KEYS pattern — 匹配所有符合模式的key,比如KEYS * 就列出所有的key了,当然,复杂度O(n)
RANDOMKEY - 返回随机的一个key
RENAME oldkeynewkey— key也可以改名
列表操作,精华
RPUSH key string — 将某个值加入到一个key列表末尾
LPUSH key string — 将某个值加入到一个key列表头部
LLEN key — 列表长度
LRANGE key start end — 返回列表中某个范围的值,相当于mysql里面的分页查询那样
LTRIM key start end — 只保留列表中某个范围的值
LINDEX key index — 获取列表中特定索引号的值,要注意是O(n)复杂度
LSET key index value — 设置列表中某个位置的值
LPOP key
RPOP key — 和上面的LPOP一样,就是类似栈或队列的那种取头取尾指令,可以当成消息队列来使用了
集合操作
SADD key member — 增加元素
SREM key member — 删除元素
SCARD key — 返回集合大小
SISMEMBER key member — 判断某个值是否在集合中
SINTER key1 key2 ... keyN — 获取多个集合的交集元素
SMEMBERS key — 列出集合的所有元素
还有Multiple DB的命令,可以更换db,数据可以隔离开,默认是存放在DB 0。
五、代码示例
引用Nuget包ServiceStack.Redis
using ServiceStack.Redis; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace RedisConsoleDemo { class Program { static void Main(string[] args) { //在Redis中存储常用的5种数据类型:String,Hash,List,SetSorted set var client = new RedisClient("127.0.0.1", 6379); AddString(client); //AddHash(client); //AddList(client); //AddSet(client); //AddSetSorted(client); Console.ReadLine(); } private static void AddString(RedisClient client) { var timeOut = new TimeSpan(0, 0, 0, 3); client.Add("Test", "Learninghard", timeOut); while (true) { if (client.ContainsKey("Test")) { Console.WriteLine("String Key: Test -Value: {0}, 当前时间: {1}", client.Get<string>("Test"), DateTime.Now); Thread.Sleep(1000); } else { Console.WriteLine("Value 已经过期了,当前时间:{0}", DateTime.Now); break; } } var person = new Person() { Name = "Learninghard", Age = 26 }; client.Add("lh", person); var cachePerson = client.Get<Person>("lh"); Console.WriteLine("Person's Name is : {0}, Age: {1}", cachePerson.Name, cachePerson.Age); } private static void AddHash(RedisClient client) { if (client == null) throw new ArgumentNullException("client"); client.SetEntryInHash("HashId", "Name", "Learninghard"); client.SetEntryInHash("HashId", "Age", "26"); client.SetEntryInHash("HashId", "Sex", "男"); var hashKeys = client.GetHashKeys("HashId"); foreach (var key in hashKeys) { Console.WriteLine("HashId--Key:{0}", key); } var haskValues = client.GetHashValues("HashId"); foreach (var value in haskValues) { Console.WriteLine("HashId--Value:{0}", value); } var allKeys = client.GetAllKeys(); //获取所有的key。 foreach (var key in allKeys) { Console.WriteLine("AllKey--Key:{0}", key); } } private static void AddList(RedisClient client) { if (client == null) throw new ArgumentNullException("client"); client.EnqueueItemOnList("QueueListId", "1.Learnghard"); //入队 client.EnqueueItemOnList("QueueListId", "2.张三"); client.EnqueueItemOnList("QueueListId", "3.李四"); client.EnqueueItemOnList("QueueListId", "4.王五"); var queueCount = client.GetListCount("QueueListId"); for (var i = 0; i < queueCount; i++) { Console.WriteLine("QueueListId出队值:{0}", client.DequeueItemFromList("QueueListId")); //出队(队列先进先出) } client.PushItemToList("StackListId", "1.Learninghard"); //入栈 client.PushItemToList("StackListId", "2.张三"); client.PushItemToList("StackListId", "3.李四"); client.PushItemToList("StackListId", "4.王五"); var stackCount = client.GetListCount("StackListId"); for (var i = 0; i < stackCount; i++) { Console.WriteLine("StackListId出栈值:{0}", client.PopItemFromList("StackListId")); //出栈(栈先进后出) } } //它是string类型的无序集合。set是通过hash table实现的,添加,删除和查找,对集合我们可以取并集,交集,差集 private static void AddSet(RedisClient client) { if (client == null) throw new ArgumentNullException("client"); client.AddItemToSet("Set1001", "A"); client.AddItemToSet("Set1001", "B"); client.AddItemToSet("Set1001", "C"); client.AddItemToSet("Set1001", "D"); var hastset1 = client.GetAllItemsFromSet("Set1001"); foreach (var item in hastset1) { Console.WriteLine("Set无序集合Value:{0}", item); //出来的结果是无须的 } client.AddItemToSet("Set1002", "K"); client.AddItemToSet("Set1002", "C"); client.AddItemToSet("Set1002", "A"); client.AddItemToSet("Set1002", "J"); var hastset2 = client.GetAllItemsFromSet("Set1002"); foreach (var item in hastset2) { Console.WriteLine("Set无序集合ValueB:{0}", item); //出来的结果是无须的 } var hashUnion = client.GetUnionFromSets(new string[] { "Set1001", "Set1002" }); foreach (var item in hashUnion) { Console.WriteLine("求Set1001和Set1002的并集:{0}", item); //并集 } var hashG = client.GetIntersectFromSets(new string[] { "Set1001", "Set1002" }); foreach (var item in hashG) { Console.WriteLine("求Set1001和Set1002的交集:{0}", item); //交集 } var hashD = client.GetDifferencesFromSet("Set1001", new string[] { "Set1002" }); //[返回存在于第一个集合,但是不存在于其他集合的数据。差集] foreach (var item in hashD) { Console.WriteLine("求Set1001和Set1002的差集:{0}", item); //差集 } } /* sorted set 是set的一个升级版本,它在set的基础上增加了一个顺序的属性,这一属性在添加修改.元素的时候可以指定, * 每次指定后,zset(表示有序集合)会自动重新按新的值调整顺序。可以理解为有列的表,一列存 value,一列存顺序。操作中key理解为zset的名字. */ private static void AddSetSorted(RedisClient client) { if (client == null) throw new ArgumentNullException("client"); client.AddItemToSortedSet("SetSorted1001", "A"); client.AddItemToSortedSet("SetSorted1001", "B"); client.AddItemToSortedSet("SetSorted1001", "C"); var listSetSorted = client.GetAllItemsFromSortedSet("SetSorted1001"); foreach (var item in listSetSorted) { Console.WriteLine("SetSorted有序集合{0}", item); } client.AddItemToSortedSet("SetSorted1002", "A", 400); client.AddItemToSortedSet("SetSorted1002", "D", 200); client.AddItemToSortedSet("SetSorted1002", "B", 300); // 升序获取第一个值:"D" var list = client.GetRangeFromSortedSet("SetSorted1002", 0, 0); foreach (var item in list) { Console.WriteLine(item); } //降序获取第一个值:"A" list = client.GetRangeFromSortedSetDesc("SetSorted1002", 0, 0); foreach (var item in list) { Console.WriteLine(item); } } } class Person { public string Name { get; set; } public int Age { get; set; } } }