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

原文地址:https://www.cnblogs.com/xiongT/p/9038845.html

时间: 2024-07-31 07:10:42

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

Redis 3.2.x版本 redis.conf 的配置文件参数详解

[[email protected] blog]# egrep -v"#|^$" /application/redis/conf/6379.conf bind127.0.0.1 #绑定的主机地址,不设置默认将处理所有请求 protected-modeyes # 3.2里的参数,是否开启保护模式,默认开启.要是配置里没有指定bind和密码.开启该参数后,redis只会本地进行访问,拒绝外部访问.要是开启了密码   和bind,可以开启.否  则最好关闭,设置为no port6379 #指

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

转载自http://blog.nosqlfan.com/html/3202.html?ref=rediszt Redis是一种面向“键/值”对类型数据的分布式NoSQL数据库系统,特点是高性能,持久存储,适应高并发的应用场景.它起步较晚,发展迅速,目前已被许多大型机构采用,比如Github,看看谁在用它.本文翻译自Redis的一篇官方文档:A fifteen minute introduction to Redis data types方便感兴趣的朋友,快速介绍Redis的数据类型. 中英文对照

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

下面是一个对Redis官方文档<A fifteen minute introduction to Redis data types>一文的翻译,如其题目所言,此文目的在于让一个初学者能通过15分钟的简单学习对Redis的数据结构有一个了解. Redis是一种面向“键/值”对类型数据的分布式NoSQL数据库系统,特点是高性能,持久存储,适应高并发的应用场景.它起步较晚,发展迅速,目前已被许多大型机构采用,比如Github,看看谁在用它.本文翻译自Redis的一篇官方文档:A fifteen mi

《Redis设计与实现》[第二部分]单机数据库的实现-C源码阅读(一)

1.数据库 关键字:键空间,过期,删除策略 数据结构源码 //redisServer中属性太多,篇幅限制,故只列本章描述相关的属性 struct redisServer { //... // 数据库 //一个数组,保存着服务器中的所有数据库 redisDb *db; // 服务器的数据库数量 int dbnum; //.. } ; Redis服务器将所有数据库都保存在服务器状态redis.h/redisServer结构的db数组中,db数组的每个项都是一个redis.h/redisDb结构,每个

redis(7)LRU缓存

一.LRU简介 LRU是Least Recently Used的缩写,即:最近最少使用. 它是内存管理中的一种页面置换算法,对于在内存中但是又不用的数据块,操作系统会根据哪些数据属于LRU而将其移除内存而腾出空间来加载另外的数据. 二.redis LRU 官方文章:https://redis.io/topics/lru-cache#using-redis-as-an-lru-cache redis常常被用作缓存,当有新的数据进来的时候会自动驱逐旧的数据.LRU是memcached 默认的驱逐策略

Redis+keepalived实现双机热备

一. 简介 安装使用centos 5.6(64) Master 192.168.2.235 Slave 192.168.2.236 Vip 192.168.2.200 编译环境 yum -y install gcc gcc+ gcc-c++ openssl openssl-devel pcre pcre-devel 当 Master 与 Slave 均运作正常时, Master负责服务,Slave负责Standby: 当 Master 挂掉,Slave 正常时, Slave接管服务,同时关闭主从

Python操作数据库(mysql redis)

一.python操作mysql数据库: 数据库信息:(例如211.149.218.16   szz  123456) 操作mysql用pymysql模块 #操作其他数据库,就安装相应的模块 import  pymysql ip='211.149.218.16' port=3306 passwd='123456' user='root' db='szz' conn=pymysql.connect(host=ip,user=user,port=port,passwd=passwd,db=db,cha

Redis在Linux中安装使用

一.安装$ wget http://download.redis.io/releases/redis-x.x.x.tar.gz $ tar xzf redis-x.x.x.tar.gz $ cd redis-x.x.x $ make sudo cp mkreleasehdr.sh redis-benchmark redis-check-aof redis-cli redis-check-rdb redis-trib.rb redis-sentinel redis-server /usr/loca

redis 学习 四 队列

<?php /** * redis实战 * * 利用列表list实现简单队列 * * @example php cache.php */ header('content-type:text/html;chaeset=utf-8'); $redis = new \Redis(); $redis->connect('127.0.0.1', 6379); // 进队列 $userId = mt_rand(000000, 999999); $redis->rpush('QUEUE_NAME',j