C#之Redis为所欲为
一 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为所欲为的更多相关文章
- Redis的正确使用姿势
前言 说到分布式缓存,可能大多数人脑海浮现的就是redis了,为什么redis能够在竞争激烈的缓存大战中脱颖而出呢?原因无非有一下几点:性能好,丰富的特性跟数据结构,api操作简单.但是用的人多了,就 ...
- Redis安全性配置
最近Redis刚爆出一个安全性漏洞,我的服务器就“光荣的”中招了.黑客攻击的基本方法是: 扫描Redis端口,直接登录没有访问控制的Redis 修改Redis存盘配置:config set dir / ...
- Redis(十二)flush误操作、Redis安全、处理bigkey和寻找热点key
一.flushall/flushdb误操作的处理 假设进行flush操作的Redis是一对主从结构的主节点,其中键值对的个数是100万,每秒写入量是1000. 1.缓存与存储 被误操作flush后,根 ...
- 我的 Redis 被入侵了
好吧,我也做了回标题党,像我这么细心的同学,怎么可能让服务器被入侵呢? 其实是这样的,昨天我和一个朋友聊天,他说他自己有一台云服务器运行了 Redis 数据库,有一天突然发现数据库里的数据全没了,只剩 ...
- 使用redis构建可靠分布式锁
关于分布式锁的概念,具体实现方式,直接参阅下面两个帖子,这里就不多介绍了. 分布式锁的多种实现方式 分布式锁总结 对于分布式锁的几种实现方式的优劣,这里再列举下 1. 数据库实现方式 优点:易理解 缺 ...
- Ignite性能测试以及对redis的对比
测试方法 为了对Ignite做一个基本了解,做了一个性能测试,测试方法也比较简单主要是针对client模式,因为这种方法和使用redis的方式特别像.测试方法很简单主要是下面几点: 不作参数优化,默认 ...
- mac osx 安装redis扩展
1 php -v查看php版本 2 brew search php|grep redis 搜索对应的redis ps:如果没有brew 就根据http://brew.sh安装 3 brew ins ...
- Redis/HBase/Tair比较
KV系统对比表 对比维度 Redis Redis Cluster Medis Hbase Tair 访问模式 支持Value大小 理论上不超过1GB(建议不超过1MB) 理论上可配置(默认配置1 ...
- Redis数据库
Redis是k-v型数据库的典范,设计思想及数据结构实现都值得学习. 1.数据类型 value支持五种数据类型:1.字符串(strings)2.字符串列表(lists)3.字符串集合(sets)4.有 ...
随机推荐
- JAVA之旅(三)——数组,堆栈内存结构,静态初始化,遍历,最值,选择/冒泡排序,二维数组,面向对象思想
JAVA之旅(三)--数组,堆栈内存结构,静态初始化,遍历,最值,选择/冒泡排序,二维数组,面向对象思想 我们继续JAVA之旅 一.数组 1.概念 数组就是同一种类型数据的集合,就是一个容器 数组的好 ...
- VS2008中开发手持终端程序(PDA软件)总结
VS2008中开发手持终端程序(PDA手机软件)的项目总结 1程序结构 程序中包括四个部分: 1.系统配置 这个部分用来配置系统中的相关参数,参数包括数据库信息和串口的配置信息.这部分的主要技术是XM ...
- 学习OpenCV,GPU模块
如何使用opencv的gpu库呢?我这两天一直在搞这个事情,环境的配置见上文(转载),这里我先举个简单的例子,实现这样的功能:host读入一幅图像,加载到GPU上,在GPU上复制一份然后下传到host ...
- BASE64Decoder小解
BASE64Decoder小解 Base64 是网络上最常见的用于传输8Bit 字节代码的编码方式之一,大家可以查看RFC2045 -RFC2049 ,上面有MIME 的详细规范. Base64 要求 ...
- FNDCPASS Troubleshooting Guide For Login and Changing Applications Passwords
In this Document Goal Solution 1. Error Starting Application Services After Changing APPS Pass ...
- 在Windows使用git工具将代码同步至github(作者:ying1989920)
[ps]git是一个分布式代码管理工具,类似于svn,方便协同开发,git里面有所谓的仓库(用来存放代码的),分为本地和线上,线上的你可以自己搭建,不想搭建的话github就给你提供了. [关于 ...
- "《算法导论》之‘线性表’":双向循环链表
本文双链表介绍部分参考自博文数组.单链表和双链表介绍 以及 双向链表的C/C++/Java实现. 1 双链表介绍 双向链表(双链表)是链表的一种.和单链表一样,双链表也是由节点组成,它的每个数据结点中 ...
- iOS 百度地图计算两个点时间的距离
最近在解项目bug,更新地位城市的时候有个错误,后来想在位置改变多少距离之后,再取更新位置,这个功能去年做过.但是又忘记了! 所以还是记录一下吧. 百度地图提供了一个方法: BMKMapPointFo ...
- HBase Muti-Master
为了保证HBase集群的高可靠性,HBase支持多Backup Master 设置.当Active Master挂掉后,Backup Master可以自动接管整个HBase的集群. 该配置极其简单: ...
- Android Binder IPC详解-Android学习之旅(96)
linux内存空间与BInder Driver Android进程和linux进程一样,他们只运行在进程固有的虚拟空间中.一个4GB的虚拟地址空间,其中3GB是用户空间,1GB是内核空间 ,用户空间是 ...