首先,以前我对Redis一直是有所耳闻,不过一直没有自己去真正使用过。这次 由于自己的业务功能涉及到需要使用NoSQL的,所以针对Redis写一个小Demo练习一下。

虽然是领导指定使用的Redis,不过不得不说Redis还是有其优势的。

一、Redis简介

Redis是一个开源的,使用C语言编写,面向“键/值”对类型数据的分布式NoSQL数据库系统,特点是高性能,持久存储,适应高并发的应用场景。Redis纯粹为应用而产生,它是一个高性能的key-value数据库,并且提供了多种语言的API

性能测试结果表示SET操作每秒钟可达110000次,GET操作每秒81000次(当然不同的服务器配置性能不同)。

Redis目前提供五种数据类型:string(字符串),list(链表), Hash(哈希),set(集合)及zset(sorted set)  (有序集合)

Redis开发维护很活跃,虽然它是一个Key-Value数据库存储系统,但它本身支持MQ功能,所以完全可以当做一个轻量级的队列服务来使用。对于RabbitMQ和Redis的入队和出队操作,各执行100万次,每10万次记录一次执行时间。测试数据分为128Bytes、512Bytes、1K和10K四个不同大小的数据。实验表明:入队时,当数据比较小时Redis的性能要高于RabbitMQ,而如果数据大小超过了10K,Redis则慢的无法忍受;出队时,无论数据大小,Redis都表现出非常好的性能,而RabbitMQ的出队性能则远低于Redis。

二、Redis与Memcached的比较.

1.Memcached是多线程,而Redis使用单线程.

2.Memcached使用预分配的内存池的方式,Redis使用现场申请内存的方式来存储数据,并且可以配置虚拟内存。

3.Redis可以实现持久化,主从复制,实现故障恢复。

4.Memcached只是简单的key与value,但是Redis支持数据类型比较多。

Redis的存储分为内存存储、磁盘存储 .从这一点,也说明了Redis与Memcached是有区别的。Redis 与Memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改 操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

Redis有两种存储方式,默认是snapshot方式,实现方法是定时将内存的快照(snapshot)持久化到硬盘,这种方法缺点是持久化之后如果出现crash则会丢失一段数据。因此在完美主义者的推动下作者增加了aof方式。aof即append only mode,在写入内存数据的同时将操作命令保存到日志文件,在一个并发更改上万的系统中,命令日志是一个非常庞大的数据,管理维护成本非常高,恢复重建时间会非常长,这样导致失去aof高可用性本意。另外更重要的是Redis是一个内存数据结构模型,所有的优势都是建立在对内存复杂数据结构高效的原子操作上,这样就看出aof是一个非常不协调的部分。

其实aof目的主要是数据可靠性及高可用性

三、Redis安装

在安装过程中发生了一件让人啼笑皆非的事。我是从官网上下载的,官网只提供linux版本 而我使用的是windows系统... 看上去跟我之前从别人那看到的不一样 没有exe文件...

看了网上教程才知道 现在只要GitHub提供下载 https://github.com/MSOpenTech/redis/tags 我下载的是64位版本的 可以选择一个磁盘目录 解压进去就行

文件说明:

redis-server.exe:服务程序  

redis-check-dump.exe:本地数据库检查 

redis-check-aof.exe:更新日志检查 

redis-benchmark.exe:性能测试,用以模拟同时由N个客户端发送M个 SETs/GETs 查询.

redis-cli.exe: 服务端开启后,我们的客户端就可以输入各种命令测试了 

1、打开一个cmd窗口,使用cd命令切换到指定目录(F:\Redis)运行 redis-server.exe redis.conf 

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

 

接下来在使用Redis时,还需要下载C#驱动(也就是C#开发库),如下图:

当然,我们可以直接在项目管理NuGet程序包中下载ServiceStack.Redis

四、给Redis设置密码

在讲Redis数据类型之前,我们先给Redis设置上密码,不能让其在外网环境下面裸奔啊,我们可以为其设置一个复杂的访问密码,最好20位以上,这样可以有效防止别人暴力破解。

找到redis的配置文件,默认在安装指定目录下conf文件夹中,我的是在:E:\Redis\conf\redis.conf,查找requirepass选项配置

把这个选项前面的#注释干掉,然后在后面添加一个复杂的密码

# use a very strong password otherwise it will be very easy to break.
#
 requirepass @Test_20190505_chuanlei

# Command renaming.

五、Redis常用数据类型

使用Redis,我们不用在面对功能单调的数据库时,把精力放在如何把大象放进冰箱这样的问题上,而是利用Redis灵活多变的数据结构和数据操作,为不同的大象构建不同的冰箱。

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

  •    String
  •    Hash
  •    List
  •    Set
  •    Sorted set
static string host = "127.0.0.1";/*访问host地址*/
        static string password = "@Test_20190505_chuanlei";
        static readonly RedisClient client = new RedisClient(host, 6379, password);
public string TestRedis()
{
  client.Set<int>("pwd", 1111);
            int pwd = client.Get<int>("pwd");
            //client.BgSave();
            UserInfo userInfo = new UserInfo() { UserName = "zhangsan", UserPwd = "1111" };//</span>(底层使用json序列化 )  
            client.Set<UserInfo>("userInfo", userInfo);
            UserInfo user = client.Get<UserInfo>("userInfo");

            List<UserInfo> list = new List<UserInfo>() { new UserInfo() { UserName = "lisi", UserPwd = "111" }, new UserInfo() { UserName = "wangwu", UserPwd = "123" } };
            for (int i = 0; i < 50; i++)
            {
                UserInfo ui = new UserInfo();
                ui.UserName = "uname" + i;
                ui.UserPwd = "upwd" + i;
                list.Add(ui);
            }
            client.Set<List<UserInfo>>("list", list);
            List<UserInfo> userInfoList = client.Get<List<UserInfo>>("list");
            List<UserInfo> ulist = new List<UserInfo>();
            foreach (var item in userInfoList)
            {
                UserInfo ui = new UserInfo();
                ui.UserName = item.UserName;
                ui.UserPwd = item.UserPwd;
                ui.NowDateTime = DateTime.Now.ToString();
                ui.UptUser = "admin";
                ulist.Add(ui);
            }
            client.Set<List<UserInfo>>("ulist", ulist);
            List<UserInfo> uList = client.Get<List<UserInfo>>("ulist");
}

以上是普通的读写,也是我初步的运用

欢迎提问!

posted on 2019-05-05 15:40  衢阳  阅读(196)  评论(0编辑  收藏  举报