一 Redis是一种支持多种数据结构的键值对数据库

1.1Redis下载地址 :https://github.com/MicrosoftArchive/Redis

建议下载 .msi结尾的应用程序进行安装,会自动安装Redis服务

Redis默认是不能外网访问的

把Redis部署到本地请忽视下面

设置防火墙端口例外

更改redis.conf 文件

bind 127.0.0.1

protected-mode yes

更改为

# bind 127.0.0.1

protected-mode no
然后重启Redis服务,

1.2 Redis支持的数据类型:string、list、set、sortedset、geo(Redis 3.2以上版本),注意不同方法写入的值不能用混了,比如有写list的方法写入的值用获取字符串的方法去获取就有问题了。

1.3 Redis的优点:

支持多种复杂类型的数据结构

高命中的数据是运行在内存中的,数据最终还是可以保存到硬盘中,服务器重启后数据不会丢失

服务器是单线程的,来自所有客户端的所有命令都是串行执行的,不用担心并发修改的问题

支持消息订阅/通知机制,可以用作消息队列

key/value 最大长度允许512M

1.4 Redis的缺点:

Redis是单线程的,因此单个Redis的实例只能使用服务器的一个CPU核,不能充分发挥服务器的性能

二 在 .Net中操作Redis

2.1 在 .net中主要使用两个开源的组件来操作Redis

1. StackExChange.Redis:依赖的组件少,操作接近原生的Redis操作,不收费,强烈推荐使用

2. ServiceStack.Redis:依赖的组件较多,封装的程度较高,有过收费的前科

NuGet命令安装组件 Install-Package StackExChange.Redis

2.2  操作字符串类型的数据

 //创建一个连接,写入一个字符型数据然后读取
public async Task<ViewResult> Index()
{
    //创建一个Redis连接 因为提供了异步的方法,所以本人要玩一个骚操作
    using (ConnectionMultiplexer conn = await ConnectionMultiplexer.ConnectAsync("***.**.**.***:6379"))
    {
        IDatabase db = conn.GetDatabase();
        //往Redis里面写入一个Key为name的字符串
        bool flag= await db.StringSetAsync("name","123");
        //读取数据
        var a= db.StringGet("name");
    }
    return View();
}

  

//String类型可以用作计数器
public async  Task<ViewResult> Index()
{
    using (ConnectionMultiplexer conn = ConnectionMultiplexer.Connect("120.25.161.171:6379,abortConnect = false"))
    {
        IDatabase db = conn.GetDatabase();
        //StringAppend向这个key的字符串追加内容,没有则创建,返回该字符串
        var A = db.StringAppend("敢问是段友?","yes yes yes");
        //StringIncrementAsync计数器,从0开始自加1,没有则从0开始,返回计数后的结果
        long a = await db.StringIncrementAsync("天王盖地虎",1);
        long b = Convert.ToInt64( db.StringGet("天王盖地虎"));
        long c =  db.StringDecrement("清风拂杨柳", 1);
    }
    return View();
}

  

2.3 操作List类型数据

 public async  Task<ViewResult> Index()
{
    using (ConnectionMultiplexer conn = ConnectionMultiplexer.Connect("***.**.***.***:6379,abortConnect = false"))
    {
        IDatabase db = conn.GetDatabase();
        for (int i = 0; i < 20; i++)
        {
           //往集合u哦便Push数据
           var a= await db.ListLeftPushAsync("List1", ""+i+"");
        }
        //往集合右边Pop数据Pop读取了数据后数据会从集合中移除(消息队列)
        RedisValue b = db.ListRightPop("List1");
        //读取集合中全部数据,不会将数据移除
        RedisValue[] c =await db.ListRangeAsync("List1");
    }
    return View();
}

  

2.5  Hash

value 又是一个“键值对集合”或者值是另外一个 Dictionary。

2.6 SortedSet类型的数据

