C#之Redis为所欲为

时间:2022-09-09 11:11:59

一 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&sol;HBase&sol;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. Redis常用命令入门2:散列类型

    散列命令 散列类型的键值其实也是一种字典解耦,其存储了字段和字段值的映射,但字段值只能是字符串,不支持其他数据类型,所以说散列类型不能嵌套其他的数据类型.一个散列类型的键可以包含最多2的32次方-1个 ...

  2. &lbrack;C&num;&rsqb;MemoryStream&period;Dispose之后,为什么仍可以ToArray&lpar;&rpar;&quest;

    目录 概述 MemoryStream分析 总结 概述 事件起因,一哥们在群里面贴出了类似下面这样的一段代码: class Program { static void Main(string[] arg ...

  3. &lbrack;转发&rsqb;读取txt防止读到乱码--自动根据文件编码进行读取

    以下是摘抄 /// <summary> /// 获取文件的编码格式 /// </summary> public class EncodingType { /// <sum ...

  4. Ruby 基础教程 第一部分总结

    第一部分:Ruby 初体验 第一章: Ruby 初探 前言 开头的这一章节讲了一些十分基础的内容,重要的几个话题有: ruby 命令的执行方法 对象.方法的概念 常见的打印方法 ruby 命令的执行方 ...

  5. 保证java的jar包在后台运行

    nohup  java -jar XX.jar >temp.text &

  6. ERP行业销售如何挖掘潜在客户?

    要看不同阶段,小企业发展到一定程度,第一个需求是单体财务系统.因为这个时候财务忙不过来了.在大一点就需要业务系统了,就是生产+进销存.有分公司就有集团级软件需求,接着就是oa啊HR啊上下游管理啊等等. ...

  7. python 读取blob

    for num in range(76802): # if num == 0: # c[num] = imagedata[0:4] # d[num] = struct.unpack('i', c[nu ...

  8. 用ajax、PHP、session做购物车

    购物车网页代码 1.登录界面login.php <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ...

  9. 【题解】洛谷P4391 &lbrack;BOI2009&rsqb; Radio Transmission(KMP)

    洛谷P4391:https://www.luogu.org/problemnew/show/P4391 思路 对于给定的字符串 运用KMP思想 设P[x]为前x个字符前缀和后缀相同的最长长度 则对于题 ...

  10. win 7 浏览器被篡改小插曲

    今天下班回家,打开台式机发现IE,火狐都被篡改了.作为运维都会有点强迫症.这是个桌面系统,实在是没兴趣捣鼓.但是还是没办法,经常要用.等我下次有空了,直接换linux好了. 于是开始排查问题吧: 1. ...