首页 > 代码库 > Redis简单使用(一)
Redis简单使用(一)
1.Redis简介
Redis是一个开源的,使用C语言编写,面向“键/值”对类型数据的分布式NoSQL数据库系统,特点是高性能,持久存储,适应高并发的应用场景。Redis纯粹为应用而产生,它是一个高性能的key-value数据库,并且提供了多种语言的API性能测试结果表示SET操作每秒钟可达110000次,GET操作每秒81000次(当然不同的服务器配置性能不同)。
redis目前提供五种数据类型:string(字符串),list(链表), Hash(哈希),set(集合)及zset(sorted set) (有序集合)
2.Redis与Memcached的比较
(1)Memcached是多线程,而Redis使用单线程.
(2)Memcached使用预分配的内存池的方式,Redis使用现场申请内存的方式来存储数据,并且可以配置虚拟内存。
(3)Redis可以实现持久化,主从复制,实现故障恢复。
(4)Memcached只是简单的key与value,但是Redis支持数据类型比较多。
(5)Redis的存储分为内存存储、磁盘存储 .从这一点,也说明了Redis与Memcached是有区别的。Redis 与Memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改 操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
3.Redis存储方式
Redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到硬盘中来保证持久化。
Redis支持两种持久化方式.
(1):snapshotting(快照)也是默认方式.(把数据做一个备份,将数据存储到文件)
(2)Append-only file(缩写aof)的方式
快照是默认的持久化方式,这种方式是将内存中数据以快照的方式写到二进制文件中,默认的文件名称
为dump.rdb.可以通过配置设置自动做快照持久化的方式。我们可以配置redis在n秒内如果超过m个key
键修改就自动做快照.
aof方式:由于快照方式是在一定间隔时间做一次的,所以如果redis意外down掉的话,就会丢失最后一次
快照后的所有修改。aof比快照方式有更好的持久化性,是由于在使用aof时,redis会将每一个收到的
写命令都通过write函数追加到文件中,当redis重启时会通过重新执行文件中保存的写命令来在内存中重建
整个数据库的内容。
当然由于os会在内核中缓存write做的修改,所以可能不是立即写到磁盘上。真阳aof方式的持久化
也还是有可能会丢失部分修改。可以通过配置文件告诉redis我们想要通过fsync函数强制os写入到磁盘
的时机。
Redis有两种存储方式,默认是snapshot方式,实现方法是定时将内存的快照(snapshot)持久化到硬盘,这种方法缺点是持久化之后如果出现crash则会丢失一段数据。因此在完美主义者的推动下作者增加了aof方式。aof即append only mode,在写入内存数据的同时将操作命令保存到日志文件,在一个并发更改上万的系统中,命令日志是一个非常庞大的数据,管理维护成本非常高,恢复重建时间会非常长,这样导致失去aof高可用性本意。另外更重要的是Redis是一个内存数据结构模型,所有的优势都是建立在对内存复杂数据结构高效的原子操作上,这样就看出aof是一个非常不协调的部分。
其实aof目的主要是数据可靠性及高可用性.
4.Redis安装
下载Redis:https://github.com/dmajkic/redis/downloads
redis-server.exe:服务程序
redis-check-dump.exe:本地数据库检查
redis-check-aof.exe:更新日志检查
redis-benchmark.exe:性能测试,用以模拟同时由N个客户端发送M个 SETs/GETs 查询.
redis-cli.exe: 服务端开启后,我们的客户端就可以输入各种命令测试了
class Program { static void Main(string[] args) { RedisClient redisClient = new RedisClient("127.0.0.1",6379); #region 存储字符串类型和自定义类型 //redisClient.Set<string>("name", "yxl"); //Console.WriteLine(redisClient.Get<string>("name")); //UserInfo userInfo = new UserInfo() { UserName = "zhangsan", UserPwd = "1111" };// (底层使用json序列化) //redisClient.Set<UserInfo>("userInfo", userInfo); //UserInfo user = redisClient.Get<UserInfo>("userInfo"); //Console.WriteLine(user.UserName); //List<UserInfo> list = new List<UserInfo>() { new UserInfo() { UserName = "lisi", UserPwd = "111" }, new UserInfo() { UserName = "wangwu", UserPwd = "123" } }; //redisClient.Set<List<UserInfo>>("list", list); //List<UserInfo> userInfoList = redisClient.Get<List<UserInfo>>("list"); //foreach (UserInfo item in userInfoList) //{ // Console.WriteLine(item.UserName); //} #endregion #region Hash // redisClient.SetEntryInHash("userInfoId", "name", "yxlhashName"); // redisClient.SetEntryInHash("userInfoId", "name2", "yxlhashName"); // List<string> hashKeys = redisClient.GetHashKeys("userInfoId"); //List<string> hashValues = redisClient.GetHashValues("userInfoId"); //long hashCount = redisClient.GetHashCount("userInfoId"); // Console.WriteLine(hashCount);//2 // foreach (string hashKey in hashKeys) // { // Console.WriteLine(hashKey);//name,name2 // } // foreach (string hashValue in hashValues) // { // Console.WriteLine(hashValue);//yxlhashName,yxlhashName // } #endregion #region List类型 #region 队列,先进先出 //redisClient.EnqueueItemOnList("name1", "zhangsan"); //redisClient.EnqueueItemOnList("name1", "lisi"); //long length = redisClient.GetListCount("name1"); //for (int i = 0; i < length; i++) //{ // Console.WriteLine(redisClient.DequeueItemFromList("name1")); //} #endregion #region 栈,先进后出 //redisClient.PushItemToList("name1", "zhangsan"); //redisClient.PushItemToList("name1", "lisi"); //long length = redisClient.GetListCount("name1"); //for (int i = 0; i < length; i++) //{ // Console.WriteLine(redisClient.PopItemFromList("name1")); //} #endregion #endregion #region Set类型,无序集合,集合我们可以取并集,交集,差集. #region 普通存储 //redisClient.AddItemToSet("a3", "ddd"); //redisClient.AddItemToSet("a3", "ccc"); //redisClient.AddItemToSet("a3", "tttt"); //redisClient.AddItemToSet("a3", "sssh"); //redisClient.AddItemToSet("a3", "hhhh"); //System.Collections.Generic.HashSet<string> hashset = redisClient.GetAllItemsFromSet("a3"); //foreach (string str in hashset) //{ // Console.WriteLine(str); //} #endregion #region 取并集 //redisClient.AddItemToSet("a3", "ddd"); //redisClient.AddItemToSet("a3", "ccc"); //redisClient.AddItemToSet("a3", "tttt"); //redisClient.AddItemToSet("a3", "sssh"); //redisClient.AddItemToSet("a3", "hhhh"); //redisClient.AddItemToSet("a4", "hhhh"); //redisClient.AddItemToSet("a4", "h777"); //System.Collections.Generic.HashSet<string> hashset = redisClient.GetUnionFromSets(new string[] { "a3", "a4" }); //foreach (string str in hashset) //{ // Console.WriteLine(str); //} #endregion #region 取交集 //redisClient.AddItemToSet("a3", "ddd"); //redisClient.AddItemToSet("a3", "ccc"); //redisClient.AddItemToSet("a3", "tttt"); //redisClient.AddItemToSet("a3", "sssh"); //redisClient.AddItemToSet("a3", "hhhh"); //redisClient.AddItemToSet("a4", "hhhh"); //redisClient.AddItemToSet("a4", "h777"); //System.Collections.Generic.HashSet<string> hashset = redisClient.GetIntersectFromSets(new string[] { "a3", "a4" }); //foreach (string str in hashset) //{ // Console.WriteLine(str); //} #endregion #region 取差集 //redisClient.AddItemToSet("a3", "ddd"); //redisClient.AddItemToSet("a3", "ccc"); //redisClient.AddItemToSet("a3", "tttt"); //redisClient.AddItemToSet("a3", "sssh"); //redisClient.AddItemToSet("a3", "hhhh"); //redisClient.AddItemToSet("a4", "hhhh"); //redisClient.AddItemToSet("a4", "h777"); //System.Collections.Generic.HashSet<string> hashset = redisClient.GetDifferencesFromSet("a3",new string[] { "a4" }); ////返回存在于第一个集合(a3),但是不存在于其他集合(a4)的数据 //foreach (string str in hashset) //{ // Console.WriteLine(str); //} #endregion #endregion #region Sorted Set类型 //redisClient.AddItemToSortedSet("a5", "ffff"); //redisClient.AddItemToSortedSet("a5", "bbbb"); //redisClient.AddItemToSortedSet("a5", "gggg"); //redisClient.AddItemToSortedSet("a5", "cccc"); //redisClient.AddItemToSortedSet("a5", "waaa"); //System.Collections.Generic.List<string> list = redisClient.GetAllItemsFromSortedSet("a5"); //foreach (string str in list) //{ // Console.WriteLine(str); //} #endregion } public class UserInfo { public string UserName { get; set; } public string UserPwd { get; set; } } }