如果对于数据遍历顺序有要求,可以使用 sortedset,他会按照打分来进行遍历。

 public async  Task<ViewResult> Index()
{
    using (ConnectionMultiplexer conn = ConnectionMultiplexer.Connect("120.25.161.171:6379,abortConnect = false"))
    {
        IDatabase db = conn.GetDatabase();
        //SortedSetIncrement 用于给Set数据的vaule排序
        for (int i = 0; i < 5; i++)
        {
            var a = db.SortedSetIncrement("resou","小熊vs",1);
        }
        for (int i = 0; i < 3; i++)
        {
            var b = db.SortedSetIncrement("resou", "田伯光", 1);
        }
        for (int i = 0; i <6; i++)
        {
            var c = db.SortedSetIncrement("resou", "段正淳", 1);
        }

        SortedSetEntry[] d= db.SortedSetRangeByRankWithScores("resou");
        foreach (var item in d)
        {
            Console.WriteLine(item);
        }
        //根据排序返回值,可以根据序号查询其中一部分;
        //RedisValue[] SortedSetRangeByRank(RedisKey key, long start = 0, long stop = -1, Order order = Order.Ascending)
        //根据排序返回值,可以只返回 start-stop 这个范围;
        //RedisValue[] SortedSetRangeByScore(RedisKey key, double start = double.NegativeInfinity, double stop = double.PositiveInfinity, Exclude exclude = Exclude.None, Order order = Order.Ascending, long skip = 0, long take = -1)
    }
    return View();
}

  

2.5 Geo数据类型的基本操作

Geo 是 Redis 3.2 版本后新增的数据类型,用来保存兴趣点(POI,point of interest)的坐标信息。 可以实现计算两 POI 之间的距离、获取一个点周边指定距离的 POI。

public async  Task<ViewResult> Index()
{
    using (ConnectionMultiplexer conn = ConnectionMultiplexer.Connect("120.25.161.171:6379,abortConnect = false"))
    {
        IDatabase db = conn.GetDatabase();
        //添加一个兴趣点
        db.GeoAdd("hehe", new GeoEntry(11.22,12.23,"1"));
        db.GeoAdd("hehe", new GeoEntry(11.32, 12.23, "2"));
        db.GeoAdd("hehe", new GeoEntry(11.42, 12.23, "3"));
        //根据点的主键获取坐标
        GeoPosition? pos = db.GeoPosition("ShopsGeo", "1");
        //计算两个兴趣点之间的距离
        var a= db.GeoDistance("hehe","1","3",GeoUnit.Meters);
        //计算某个兴趣点范围内其余的兴趣点
        GeoRadiusResult[] grr= db.GeoRadius("hehe",1,10000,GeoUnit.Meters);
        //计算一个经纬度范围内的距离
        GeoRadiusResult[] grr2 = db.GeoRadius("hehe", 11.42, 12.23,1000, GeoUnit.Meters);
        foreach (var item in grr)
        {
           Console.WriteLine(item.Member + ":" + item.Distance + "米");
        }
    }
    return View();
}

  

三 Redis批量操作

如果一次性执行多个Redis操作很多那么会很慢,可以使用批量操作。

主要有两种方式:

1) 几乎所有的操作都支持数组类型,这样就可以一次性操作多条数据:比如 GeoAdd(RedisKey key, GeoEntry[] values)、SortedSetAdd(RedisKey key, SortedSetEntry[] values)

2) 如果一次性的操作不是简单的同类型操作,那么就要使用批量模式:

IBatch batch = db.CreateBatch(); db.GeoAdd("ShopsGeo1", new GeoEntry(116.34039, 39.94218, "1")); db.StringSet("abc", "123"); batch.Execute();

会把当前连接的 CreateBatch()、Execute()之间的操作一次性提交给服务器。

-----------------------------------------------------看后点推荐,么么哒------------------------------------------------------

-----------------------------------------------------.net交友群:731573976------------------------------------------------------

