迷恋自留地 发表于 2021-8-29 18:37

C# Redis 的基本使用

# C# Redis 的基本使用
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200508091827420.png)
**Redis 概述**
在我们日常的开发中,无不都是使用数据库来进行数据的存储,由于一般的系统任务中通常不会存在高并发的情况,所以这样看起来并没有什么问题,可是一旦涉及大数据量的需求,比如一些商品抢购的情景,或者是主页访问量瞬间较大的时候,单一使用数据库来保存数据的系统会因为面向磁盘,磁盘读/写速度比较慢的问题而存在严重的性能弊端,一瞬间成千上万的请求到来,需要系统在极短的时间内完成成千上万次的读/写操作,这个时候往往不是数据库能够承受的,极其容易造成数据库系统瘫痪,最终导致服务宕机的严重生产问题。
         

### 为什么使用
1. 解决应用服务器的cpu和内存压力
2. 减少io的读操作,减轻io的压力
3. 关系型数据库的扩展性不强,难以改变表结构

##### 优点
1.nosql数据库没有关联关系,数据结构简单,拓展表比较容易
2.nosql读取速度快,对较大数据处理快

##### 适用场景
1.    数据高并发的读写
2.    海量数据的读写
3.    对扩展性要求高的数据

##### 不适场景
1.    需要事务支持(非关系型数据库)
2.    基于sql结构化查询储存,关系复杂
        * 存储 缓存 用的数据;
        * 需要高速读/写的场合使用它快速读/写;

缓存在日常对数据库的访问中,读操作的次数远超写操作,比例大概在 1:9 到 3:7,所以需要读的可能性是比写的可能大得多的。当我们使用SQL语句去数据库进行读写操作时,数据库就会去磁盘把对应的数据索引取回来,这是一个相对较慢的过程。如果我们把数据放在 Redis 中,也就是直接放在内存之中,让服务端直接去读取内存中的数据,那么这样速度明显就会快上不少,并且会极大减小数据库的压力,但是使用内存进行数据存储开销也是比较大的,限于成本的原因,一般我们只是使用 Redis 存储一些常用和主要的数据,比如用户登录的信息等。一般而言在使用 Redis 进行存储的时候,我们需要从以下几个方面来考虑:
        * 业务数据常用吗?命中率如何?如果命中率很低,就没有必要写入缓存;
        * 该业务数据是读操作多,还是写操作多?如果写操作多,频繁需要写入数据库,也没有必要使用缓存;
        * 业务数据大小如何?如果要存储几百兆字节的文件,会给缓存带来很大的压力,这样也没有必要;

在考虑了这些问题之后,如果觉得有必要使用缓存,那么就使用它!使用 Redis 作为缓存的读取逻辑如下图所示:从上图我们可以知道以下两点:
        1. 当第一次读取数据的时候,读取 Redis 的数据就会失败,此时就会触发程序读取数据库,把数据读取出来,并且写入 Redis 中;
        2. 当第二次以及以后需要读取数据时,就会直接读取 Redis,读到数据后就结束了流程,这样速度就大大提高了。

### 安装

Redis 的安装访问地址:`https://github.com/ServiceStack/redis-windows/tree/master/downloads`
把 Redis 下载下来后找到一个合适的地方解压,就能得到如下图所示的目录(这里空格被替换成了%20...):

