zoukankan      html  css  js  c++  java
  • Redis实战

    在.NET Core 项目中操练String

    使用 StackExchange.Redis 访问 Redis

    		static void Main(string[] args)
            {
                using (ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost:6379"))
                {
    
                    IDatabase db = redis.GetDatabase();
                    db.StringSet("name", "Michal Jackson");
                    string name = db.StringGet("name");
                    Console.WriteLine(name); //结果:Michal Jackson
    
                    db.StringSet("age", "11");
                    //incr 自增
                    db.StringIncrement("age");
                    RedisValue age = db.StringGet("age");
                    Console.WriteLine(age);//结果:12
                    //incrby 指定增量
                    age = db.StringIncrement("age", 5);
                    Console.WriteLine(age);//结果:17
                    //decr 自减
                    age = db.StringDecrement("age");
                    Console.WriteLine(age);//结果:16
                    //decrby 指定减量
                    age = db.StringDecrement("age", 5);
                    Console.WriteLine(age);//结果:11
    
                    //mset 设置多个值
                    db.StringSet(new KeyValuePair<RedisKey, RedisValue>[]
                    {
                        new KeyValuePair<RedisKey, RedisValue>("aa", "aa"),
                        new KeyValuePair<RedisKey, RedisValue>("bb", "bb"),
                        new KeyValuePair<RedisKey, RedisValue>("cc", "5"),
                    });
    
                    //mget 取多个值
                    var values = db.StringGet(new RedisKey[] { "aa", "bb", "cc" });
                    foreach (RedisValue redisValue in values)
                    {
                        Console.Write(redisValue + ",");
                    }
                    //结果:aa,bb,5
    
                    //exists 是否存在
                    db.StringSet("name1", "Dave1");
                    bool existsResult = db.KeyExists("name1");
                    Console.WriteLine(existsResult); //结果:true
    
                    //del 删除
                    bool delResult = db.KeyDelete("name1");
                    Console.WriteLine(delResult); //结果:true
                    existsResult = db.KeyExists("name1");
                    Console.WriteLine(existsResult); //结果:false
    
                    //type 判断类型
                    db.StringSet("name2", "Dave2");
                    var typeOfValue = db.KeyType("name2");
                    Console.WriteLine(typeOfValue); //String 
                    
                    //expire 过期时间
                    db.StringSet("name3", "Dave3");
                    db.KeyExpire("name3", TimeSpan.FromSeconds(5));
                    RedisValue value = db.StringGet("name3"); 
                    Console.WriteLine(value);       //Dave3
                    Console.WriteLine("此处等待6秒...");
                    Thread.Sleep(6 * 1000);
                    value = db.StringGet("name3"); //啥也没有..
                    Console.WriteLine(value);
    
                    //ex 设置key直接设置有效期
                    db.StringSet("name4","Dave4", TimeSpan.FromSeconds(5));
                    RedisValue value4 = db.StringGet("name4"); 
                    Console.WriteLine(value4);       //Dave4
                    Console.WriteLine("此处等待6秒...");
                    Thread.Sleep(6 * 1000);
                    value4 = db.StringGet("name4"); //啥也没有..
                    Console.WriteLine(value4);
    
                    //ttl 查看过期时间
                    db.StringSet("name6","Dave6", TimeSpan.FromSeconds(5));
                    for (int i = 1; i < 7; i++)
                    {
                         Thread.Sleep( 1000);
                        RedisValue valueTTL = db.StringGet("name6");
                       var ttl =  db.KeyTimeToLive("name6");
                        if (ttl==null)
                        {
                            Console.WriteLine($"{i}秒过后:Dave6已过期");
                        }
                        else
                        {
                            Console.WriteLine($"{i}秒过后:{valueTTL}还能存活{ttl}秒");
                        }
                        
                     }
                    // 1秒过后:Dave6还能存活00:00:03.9970000秒
                    // 2秒过后:Dave6还能存活00:00:02.9040000秒
                    // 3秒过后:Daue6还能存活00:00:01.9040000秒
                    // 4秒过后:Dave6还能存活00:00:00.9030000秒
                    // 5秒过后:Dave6已过期
                    // 6秒过后:Daue6已过期
                }
    
                Console.ReadKey();
            }
    

    1.string值写到前台,取RedisValue

    Startup.cs 注入 IConnectionMultiplexer

    	services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    
                services.AddSingleton<IConnectionMultiplexer>(ConnectionMultiplexer.Connect("localhost:6379"));
    

    HomeController.cs

        public class HomeController : Controller
        {
            private readonly IConnectionMultiplexer _redis;
            private readonly IDatabase _db;
    
            public HomeController(IConnectionMultiplexer redis)
            {
                _redis = redis;
                _db = _redis.GetDatabase();
            }
    
            public IActionResult Index()
            {
                _db.StringSet("fullname", "Michael Jackson");
                var name = _db.StringGet("fullname");
                return View("Index", name);
            }
    	}
    

    视图 Index

    
    @model StackExchange.Redis.RedisValue
    
    <div class="text-center">
        <h1 class="display-4"> Welcome:@Model </h1>
        <p>Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
    </div>
    

    2.计数器

    2.1 视图组件 ViewComponent

    创建 CounterViewComponent 类

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using Microsoft.AspNetCore.Mvc;
    using System.Threading.Tasks;
    using StackExchange.Redis;
    
    namespace RedisToEsay.ViewComponents
    {
        public class CounterViewComponent : ViewComponent
        {
            private readonly IDatabase _db;
    
            public CounterViewComponent(IConnectionMultiplexer redis)
            {
                _db = redis.GetDatabase();
            }
    
            public async Task<IViewComponentResult> InvokeAsync()
            {
                string controller = RouteData.Values["controller"].ToString();
                string action     = RouteData.Values["action"].ToString();
                if (!string.IsNullOrWhiteSpace(controller) && !string.IsNullOrWhiteSpace(action))
                {
                    var pageId = $"{controller}-{action}";
                    await _db.StringIncrementAsync(pageId);
                    var count = _db.StringGet(pageId);
                    return View("Default", pageId + ":" + count);
                }
    
                throw new Exception("can't get pageId");
            }
        }
    }
    

    创建 Default 视图

    @model string
    
    <h4>@Model</h4>
    

    然后在Shared_Layout.cshtml 调用

      <div>
            @await Component.InvokeAsync("Counter")
        </div>
    

    报错:Defualt 创建的位置不对

    An unhandled exception occurred while processing the request.
    InvalidOperationException: The view 'Components/Counter/Default' was not found. The following locations were searched:
    /Views/Home/Components/Counter/Default.cshtml
    /Views/Shared/Components/Counter/Default.cshtml
    /Pages/Shared/Components/Counter/Default.cshtml
    

    所以创建的位置在 /Views/Shared/Components/Counter/Default.cshtml


    参考:

    草根专栏,Redis in .NET Core 入门:(2) String
    杨旭(Video),Redis in ASP.NET Core 1. 计数器

  • 相关阅读:
    redis安装
    VMware安装Centos
    Nacos简单配置
    RAS非对称加密
    uLua Unity工作机制
    一个长期主义者的内与外
    MacOSX 运行Unity卡顿 [gethostname]
    着眼于长远,走的更稳
    物质趋于无穷, 人群趋于发散.符合熵增加的规律
    论PM与团队与敏捷开发
  • 原文地址:https://www.cnblogs.com/tangge/p/10453367.html
Copyright © 2011-2022 走看看