zoukankan      html  css  js  c++  java
  • 在ASP.NET MVC中使用Redis

    一.Redis基本认知

    1.含义: REmote DIctionary Server(Redis) | 是一个key-value存储系统 
    2.特性: 
    2.1 持久化:可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用; 
    2.2 支持丰富的数据类型,如:Strings, Lists, Hashes, Sets 及 Ordered Sets ; 
    2.3 多个操作支持事务,任意单个操作都是原子性的,即要么成功执行要么失败完全不执行; 
    2.4 丰富的特性:支持发布/订阅 , 通知 ,Key过期等 
    3.常用命令 
    3.1 Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务,使用中Redis分为服务端(redis-server)和客户端(redis-cli); 
    客户端是一个管理控制台,服务端负责redis的具体实现以及处理客户端的命令并提供服务;服务端启动时需要配置IP和端口。 
    $redis-cli 连接本地Redis服务; 
    $ redis-cli -h host -p port -a password 连接远程Redis服务

    3.2 可通过 CONFIG 命令查看或设置配置项: 
    CONFIG GET CONFIG_SETTING_NAME 
    CONFIG SET CONFIG_SETTING_NAME NEW_CONFIG_VALUE

    3.3 Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。 
    String(字符串):基本的类型,是二进制安全的,可以包含任何数据 
    SET name “csdn” 
    GET name 
    Hash(哈希):key->多个filed->多个value。是一个键值(key=>value)对集合,是一个string类型的field和value的映射表。 
    HMSET myhash field1 “Hello” field2 “World” 
    HGET myhash field1 
    List(列表):简单的字符串列表,按照插入顺序排序,可以添加一个元素到列表的头部(左边 l)或者尾部(右边 r)。 
    lpush csdn “Hello” 
    rpush csdn “World” 
    lrange csdn 0 2 
    Set(集合):string类型的无序集合,不允许重复的成员,通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 
    sadd csdn redis 
    smembers csdn 
    zset(sorted set:有序集合):是string类型元素的集合,但每个member都会关联一个double类型的score。redis正是通过分数来为集合中的成员进行从小到大的排序。 
    zadd csdn 1 redis 
    ZRANGE csdn 0 10 WITHSCORES

    HyperLogLog结构:是用来做基数统计的算法,见菜鸟教程HyperLogLog

    3.4 Redis的发布/订阅 
    发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。 
    Redis 客户端可以订阅任意数量的频道。 
    使用命令:SUBSCRIBE redisChat 订阅频道(channel),频道由Redis服务端进行维护,其余客户端通过命令:PUBLISH redisChat “Message” 来向redisChat频道 发布消息。

    3.5 事务 
    Redis 事务可以一次执行多个命令, 并且带有以下三个特征: 
    a. 批量操作在发送 EXEC 命令前被放入队列缓存。 
    b.收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。也就是Redis的命令执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制。 
    c.在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。

    一个事务从开始到执行会经历以下三个阶段: 
    开始事务。 
    命令入队。 
    执行事务。

    以命令MULTI开始一个事务,以命令EXEC触发一个事务。

    3.6 Redis 数据备份策略的选择:完整备份(RDB)和增量备份(AOF) 
    转发自Redis持久化存储(AOF与RDB两种模式)

    二.在ASP.NET MVC中使用Redis

    1.首先把Demo贴出来吧,有积分请移步CSDN下载,然后补充下载是百度云下载

    Demo可以正常运行,但仍有许多不完善的地方,以后想起来再回来修改修改,截图如下: 
    这里写图片描述

    2.在.NET体系里,可以使用两个外部的DLL来模拟Redis-client,对Redis-server进行操作:一个是ServiceStack.Redis,另外一个是StackExchange.Redis。这两个包都可以在Nuget中搜索到。 
    Demo中使用的是StackExchange.Redis。它的参考文档点这儿

    示例代码如下:

    private void test1()
            {
                //step-1: 设置Redis链接
                ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost");
                //ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("server1:6379,server2:6379");
                string config = redis.Configuration;
    
                //step-2: Accessing a redis database 连接到Redis数据库
                IDatabase db = redis.GetDatabase();
    
                //step-3: 通过db使用Redis API (http://redis.io/commands)
                db.StringSet("mykey", "myvalue",new TimeSpan(0,10,0),When.Always,CommandFlags.None);
                string value = string.Empty;
                if (db.KeyExists("mykey"))
                {
                    value = db.StringGet("mykey");
                }
            }
    
            private void test2()
            {
                //step-1: 设置Redis链接
                ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost");
    
                //step-2: 创建连接到特定服务的 PUB/SUB 连接
                ISubscriber sub = redis.GetSubscriber();
    
                //step-3: 订阅频道,并处于监听状态,接受消息并处理
                string result = string.Empty;
                sub.Subscribe("messages", (channel, message) =>{
                    result = string.Format("Channel:{0} ; Message:{1} .", channel.ToString(), message);
                });
            }
    
            private void test3()
            {
                //step-1: 设置Redis链接
                ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost");
    
                //step-2: 创建连接到特定服务的 PUB/SUB 连接
                ISubscriber sub = redis.GetSubscriber();
    
                //step-3: 在另一个进程或是机器上,发布消息
                sub.Publish("messages", "hello");
            }

    详情可以看Demo里面的RedisHelper。

    三.Redis更新策略探究

    1.单台服务器下如何保持与数据库的数据一致 
    2.多台服务器下如何使用分布式缓存

    哈哈 这一部分还没怎么实际操作过,所以留待以后有了实操经验了再来更新。

  • 相关阅读:
    通过IP获取所在城市
    一次完整的HTTP请求过程
    Array.prototype.slice.call(arguments)
    移动web资源整理
    Null 和 Undefined
    JS正则表达式
    JavaScript和JSP的区别?
    JS判断图片上传时文件大小和图片尺寸
    JavaScript中的callee与caller的区别
    php结合redis实现高并发下的抢购、秒杀功能
  • 原文地址:https://www.cnblogs.com/yelanggu/p/10205001.html
Copyright © 2011-2022 走看看