一 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. 恭喜发财! -- 手把手教你仿造一个qq下拉抢红包 Android自定义view

    猴年猴赛雷啊各位,今天没吃药我感觉自己萌萌哒! qq和微信和支付宝红包大战,不知道各位的战绩是多少嘞? 反正我qq抢到的都是气泡.因为太不爽,所以自己写一个下拉抢红包自己玩(自己跟自己玩). 先来看效 ...

  2. Dynamics CRM2011 隐藏sub-grid 新建项和添加现有项按钮

    在CRM2011中ribbon区的自定义按钮可以通过工具例如RibbonEditor或者RibbonWorkbench进行配置包括action.display等等,但是系统级别的按钮是不能进行编辑的, ...

  3. Github Coding Developer Book For LiuGuiLinAndroid

    Github Coding Developer Book For LiuGuiLinAndroid 收集了这么多开源的PDF,也许会帮到一些人,现在里面的书籍还不是很多,我也在一点点的上传,才上传不到 ...

  4. Android下VideoView的研究

    VideoView继承自SurfaceView,实现了MediaController.MediaPlayerControl的接口.在android系统中的包名为android.widget.Video ...

  5. Android虚拟机 USB转串口调试方法

    有时候需要在虚拟机调试串口,首先安装串口的驱动程序(不知道的话可以用驱动精灵),然后打开设备管理器找到驱动,查看驱动使用的端口(比如COM3),虚拟机需要在命令行启动: 将SDK下的tools文件夹加 ...

  6. SpriteBuilder中子节点的相对位置(%百分比定位)

    子节点(或在这里确切的为精灵sprites)50%的偏移效果使得其在父节点中居中显示,该父节点的纹理在左下角(锚点为0,0). 这样做好过用父节点的位置的实际值来定位.根据父节点实际位置来定位在早期的 ...

  7. 图像边缘检测--OpenCV之cvCanny函数

    图像边缘检测--OpenCV之cvCanny函数 分类: C/C++ void cvCanny( const CvArr* image, CvArr* edges, double threshold1 ...

  8. 通过COM组件方式实现java调用C#写的DLL文件

    转自这里 最近一段时间单位在做一个Web项目,工程师用JAVA语言,需要公用人员信息,统一用户名和密码,原有的平台中是用C#语言开发的,在网上查找解决方法,通过JAVA调用C#的DLL文件实现.网上资 ...

  9. 如何写好一个UITableView(完整版)

    本文是直播分享的简单文字整理,直播共分为上.下两部分.第一部分:优酷 Or YouTube,第二部分:优酷 Demo 地址:KtTableView 如果你觉得UITableViewDelegate和U ...

  10. html5 jqueryrotate插件实现旋转动画

    CSS3 提供了多种变形效果,比如矩阵变形.位移.缩放.旋转和倾斜等等,让页面更加生动活泼有趣,不再一动不动.然后 IE10 以下版本的浏览器不支持 CSS3 变形,虽然 IE 有私有属性滤镜(fil ...