在虚拟机安装Linux+Linux环境搭建Redis+.net core 3.1 使用Redis

一、安装linux这个比较简单,有安装包就可以了

下面就不写文字了,看图片跟着做就好了

 

 

 

 

这里需要一个镜像文件,去下载一个就好https://www.centos.org/  我下载的版本是 CentOS-7-x86_64-DVD-2003.iso

 

 

 然后开机,会自动安装,选项选第一个。接下来进行一些选项的选择,按Continue

 

 

 

 

 

 

 

 

 

 

 然后就选择Done,等待安装就好了

 

 

 

好了 如果到了这个界面 就差一步了,需要把网络搞定

 

输入命令 vi /etc/sysconfig/network-scripts/ifcfg-ens32    这里的ens32是我的,你自己的网络是什么就选什么

进入之后按键盘“i” 然后移动光标把图片中的onboot 改成yes 按ESC 输入:wq 就能保存退出了,

输入:q! 就是直接退出 不保存,如果改错了 就不保存直接退出 

 接下来重启一下网卡  service network restart   看到了已经联网了,到这儿系统算是安装完成了,需要安装软件了

 接下来我们 使用yum 安装 redis,安装前 先把yum更新一下

 

更新完成,如果有错误,就自行百度一下吧。我装了很多次 只要按照步骤去走,很难报错的。

 

 接下来需要下载redis,这里我们使用 wget 直接在网上下载 wget http://download.redis.io/releases/redis-stable.tar.gz,但是提示我们 找不到wget

 我们使用yum install wget 来安装

 安装完成后按箭头向上键。。把之前输入的 命令敲回来,回车执行,等一会儿ll

可以看到已经在根目录下有一个安装包了

 这里我们新建一个文件夹,然后把压缩包移动到 新建的文件夹中mkdir 创建  mv 移动  cd 是进入   ll查看目录文件

 解压文件  tar -xzvf redis-stable.tar.gz  解压完成后,会多出来一个文件夹,我们会看到里面有很多 子文件夹

 接下来 我们要make 但是在那之前,我们先安装一下gcc 因为 安装redis 需要gcc    yum install gcc  安装完成后,make一下

这里我们看到了在make的时候有两个错误。。 一个 error1 一个error2 解决一下

 

 原因是因为gcc版本过低,yum安装的gcc是4.8.5的。因此需要升级gcc,升级过程如下:

yum -y install centos-release-scl

yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils

scl enable devtoolset-9 bash

echo "source /opt/rh/devtoolset-9/enable" >> /etc/profile

gcc -v

最后在执行一下make,这次编译通过,我们接下来 make install

 然后进入src 安装redis

 为了方便管理,我们新建两个文件夹,etc 和bin 

 然后把 redis.conf 移动到etc 目录下,把 常用的命令 移动到bin 目录,

移动时需要注意,redis.conf 在redis-stable 目录下,其他的在 redis-stable/src目录下

mv redis.conf /usr/local/redis/etc

mv mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-server /usr/local/redis/bin/

 查看结果,已经转移到相应的目录

 接下来我们设置后台启动  修改redis.conf    vim redis.conf  按i  启动编辑 

注释掉 bind 127.0.0.1   如果不注释掉只能本机访问

接着把 daemonize 改成yes   开启守护现成模式,后台运行,不然你退出exit 都会关闭

把 protected-mode 改成no    被保护,默认是yes 如果外部需要连接 需要配置bind 和密码,直接改成no就方便一点(因为我这里是局域网使用)

按ESC  输入:wq

 

 

 保存退出后,

启动redis 使用我们刚才配置好的配置文件启动

进入到bin 目录  输入命令 ./redis-server /usr/local/redis/etc/redis.conf

然后使用客户端  ./redis-cli    这样redis 就算是启动了

接下来我们测试一下 yum install net-tools 先装一个 net-tools 

然后输入命令netstat -tunpl|grep 6379,可以看到端口已经启动

也可以使用 ps -ef | grep redis

 

这里有个很重要的点,如果不设置客户端就一直连接不上,那就是防火墙需要在防火墙下开启 6379的 端口

firewall-cmd --zone=public --add-port=6379/tcp --permanent  然后重启 systemctl restart firewalld