C#之Redis为所欲为的更多相关文章

  1. Redis的正确使用姿势

    前言 说到分布式缓存,可能大多数人脑海浮现的就是redis了,为什么redis能够在竞争激烈的缓存大战中脱颖而出呢?原因无非有一下几点:性能好,丰富的特性跟数据结构,api操作简单.但是用的人多了,就 ...

  2. Redis安全性配置

    最近Redis刚爆出一个安全性漏洞,我的服务器就“光荣的”中招了.黑客攻击的基本方法是: 扫描Redis端口,直接登录没有访问控制的Redis 修改Redis存盘配置:config set dir / ...

  3. Redis(十二)flush误操作、Redis安全、处理bigkey和寻找热点key

    一.flushall/flushdb误操作的处理 假设进行flush操作的Redis是一对主从结构的主节点,其中键值对的个数是100万,每秒写入量是1000. 1.缓存与存储 被误操作flush后,根 ...

  4. 我的 Redis 被入侵了

    好吧,我也做了回标题党,像我这么细心的同学,怎么可能让服务器被入侵呢? 其实是这样的,昨天我和一个朋友聊天,他说他自己有一台云服务器运行了 Redis 数据库,有一天突然发现数据库里的数据全没了,只剩 ...

  5. 使用redis构建可靠分布式锁

    关于分布式锁的概念,具体实现方式,直接参阅下面两个帖子,这里就不多介绍了. 分布式锁的多种实现方式 分布式锁总结 对于分布式锁的几种实现方式的优劣,这里再列举下 1. 数据库实现方式 优点:易理解 缺 ...

  6. Ignite性能测试以及对redis的对比

    测试方法 为了对Ignite做一个基本了解,做了一个性能测试,测试方法也比较简单主要是针对client模式,因为这种方法和使用redis的方式特别像.测试方法很简单主要是下面几点: 不作参数优化,默认 ...

  7. mac osx 安装redis扩展

    1 php -v查看php版本 2 brew search php|grep redis 搜索对应的redis   ps:如果没有brew 就根据http://brew.sh安装 3 brew ins ...

  8. Redis/HBase/Tair比较

    KV系统对比表 对比维度 Redis Redis Cluster Medis Hbase Tair 访问模式    支持Value大小 理论上不超过1GB(建议不超过1MB) 理论上可配置(默认配置1 ...

  9. Redis数据库

    Redis是k-v型数据库的典范,设计思想及数据结构实现都值得学习. 1.数据类型 value支持五种数据类型:1.字符串(strings)2.字符串列表(lists)3.字符串集合(sets)4.有 ...

随机推荐

  1. JAVA之旅(三)——数组,堆栈内存结构,静态初始化,遍历,最值,选择/冒泡排序,二维数组,面向对象思想

    JAVA之旅(三)--数组,堆栈内存结构,静态初始化,遍历,最值,选择/冒泡排序,二维数组,面向对象思想 我们继续JAVA之旅 一.数组 1.概念 数组就是同一种类型数据的集合,就是一个容器 数组的好 ...

  2. VS2008中开发手持终端程序(PDA软件)总结

    VS2008中开发手持终端程序(PDA手机软件)的项目总结 1程序结构 程序中包括四个部分: 1.系统配置 这个部分用来配置系统中的相关参数,参数包括数据库信息和串口的配置信息.这部分的主要技术是XM ...

  3. 学习OpenCV,GPU模块

    如何使用opencv的gpu库呢?我这两天一直在搞这个事情,环境的配置见上文(转载),这里我先举个简单的例子,实现这样的功能:host读入一幅图像,加载到GPU上,在GPU上复制一份然后下传到host ...

  4. BASE64Decoder小解

    BASE64Decoder小解 Base64 是网络上最常见的用于传输8Bit 字节代码的编码方式之一,大家可以查看RFC2045 -RFC2049 ,上面有MIME 的详细规范. Base64 要求 ...

  5. FNDCPASS Troubleshooting Guide For Login and Changing Applications Passwords

    In this Document   Goal   Solution   1. Error Starting Application Services After Changing APPS Pass ...

  6. 在Windows使用git工具将代码同步至github(作者:ying1989920)

     [ps]git是一个分布式代码管理工具,类似于svn,方便协同开发,git里面有所谓的仓库(用来存放代码的),分为本地和线上,线上的你可以自己搭建,不想搭建的话github就给你提供了. [关于 ...

  7. "《算法导论》之‘线性表’":双向循环链表

    本文双链表介绍部分参考自博文数组.单链表和双链表介绍 以及 双向链表的C/C++/Java实现. 1 双链表介绍 双向链表(双链表)是链表的一种.和单链表一样,双链表也是由节点组成,它的每个数据结点中 ...

  8. iOS 百度地图计算两个点时间的距离

    最近在解项目bug,更新地位城市的时候有个错误,后来想在位置改变多少距离之后,再取更新位置,这个功能去年做过.但是又忘记了! 所以还是记录一下吧. 百度地图提供了一个方法: BMKMapPointFo ...

  9. HBase Muti-Master

    为了保证HBase集群的高可靠性,HBase支持多Backup Master 设置.当Active Master挂掉后,Backup Master可以自动接管整个HBase的集群. 该配置极其简单: ...

  10. Android Binder IPC详解-Android学习之旅(96)

    linux内存空间与BInder Driver Android进程和linux进程一样,他们只运行在进程固有的虚拟空间中.一个4GB的虚拟地址空间,其中3GB是用户空间,1GB是内核空间 ,用户空间是 ...