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: 服务端开启后,我们的客户端就可以输入各种命令测试了

打开一个cmd窗口,使用cd命令切换到指定目录(F:\Redis)

运行 redis-server.exe redis.conf

重新打开一个cmd窗口,使用cd命令切换到指定目录(F:\Redis)运行 redis-cli.exe -h 127.0.0.1 -p 6379,其中 127.0.0.1是本地ip,6379是redis服务端的默认端口 (这样可以开启一个客户端程序进行特殊指令的测试).

可以将此服务设置为windows系统服务,下载Redis服务安装软件,安装即可。(https://github.com/rgl/redis/downloads

C#调用

程序包管理器控制台

PM> Install-Package ServiceStack.Redis

5.Redis常用数据类型

l Redis最为常用的数据类型主要有以下五种:

String、Hash、List、Set、SortedSet

String是最常用的一种数据类型,普通的key/value存储都可以归为此类 。一个Key对应一个Value,string类型是二进制安全的。Redis的string可以包含任何数据,比如jpg图片(生成二进制)或者序列化的对象

Hash是一个string 类型的field和value的映射表。hash特别适合存储对象。相对于将对象的每个字段存成单个string 类型。一个对象存储在hash类型中会占用更少的内存,并且可以更方便的存取整个对象。作为一个key value存在,很多开发者自然的使用set/get方式来使用Redis,实际上这并不是最优化的使用方法。尤其在未启用VM情况下,Redis全部数据需要放入内存,节约内存尤其重要.

list是一个链表结构,主要功能是push,pop,获取一个范围的所有的值等,操作中key理解为链表名字。 Redis的list类型其实就是一个每个子元素都是string类型的双向链表。我们可以通过push,pop操作从链表的头部或者尾部添加删除元素,这样list既可以作为栈,又可以作为队列。Redis list的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,Redis内部的很多实现,包括发送缓冲队列等也都是用的这个数据结构

set是string类型的无序集合。set是通过hash table实现的,添加,删除和查找,对集合我们可以取并集,交集,差集.

sorted set 是set的一个升级版本,它在set的基础上增加了一个顺序的属性,这一属性在添加修改   .元素的时候可以指定,每次指定后,zset(表示有序集合)会自动重新按新的值调整顺序。可以理解为有列的表,一列存 value,一列存顺序。操作中key理解为zset的名字.

Redis sorted set的使用场景与set类似,区别是set不是自动有序的,而sorted set可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序。当你需要一个有序的并且不重复的集合列表,那么可以选择sorted set数据结构

事例代码:

 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; }
        }
    }

Redis简单使用(一)

时间: 2024-11-09 02:50:23

Redis简单使用(一)的相关文章

session 保存到 redis 简单实现

参考资料: [session保存到redis简单实现]http://blog.csdn.net/ppt0501/article/details/46700221 [Redis学习]http://blog.csdn.net/can007/article/details/19848559

小贝_php+redis简单实例

php+redis简单实例 一.说明 因为redis是c/s架构.从这个角度上.不论什么符合redis的client要求的.都能够与redis进行通讯.官方提供了非常多的client. php在web方面的发展.大家够有目共睹.因此这里主要是解说php与redis的使用实例 二.实例 这里仅使用了redis的字符串类型.用到了get和set命令 <? php /** * @explain php操作redis * 1.设置key为name,其值为脚本小子 * 2.获取key为name的值 * @

Redis简单的数据操作(增删改查)

#Redis简单的数据操作(增删改查): 字符串类型 string 1. 存储: set key value 127.0.0.1:6379> set username zhangsan OK 2. 获取: get key 127.0.0.1:6379> get username "zhangsan" 以下同理: 127.0.0.1:6379> set age 23 OK 127.0.0.1:6379> get age "23" 127.0.0

Redis简单示例

1.Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. 从2010年3月15日起,Redis的开发工作由VMware主持.从2013年5月开始,Redis的开发由Pivotal赞助. 2.下载 redis-3.2.6.tar.gz,解压,进入目录redis-3.2.6,然后make 3.在src目录下,生成一些二进制可执行文件.如下: [[email protected] src]# ll|grep -v "

Redis简单案例(三) 连续登陆活动的简单实现

连续登陆活动,或许大家都不会陌生,简单理解就是用户连续登陆了多少天之后,系统就会送一些礼品给相应的用户.最常见的 莫过于游戏和商城这些.游戏就送游戏币之类的东西,商城就送一些礼券.正值国庆,应该也有不少类似的活动. 下面就对这个的实现提供两个思路,并提供解决方案. 思路1(以用户为维度): 连续登陆活动,必然是要求连续登陆,不能有间隔.用1表示登陆,0表示没有登陆,这样我们可以为每个用户创建一个key去存储 他的登陆情况,就可以得到类似这样的一个二进制序列:1110111,如果是7个1,就表示连

Redis简单配置和使用

学到Redis中需要整理和配置的东西比较多,资源也是比较分散!这次的主要还是将知识整合一下,开发过程中所需要的资源整合一下,也方便今后涉及到这块地方的知识时,将时间大量浪费在了找这些资源上了! 一.Redis(NOSQL数据库): redis主要是用于存储键值对数据(主要对这进行了优化)的一种数据库,并且对数据进行了自动过期处理.和memcached不同之处在于,redis数据存在本机硬盘上,而memcached则是将数据存在内存中. redis有Windows版和linux版,平常测试开发基本

redis简单应用

一.Jedis客户端 Redis不仅是使用命令来操作,现在基本上主流的语言都有客户端支持,比如java.C.C#.C++.php.Node.js.Go等. 在官方网站里列一些Java的客户端,有Jedis.Redisson.Jredis.JDBC-Redis.等其中官方推荐使用Jedis和Redisson.今天我们主要使用Jedis的方式来完成Redis的应用 1.准备工作,添加架包: 2.编写简单的测试代码: @Test public void redisClient1(){ Jedis je

Redis简单案例(四) Session的管理

负载均衡,这应该是一个永恒的话题,也是一个十分重要的话题.毕竟当网站成长到一定程度,访问量自然也是会跟着增长,这个时候, 一般都会对其进行负载均衡等相应的调整.现如今最常见的应该就是使用Nginx来进行处理了吧.当然Jexus也可以达到一样的效果.既然是 负载均衡,那就势必有多台服务器,如果不对session进行处理,那么就会造成Session丢失的情况.有个高大上的名字叫做分布式Session. 举个通俗易懂的例子,假设现在有3台服务器做了负载,用户在登陆的时候是在a服务器上进行的,此时的se

redis简单配置

由于前段时间使用Kestrel,同时要操作Memcached及时更新缓存,又要操作database,持久化数据. 貌似Redis既可以当Cache又可以当Queue!于是,今天开始研究Redis! 一.Redis简要介绍 Redis —— REmote DIctionaryServer,可以直接理解为远程字典服务,也就是基于Key-Value模式Memcached+Database Persistence. 如果真要把Redis与Memcached进行对比,参考下图: 使用Memcached,让