redis服务已经启动成功了,就等着客户端连接了,下面我们开始使用.NET core 连接 redis

首先在appsettings.json增加一个redis配置串

 在common类库中添加一个类SerializeHelper.cs,存放序列化方法  先引用Nuget包 Newtonsoft.Json  代码如下

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Text;

namespace WebApi.Core.Common
{
    public class SerializeHelper
    {
        /// <summary>
        /// 序列化
        /// </summary>
        /// <param name="item"></param>
        /// <returns></returns>
        public static byte[] Serialize(object item)
        {
            var jsonString = JsonConvert.SerializeObject(item);

            return Encoding.UTF8.GetBytes(jsonString);
        }
        /// <summary>
        /// 反序列化
        /// </summary>
        /// <typeparam name="TEntity"></typeparam>
        /// <param name="value"></param>
        /// <returns></returns>
        public static TEntity Deserialize<TEntity>(byte[] value)
        {
            if (value == null)
            {
                return default(TEntity);
            }
            var jsonString = Encoding.UTF8.GetString(value);
            return JsonConvert.DeserializeObject<TEntity>(jsonString);
        }
    }
}

继续在common类库中 新建两个类RedisCacheManager.cs  IRedisCacheManager.cs,redis接口和 实现类   引用Nuget包 StackExchange.Redis

 代码如下

using StackExchange.Redis;
using System;
using System.Collections.Generic;
using System.Text;

namespace WebApi.Core.Common.Redis
{
    public class RedisCacheManager:IRedisCacheManager
    {
        private readonly string redisConnenctionString;
        public volatile ConnectionMultiplexer redisConnection;
        private readonly object redisConnectionLock = new object();
        public RedisCacheManager()
        {
            string redisConfiguration = AppSettings.app(new string[] { "AppSettings", "RedisCaching", "ConnectionString" });//获取连接字符串

            if (string.IsNullOrWhiteSpace(redisConfiguration))
            {
                throw new ArgumentException("redis config is empty", nameof(redisConfiguration));
            }
            this.redisConnenctionString = redisConfiguration;
            this.redisConnection = GetRedisConnection();
        }

        /// <summary>
        /// 核心代码,获取连接实例
        /// 通过双if 夹lock的方式,实现单例模式
        /// </summary>
        /// <returns></returns>
        private ConnectionMultiplexer GetRedisConnection()
        {
            //如果已经连接实例,直接返回
            if (this.redisConnection != null && this.redisConnection.IsConnected)
            {
                return this.redisConnection;
            }
            //加锁,防止异步编程中,出现单例无效的问题
            lock (redisConnectionLock)
            {
                if (this.redisConnection != null)
                {
                    //释放redis连接
                    this.redisConnection.Dispose();
                }
                try
                {
                    this.redisConnection = ConnectionMultiplexer.Connect(redisConnenctionString);
                }
                catch (Exception)
                {

                    throw new Exception("Redis服务未启用,请开启该服务");
                }
            }
            return this.redisConnection;
        }

        public void Clear()
        {
            foreach (var endPoint in this.GetRedisConnection().GetEndPoints())
            {
                var server = this.GetRedisConnection().GetServer(endPoint);
                foreach (var key in server.Keys())
                {
                    redisConnection.GetDatabase().KeyDelete(key);
                }
            }
        }

        public bool Get(string key)
        {
            return redisConnection.GetDatabase().KeyExists(key);
        }

        public string GetValue(string key)
        {
            return redisConnection.GetDatabase().StringGet(key);
        }

        public TEntity Get<TEntity>(string key)
        {
            var value = redisConnection.GetDatabase().StringGet(key);
            if (value.HasValue)
            {
                //需要用的反序列化,将Redis存储的Byte[],进行反序列化
                return SerializeHelper.Deserialize<TEntity>(value);
            }
            else
            {
                return default(TEntity);
            }
        }

        public void Remove(string key)
        {
            redisConnection.GetDatabase().KeyDelete(key);
        }

        public void Set(string key, object value, TimeSpan cacheTime)
        {
            if (value != null)
            {
                //序列化,将object值生成RedisValue
                redisConnection.GetDatabase().StringSet(key, SerializeHelper.Serialize(value), cacheTime);
            }
        }