![](https://img-blog.csdnimg.cn/40e6a151cb0a4a28b2474a0094f9c5c9.png)
###### 便捷方式
为了方便启动,我们在该目录下新建一个 startup.cmd 的文件,然后将以下内容写入文件:`redis-server redis.windows.conf1`这个命令其实就是在调用 redis-server.exe 命令来读取 redis.window.conf 的内容,我们双击刚才创建好的 startup.cmd 文件,就能成功的看到 Redis 启动:
![](https://img-blog.csdnimg.cn/2f89b7a80bb848a49d155cce5e07359e.png)



上图的提示信息告诉了我们:
① Redis 当前的版本为 3.0.503;
② Redis 运行在 6379 端口;
③ Redis 进程的 PID 为 14748;
④ 64 位。我们可以打开同一个文件夹下的 redis-cli.exe 文件

这是 Redis 自带的一个客户端工具,它可以用来连接到我们当前的 Redis 服务器,我们做以下测试:如此,我们便在 Windows 的环境下安装好了 Redis


![](https://img-blog.csdnimg.cn/9a93245d23454ba386c536eb9e41667e.png)
###### 安装后的测试
1.双击启动redis-cil 输入命令测试redis 的安装`set   key的名称    value ` 会返回你ok
2.输入`getkey的名称`就会返回你输入的信息,就证明你安装的redis没有问题


### redis的五种数据结构
我首先第一次存进去的是Net分享字符串在后台显示的也是二进制
![在这里插入图片描述](https://img-blog.csdnimg.cn/cf9ecb64d8d84472adb19f101c39c1e9.png)



### 可视化管理工具
![](https://img-blog.csdnimg.cn/a19ed392e309425dbae06dbb6def3814.png)
1. string 字符串(可以为整形、浮点型和字符串,统称为元素)
2. list 列表(实现队列,元素不唯一,先入先出原则)
3. set 集合(各不相同的元素)
4. hash hash散列值(hash的key必须是唯一的)
5. sort set 有序集合

具体代码实现下文的demo

### c#中的使用
1、ServiceStack.Redis,据说是Redis官方推荐使用的驱动类库,但是是收费的。
2、StackExchange.Redis,可能性能要比ServiceStack.Redis差点,但是是免费的。(案例)

#### 1.新建项目控制台程序(RedisDemo)
#### 2.安装`StackExchange.Redis` 通过netget或者命令安装
![在这里插入图片描述](https://img-blog.csdnimg.cn/09f6bf0cfe24424c9c30955985e00e2d.png)
#### 3.新建`Redishelper.cs`帮助类,(到后面会具体封装,先测试)

```csharp
class RedisHelper
    {
      private static readonly ConfigurationOptions ConfigurationOptions = ConfigurationOptions.Parse("127.0.0.1:6379,password=123456");
      private static readonly object Locker = new object();
      private static ConnectionMultiplexer _redisConn;

      /// <summary>
      /// 单例获取
      /// </summary>
      public static ConnectionMultiplexer RedisConn
      {
            get
            {
                if (_redisConn == null)
                {
                  // 锁定某一代码块,让同一时间只有一个线程访问该代码块
                  lock (Locker)
                  {
                        if (_redisConn == null || !_redisConn.IsConnected)
                        {
                            _redisConn = ConnectionMultiplexer.Connect(ConfigurationOptions);
                        }
                  }
                }
                return _redisConn;
            }
      }
    }

```
添加用户实体
```
public class UserInfoDto
    {
      public int Id { get; set; }
      public string StaffId { get; set; }
      public string StaffName { get; set; }
      public string Password { get; set; }
      public System.DateTime LastLoginTime { get; set; }
    }

```
#### 4.String类操作

1.字符串的存放

`:` 该key值加了冒号,成为文件夹

也可以将对象序列化存入里面
![](https://img-blog.csdnimg.cn/3f26a3ef3c364f888a12ab340c5fa9ba.png)

2. 字符串的获取
![](https://img-blog.csdnimg.cn/5cb46dce354a457e8fa1408a2ec66dda.png)
3. 字符串删除
![在这里插入图片描述](https://img-blog.csdnimg.cn/9bb54531692d45288ce7f0392847f0d1.png)

#### 5.Hash类型的操作
Redis hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。

Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿)



![](https://img-blog.csdnimg.cn/38845efa0cb3495eac13b909a703e776.png)

![](https://img-blog.csdnimg.cn/1d358806559e4264b7a035a34fdd2992.png)
为哈希表的每一个域设值
bool HashSet(RedisKey key, RedisValue hashField, RedisValue value)
#### 6.List类型的操作
![](https://img-blog.csdnimg.cn/f9fce535e8b449138d61dbf5dc653e3b.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6L-35oGL6Ieq55WZ5Zyw,size_20,color_FFFFFF,t_70,g_se,x_16)


![](https://img-blog.csdnimg.cn/8da1879947e14fadaf9a75d38ae986fb.png)
![](https://img-blog.csdnimg.cn/55596e7116c144a182ac8e4dcef40c65.png)

```csharp
ListLength获取list的长度
ListLeftPop从顶部拿出数据
ListRightPop 从底部拿出数据
ListRemove 删除list中的单个数值
ListInsertAfter 在某一位置后插入数据
ListInsertBefore 在某一位置前插入数据
```

迷恋自留地 发表于 2021-9-4 16:37

skypaladin 发表于 2021-8-29 22:08
不是说redis windows版本过低,一般只在linux中使用吗?难道windows版也能投入到实际生产环境?

也是可以的

Wapj_Wolf 发表于 2021-8-29 19:16

正在找这方面的资料,感谢大佬分享!

Vrush688 发表于 2021-8-29 19:20

正在找这方面的资料,感谢大佬分享!

skypaladin 发表于 2021-8-29 22:08

不是说redis windows版本过低,一般只在linux中使用吗?难道windows版也能投入到实际生产环境?

hackgsl 发表于 2021-8-29 23:54

感谢分享,学习了。

liaoshangfa 发表于 2021-8-30 09:26

其它平台6.x了

jackuint 发表于 2021-9-14 16:54

不错,收藏学习了。{:1_893:}

GoodLand 发表于 2021-9-22 19:47

不错,redis 用处是真的多,不过我日常使用也只是一股道的get跟set而已

liuyuntianxia12 发表于 2022-8-25 16:43

ServiceStack.Redis可以直接在GitHub上找到源码,可以自行编译驱动类库(限制次数都可以屏蔽)
页: [1] 2
查看完整版本: C# Redis 的基本使用