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()之间的操作一次性提交给服务器。
C#之Redis所欲为的更多相关文章
- Redis的安装及配置
Redis安装及主从配置 一.何为Redis redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表) ...
- [转载] 十五分钟介绍 Redis数据结构
转载自http://blog.nosqlfan.com/html/3202.html?ref=rediszt Redis是一种面向“键/值”对类型数据的分布式NoSQL数据库系统,特点是高性能,持久存 ...
- Redis进阶实践之十七 Redis协议的规范
一.介绍 Redis客户端使用称为RESP(Redis的序列化协议)的协议与Redis服务器进行通信. 虽然协议是专门为Redis设计的,但它可以用于其他客户端 - 服务器软件项 ...
- redis学习-散列表常用命令(hash)
redis学习-散列表常用命令(hash) hset,hmset:给指定散列表插入一个或者多个键值对 hget,hmget:获取指定散列表一个或者多个键值对的值 hgetall:获取所欲哦键值以及 ...
- linux --mariadb/redis数据库篇
mariadb ---磁盘型数据库 基础安装 配置好yum源后,软件就可以通过配置的yum源进行安装,按理来讲安装mysql直接通过 yum install mariadb -y 便可安装,但 ...
- 十五分钟介绍 Redis数据结构
下面是一个对Redis官方文档<A fifteen minute introduction to Redis data types>一文的翻译,如其题目所言,此文目的在于让一个初学者能通过 ...
- 十五分钟介绍 Redis数据结构--学习笔记
下面是一个对Redis官方文档<A fifteen minute introduction to Redis data types>一文的翻译,如其题目所言,此文目的在于让一个初学者能通过 ...
- redis(7)LRU缓存
一.LRU简介 LRU是Least Recently Used的缩写,即:最近最少使用. 它是内存管理中的一种页面置换算法,对于在内存中但是又不用的数据块,操作系统会根据哪些数据属于LRU而将其移除内 ...
- Linux下安装redis报错信息
redis在Linux安装报错 标签: redislinuxcentos 2017-02-24 13:46 384人阅读 评论(0) 收藏 举报 分类: Linux安装工具(2) 版权声明:本文为 ...
随机推荐
- 《java入门第一季》正则表达式小案例
案例一:当你登陆某个论坛,向发帖子留下自己qq号的时候,可惜你的号码就是留不下,总是输入*,或者其它奇妙的字符串.其实原理就是用了正则表达式替换. /* * 替换功能 * String类的public ...
- CSS引入
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- C语言所有作业练习题
2015.08.11 1.计算十进制 42 转换为二进制.八进制.十六进制分别对应的值 2.计算二进制 11010110 对应的十进制值 3.计算八进制 075 对应的十进制值 4.计算十六进制 0x ...
- 江湖问题研究-- intent传递有没有大小限制,是多少?
出门一步,便是江湖,江湖上有许多流言. 比如这条: intent传递是有大小限制的,具体在40KB左右. 当然也有传言说是1M左右. 数百头母驴为何半夜惨叫? 小卖部安全套为何屡遭黑手? 女生宿舍内裤 ...
- 【翻译】Ext JS 5.0.1 中的新功能
原文:What's New in Ext JS 5.0.1 今天,我们很高兴的宣布Ext JS 5.0.1发布了!此维护版本基于Sencha社区的反馈做了一些改进.下面让我们来了解一下这些改变. 可访 ...
- [转]smail语法 详解
大家都应该知道APK文件其实就是一个MIME为ZIP的压缩包,我们修改ZIP后缀名方式可以看到内部的文件结构,例如修改后缀后用RAR打开鳄鱼小顽皮APK能看到的是(Google Play下载的完整版版 ...
- Swift之GCD使用指南1
Grand Central Dispatch(GCD)是异步执行任务的技术之一.一般将应用程序中记述的线程管理用的代码在系统级中实现.开发者只需要定义想执行的任务并追加到适当的Dispatch Que ...
- Android ROM开发(一)——Windows下Cygwin和Android_Kitchen厨房的安装
Android ROM开发(一)--Windows下Cygwin和Android_Kitchen厨房的安装 很久没有碰到ROM开发了,在很久很久以前也是从ROM起步的,无奈还是一脚踏上了Android ...
- schema workbench的操作
1.schema workbench连不上sql,如下: 看不懂,这是驱动的问题,你只要使用最新的驱动,mysql-connector-java-5.1.13-bin.jar 将对应驱动放入schem ...
- iOS评分功能、APP中打开其他应用程序
1.评分功能 iOS中评分支持功能开发非常简单. NSString *str = [NSString stringWithFormat: @"itms-apps://itunes.apple ...