互联网应用的基石

现在流量稍微大些的网站,都会采取Redis。基于Redis的内存缓存特性,可以大幅度降低数据库的访问量,大大提升了网站的并发能力,充当数据库的削量先锋。既然Redis这么重要,我们从它的官方介绍来完整的了解下它的能力,知己知彼,才能更运用自如。

Redis官方介绍

Redis是一个开源(BSD协议),内存解构存储,可以用作数据库,缓存和消息代理。它支持诸如字符串(strings),哈希散列(hashs),列表(lists),集合(sets),带有范围查询的排序集(sorted sets with range queries),位图(bitmaps),超级日志(hyperloglogs )和带有半径查询的地理空间索引(geospatial indexes with radius queries),Redis具有内置复制( replication),Lua脚本(Lua scripting),LRU驱逐(LRU eviction),事务(transactions )和不同级别的磁盘持久性(different levels of on-disk persistence),并通过Redis Sentinel提供高可用性和通过Redis Cluster自动分区。 您可以 对这些类型运行原子操作,例如附加到字符串 ; 递增哈希值 ; 将元素推送到列表中 ; 计算集合交集, 并集和差异 ; 或者在排序集中获得排名最高的成员。 你可以对这些类型执行原子操作,像追加字符串;在哈希里递增值;推送一个元素到列表;计算集合交集, 并集和差异 ; 或者在排序集中获得排名最高的成员。为了实现其出色的性能,Redis使用 内存数据集。根据您的使用情况,您可以通过 每隔一段时间将数据集转储到磁盘或通过将每个命令附加到日志来保留它。如果您只需要功能丰富的网络内存缓存,则可以选择禁用持久性。

Redis还支持简单到设置的主从异步复制,具有非常快速的非阻塞第一次同步,自动重新连接以及在网络分割上的部分重新同步。

其他功能包括:

  • 事务
  • 发布/订阅
  • Lua脚本(例如:eval 调用redis的脚本)
  • 设置Key的过期时间
  • LRU-Cahce(内存管理的一种页面置换算法,最近最少使用)
  • 自动故障转移(通过Redis Sentinel实现)

Redis是用ANSI C编写,官方建议使用Linux进行部署,Windows版本没有官方支持,但Microsoft开发并维护了Redis的Win-64端口

Redis应用场景

  • 数据表缓存

一般访问量较大的表,读取时可以先获取Redis缓存,获取不到再查询数据库,然后放入Redis。这是最常见的运用场景。

  • 业务状态缓存

例如,多租户的系统,为了减小批量数据压力,可以利用redis实现同一时间内,只能由一个导入。导入完成,清空缓存。也可以限制十分钟内只能导入一次等。

还有例如首页数据放入缓存,两分钟更新一次。

  • 原子性

利用Redis一些原子性命令Inc,decr,可以实现业务参数唯一执行的场景,如订单付款成功通知,为了防止业务线创建多条记录,可以对订单Id执行inc命令,判断是否为1,1代表只有一个执行,如果大于1,则返回结果,并调用decr。类似于信号量。

Redis应用风险

虽然Redis给我们提供了巨大的便利,但也要时刻保持对它的关注。要不然有些时候,会对你造成巨大的伤害。

  • 缓存穿透

意思是指同一个key,数据库没有数据,巨大流量下,会不断的访问数据库。这是浪费的,可以针对一些场景,控制查询次数。如果获取不到值,在指定的时间内不再请求数据库。

  • 缓存雪崩

同一时间内大量key同时失效,造成流量集体访问数据库,临时失去了缓存的作用。

  • 缓存预热

必要的基础数据,可以提前缓存掉。节约第一次加载时间。

  • 风险监控

针对线上机器的不同维度实施监控,如链接数,内存,cpu,稳定性等有异常及时发通知。

  • flushall风险预知

在极端情况下,为了保证新业务的稳定,可能采取被迫措施flushall,清空所有缓存。这种情况下,你一定不能把缓存当成数据库来使用,要有缓存随时可以丢弃的自觉性。谨记!

虽然有大量要注意的风险点,但比起它的收益来讲,我们肯定会继续使用的。量一大,各种问题都会出来,不要怕,挺住!

Redis C#客户端

C#客户端 这里列举了

  • csredis
  • Nhiredis
  • redis-sharp
  • redisboost
  • ServiceStack.Redis
  • Sider
  • StackExchange.Redis
  • TeamDev Redis Client

使用之前,可以先了解下它们的优点和弊端,如ServiceStack.Redis 4.0以上版本属于收费版本。StackExchange.Redis在.net core下有超时bug。

Redis常用命令知悉

Redis官方提供了在线命令测试redis命令,我们可以通过这个网页快速熟悉命令。 命令种类有很多,我们今天先从strings,lists来熟悉下。

string下的命令

  • set
  • get
  • getrange 获取字符串区间
  • append 追加
> set key1 dolll
OK
> get key1
"dolll"
> GETRANGE key1 0 2
"dol"
> append key1 as
7
> get key1
"dolllas"
  • incr 递增
  • decr 递减
> incr hello
(integer) 1
> incr hello
(integer) 2
> decr hello
(integer) 1

list下的命令

  • lpush
  • lrange
> lpush dwe redis
(integer) 1
> lpush dwe ds
(integer) 2
> lpush dwe sd
(integer) 3
> lpush dwe qd
(integer) 4 > lRange dwe 0 20
1) "qd"
2) "sd"
3) "ds"
4) "redis"

匆忙的结束

今天主要重温了下Redis,了解Redis应用场景,C#客户端和简单的运行命令。

