一 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()之间的操作一次性提交给服务器。

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

  1. Redis的安装及配置

    Redis安装及主从配置   一.何为Redis redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表) ...

  2. [转载] 十五分钟介绍 Redis数据结构

    转载自http://blog.nosqlfan.com/html/3202.html?ref=rediszt Redis是一种面向“键/值”对类型数据的分布式NoSQL数据库系统,特点是高性能,持久存 ...

  3. Redis进阶实践之十七 Redis协议的规范

    一.介绍            Redis客户端使用称为RESP(Redis的序列化协议)的协议与Redis服务器进行通信. 虽然协议是专门为Redis设计的,但它可以用于其他客户端 - 服务器软件项 ...

  4. redis学习-散列表常用命令(hash)

    redis学习-散列表常用命令(hash)   hset,hmset:给指定散列表插入一个或者多个键值对 hget,hmget:获取指定散列表一个或者多个键值对的值 hgetall:获取所欲哦键值以及 ...

  5. linux --mariadb/redis数据库篇

    mariadb ---磁盘型数据库 基础安装 配置好yum源后,软件就可以通过配置的yum源进行安装,按理来讲安装mysql直接通过   yum install mariadb  -y  便可安装,但 ...

  6. 十五分钟介绍 Redis数据结构

    下面是一个对Redis官方文档<A fifteen minute introduction to Redis data types>一文的翻译,如其题目所言,此文目的在于让一个初学者能通过 ...

  7. 十五分钟介绍 Redis数据结构--学习笔记

    下面是一个对Redis官方文档<A fifteen minute introduction to Redis data types>一文的翻译,如其题目所言,此文目的在于让一个初学者能通过 ...

  8. redis(7)LRU缓存

    一.LRU简介 LRU是Least Recently Used的缩写,即:最近最少使用. 它是内存管理中的一种页面置换算法,对于在内存中但是又不用的数据块,操作系统会根据哪些数据属于LRU而将其移除内 ...

  9. Linux下安装redis报错信息

    redis在Linux安装报错 标签: redislinuxcentos 2017-02-24 13:46 384人阅读 评论(0) 收藏 举报  分类: Linux安装工具(2)  版权声明:本文为 ...

随机推荐

  1. Shell脚本的调试技术

    编程中必不可少的一点就是调试,Shell脚本以其强大的功能令人向往,当然,它的强大之处不只是体现在语言的实现功能上,更强大的是它的调试功能,下面,我将以实例讲解Shell脚本的调试技术. 下面是我所用 ...

  2. 运行React-Native项目

    首先需要配置好环境.集体配置安装Homebrew,Node.js,React Native; 命令行开启RN项目 (如要cd 进入到当前项目的跟目录下) 1. npm install 2. react ...

  3. Android官方技术文档翻译——IntelliJ 项目迁移

    本文译自Android官方技术文档<Migrating from IntelliJ Projects>,原文地址:http://tools.android.com/tech-docs/ne ...

  4. linux进程的介绍和管理

    概述 -   在linux 中,每个执行的程序都称为一个进程,每一个进程都分配一个ID号 -   每一个进程,都会对应一个父进程,而这个父进程可以复制多个子进程,例如www服务器 -   每个进程都可 ...

  5. The type java.lang.Object cannot be resolved. It is indirectly referenced from required .class files

    The type java.lang.Object cannot be resolved.It is indirectly referenced from required .class files ...

  6. LeetCode之“动态规划”:Maximum Subarray

    题目链接 题目要求: Find the contiguous subarray within an array (containing at least one number) which has t ...

  7. Linux下进程通信方式(简要概述)

    http://blog.sina.com.cn/s/blog_65c209580100u0ee.html (1)管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先 ...

  8. Libevent库学习笔记

    Libevent是一个事件触发的网络库,适用于windows.linux.bsd等多种平台,Libevent在底层select.pool.kqueue和epoll等机制基础上,封装出一致的事件接口.可 ...

  9. 坚持自己的追求,迎来 “中国系统开发网” (CSDN)的专访

    坚持自己的追求,迎来 "中国系统开发网" (CSDN)的专访: 专访马根峰:海量数据处理与分析大师的中国本土程序员" http://www.csdn.net/articl ...

  10. SharePoint 调查添加图片支持

    前言:今天,碰到一个有趣的问题,就是SharePoint调查里面,添加对于图片的支持,众所周知,SharePoint的调查就支持那么几种字段类型的问题,当然,我们可以开发实现,不过,这个不是我们今天介 ...