        public bool SetValue(string key, byte[] value)
        {
            return redisConnection.GetDatabase().StringSet(key, value, TimeSpan.FromSeconds(120));
        }
    }
}
using System;
using System.Collections.Generic;
using System.Text;

namespace WebApi.Core.Common.Redis
{
    public interface IRedisCacheManager
    {
        //获取 Reids 缓存值
        string GetValue(string key);

        //获取值,并序列化
        TEntity Get<TEntity>(string key);

        //保存
        void Set(string key, object value, TimeSpan cacheTime);

        //判断是否存在
        bool Get(string key);

        //移除某一个缓存值
        void Remove(string key);

        //全部清除
        void Clear();
    }
}

接下来该注册redis服务了,进入到startup中的 ConfigureServices 添加如下代码 红色

public void ConfigureServices(IServiceCollection services)
        {
            //注册AppSettings读取类
            services.AddSingleton(new AppSettings(Configuration));

            //注册Swagger服务
            services.AddSwaggerSetup();

            //jwt授权验证
            services.AddAuthorizationJwtSetUp();

            //数据库配置
            BaseDBConfig.ConnectionString = Configuration.GetSection("AppSettings:ConnectionStringOrg").Value;

            //注册Redis
            services.AddSingleton<IRedisCacheManager, RedisCacheManager>();

            services.AddControllers();
        }

接下来测试一下,我们在UserORMController 添加一个函数,函数中使用的redis对象是注入进去的 如下代码,红色代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using WebApi.Core.Common.Redis;
using WebApi.Core.IService;
using WebApi.Core.Model;

namespace WebApi.Core.Api.Controllers
{
    /// <summary>
    /// 用户表测试ORMSqlSuggr
    /// </summary>
    public class UserORMController : BaseController
    {
        //声明一个常量
        private readonly IUserService userService;
        private readonly IRedisCacheManager redisManager;
        /// <summary>
        /// 通过构造函数依赖注入
        /// </summary>
        /// <param></param>
        public UserORMController(IUserService userSer,IRedisCacheManager redisCache)
        {
            userService = userSer;
            redisManager = redisCache;
        }

        /// <summary>
        /// 根据id获取数据
        /// </summary>
        /// <param>参数id</param>
        /// <returns></returns>
        [HttpPost]
        public async Task<IActionResult> GetUser(int id)
        {
            UsersModel user = await userService.QueryByID(id);
            return Ok(user);
        }


        /// <summary>
        /// 添加数据
        /// </summary>
        /// <param>参数id</param>
        /// <returns></returns>
        [HttpPost]
        public async Task<IActionResult> Add(UsersModel user)
        {
            var count = await userService.Add(user);
            return Ok(count);
        }

        /// <summary>
        /// 更新数据
        /// </summary>
        /// <param>参数id</param>
        /// <returns></returns>
        [HttpPost]
        public async Task<IActionResult> Update(UsersModel user)
        {
            var sucess = await userService.Update(user);
            return Ok(sucess);
        }

        /// <summary>
        /// 删除数据
        /// </summary>
        /// <param>参数id</param>
        /// <returns></returns>
        [HttpPost]
        public async Task<IActionResult> Delete(object[] ids)
        {
            var sucess = await userService.DeleteByIds(ids);
            return Ok(sucess);
        }
        /// <summary>
        /// 测试sqlSugar 常用语句
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public IActionResult testSqlSugar()
        {
            userService.testSqlSugar();
            return Ok("true");
        }

        /// <summary>
        /// 测试Redis
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public async Task<IActionResult> Redis(int id)
        {

            var key = $"Redis{id}";
            UsersModel user = new UsersModel();
            if (redisManager.Get<object>(key) != null)
            {
                user = redisManager.Get<UsersModel>(key);
            }
            else
            {
                user = await userService.QueryByID(id);
                redisManager.Set(key, user, TimeSpan.FromHours(2));//缓存2小时
            }

            return Ok(user);
        }
    }
}

运行F5一下  可以看到已经连接redis 成功。

 我们再来看一下 redis 是否有数据了,可以看到已经存入值了

 

 可以在请求一次,就是从redis取数据了,也可以改一下controller里面的过期时间,自己调试一番

原文地址:https://www.cnblogs.com/xiaojinFat/p/13356802.html