分布式Redis缓存串讲(一)的更多相关文章

  1. AbpVnext使用分布式IDistributedCache Redis缓存(自定义扩展方法)

    AbpVnext使用分布式IDistributedCache缓存from Redis(带自定义扩展方法) 我的依赖包的主要版本以及Redis依赖如下 1:添加依赖 <PackageReferen ...

  2. 【转载】分布式之redis复习精讲

    注: 本篇文章转自:分布式之redis复习精讲 引言 为什么写这篇文章? 博主的<分布式之消息队列复习精讲>得到了大家的好评,内心诚惶诚恐,想着再出一篇关于复习精讲的文章.但是还是要说明一 ...

  3. SpringBoot集成Redis分布式锁以及Redis缓存

    https://blog.csdn.net/qq_26525215/article/details/79182687 集成Redis 首先在pom.xml中加入需要的redis依赖和缓存依赖 < ...

  4. 分布式改造剧集之Redis缓存采坑记

    Redis缓存采坑记 ​ 前言 ​ 这个其实应该属于分布式改造剧集中的一集(第一集见前面博客:http://www.cnblogs.com/Kidezyq/p/8748961.html),本来按照顺序 ...

  5. 在这个应用中,我使用了 MQ 来处理异步流程、Redis 缓存热点数据、MySQL 持久化数据,还有就是在系统中调用另外一个业务系统的接口,对我的应用来说这些都是属于 RPC 调用,而 MQ、MySQL 持久化的数据也会存在于一个分布式文件系统中,他们之间的调用也是需要用 RPC 来完成数据交互的。

    在这个应用中,我使用了 MQ 来处理异步流程.Redis 缓存热点数据.MySQL 持久化数据,还有就是在系统中调用另外一个业务系统的接口,对我的应用来说这些都是属于 RPC 调用,而 MQ.MySQ ...

  6. 分布式二级缓存组件实战(Redis+Caffeine实现)

    前言 在生产中已有实践,本组件仅做个人学习交流分享使用.github:https://github.com/axinSoochow/redis-caffeine-cache-starter 个人水平有 ...

  7. 分布式中为什么要加入redis缓存的理解

    面我们介绍了mybatis自带的二级缓存,但是这个缓存是单服务器工作,无法实现分布式缓存.那么什么是分布式缓存呢?假设现在有两个服务器1和2,用户访问的时候访问了1服务器,查询后的缓存就会放在1服务器 ...

  8. 转 Redis 总结精讲 看一篇成高手系统-4

    转 Redis 总结精讲 看一篇成高手系统-4 2018年05月31日 09:00:05 hjm4702192 阅读数:125633   本文围绕以下几点进行阐述 1.为什么使用redis 2.使用r ...

  9. Redis缓存穿透、缓存雪崩、redis并发问题 并发竞争key的解决方案 (阿里)

    阿里的人问我 缓存雪崩(大量数据在同一时间过期了)了如何处理,缓存击穿了如何处理,回答的很烂,做了总结: 把redis作为缓存使用已经是司空见惯,但是使用redis后也可能会碰到一系列的问题,尤其是数 ...

随机推荐

  1. DevOps之基础设施-电力

    唠叨话 关于噢屁事的知识点,仅提供精华汇总,具体知识点细节,参考教程网址,如需帮助,请留言. <基础设施-电力> 关于基础设施的电力部分,知识与技能的层次(知道.理解.运用),理论与实践的 ...

  2. Mongodb集群——master/slave

    集群的配置 (本测试放于同一台机器进行配置,所以IP地址一样,如果是在不同的服务器上更换IP便可以)   1.目录结构       拷贝两份mongodb到/home/scotte.ye/mongo1 ...

  3. Azure 元数据服务:适用于 Windows VM 的计划事件(预览)

    计划事件是 Azure 元数据服务中的其中一个子服务. 它负责显示有关即将发生的事件(例如,重新启动)的信息,使应用程序可以为其做准备并限制中断. 它可用于所有 Azure 虚拟机类型(包括 PaaS ...

  4. 判断Exception类中是否有InnerException属性

    public static class ExceptionExtend { /// <summary> /// 利用反射来判断对象是否包含某个属性 /// </summary> ...

  5. python基础学习16----模块

    模块(Module)的引入 import 模块名 调用模块中的函数的方式为 模块名.函数名 这种方式引入会相当于将模块中代码执行一遍,所以如果引入的模块中有输出语句,那么只写import 模块名,运行 ...

  6. PHPStorm 中配置 XDebug

    1.下载 Xdebug ps : php版本和xdebug版本一定要相对应 如果不知道下载哪个版本,将phpinfo网页的源代码拷贝到https://xdebug.org/wizard.php,然后按 ...

  7. JAVA 连接 SQL Server 2008:java.lang.ClassNotFoundException: com.microsoft.jdbc.sqlserver.SQLServerDriver

    新项目需要修改Java开发的MES系统...Java忘的也差不多了...简单尝试以下JAVA连接SQL Server吧,没想到坑还是很多的.以前直接连oracle时没有这么多麻烦啊....可能微软和o ...

  8. Mysql学习第三天

    mysqldump -u root -p booksdb > C:/backup/booksdb_20180316.sql # 使用mysqldump命令备份数据库中的所有表 mysqldump ...

  9. October 20th 2017 Week 42nd Friday

    My life is in these books. Read these and know my heart. 我的人生就在这些书中,读完他们就能读懂我的心. Some people say tha ...

  10. ArcGIS pro2.3中添加天地图底图

    应用背景: 很多时候,我们需要使用网络上的遥感影像或者百度地图.天地图等在线地图做一些矢量化工作或者其他. 笔者见过很多人都是把百度地图截图,然后把图片导如Arcmap或者Arcgis pro中,然后 ...