Redis简单介绍

Redis简单介绍

什么是Redis?
Redis是一款内存高速缓存数据库。 Redis全称为:Remote Dictionary Server (远程数据服务),使用C语言编写,Redis是一个key-value存储系统(键值存储系统),支持丰富的数据类型,如:String、list、set、zset、hash。

  Redis是一种支持key-value等多种数据结构的存储系统。可用于缓存,事件发布或订阅,高速队列等场景。使用C语言编写,支持网络,提供字符串,哈希,列表,队列,集合结构直接存取,基于内存,可持久化。

Redis 都有什么特点?
1.Redis以内存作为数据存储介质,读写数据的效率极高。
2.Redis中的数据是持久化的,断电或重启,数据也不会丢失。
3.Redis的存储分为内存存储、磁盘存储和log文件。
4.Redis可以从磁盘重新将数据加载到内存中,也可以通过配置文件对其进行配置,因此,redis才能实现持久化。
5.Redis支持主从模式,可以配置集群,更利于支撑大型的项目。
Redis 服务形式安装Redis
1.Cmd---->切换到 Redis 目录下

2.安装Redis 服务
redis-server --service-install(安装) redis.windows-service.conf(redis配置文件) --service-name redis(名称)

3.启动Redis 服务

redis-server --service-start --service-name redis(名称)
4.关闭Redis 服务

redis-server --service-stop --service-name redis(名称)

5.卸载Redis 服务

redis-server --service-unstall --service-name reids 名称
Redis 数据类型
Redis一共支持五种数据类型:
String(字符串)、
hash(哈希)、
list(列表)、
set(集合
zset(sorted set有序集合)
String(字符串):Redis最基本的数据类型,一个键对应一个值,一个键值最大存储512MB
Hash(哈希):hash是一个键值对的集合,是一个String类型的field和value的映射表,适合用于存储对象
List(列表):是redis的简单的字符串列表,按插入顺序排序
Set(集合):是String字符串类型的无序集合,也不可重复
ZSet(sorted set 有序集合)是String类型的有序集合,也不可重复。有序集合中的每个元素都需要指定一个分数,根据分数对元素进行升序排序。
Redis 目录介绍
在这里插入图片描述

Redis 持久化
Redis持久有两种方式:快照(RDB),仅附加文件(AOF)
快照(RDB):
1、将存储在内存的数据以快照的方式写入二进制文件中,默认dump.rdb中
2、保存900 1 # 900秒内如果超过1个key被修改,则启动快照保存
3、保存300 10 # 300秒内如果超过10个key被修改,则启动快照保存
4、保存60 1000 # 60秒内如果超过10000个重点被修改,则启动快照保存

仅附加文件(AOF):
1、使用AOF持久时,服务会将每个收到的写命令通过写函数追加到文件中(appendonly.aof)
2、AOF持久化存储方式参数说明
appendonly yes #开启AOF持久化存储方式
appendfsync always #收到写命令后就立即写入磁盘,效率最差,效果最好
appendfsync everysec #每秒写入磁盘一次 效率与效果居中
appendfsync no #完全依赖操作系统,效率最佳,效果没法保证

.Net Core 操作Redis
第一步:通过 Nuget 包引入 StackExchange.Redis.Extensions.Core

第二步:连接Redis字符串的格式: IP地址:端口号,password=密码

注意:如果是Redis集群,字符串格式是:Redis1_IP地址:端口,Redis2_IP地址:端口,password-密码,如果没有密码可以省略掉密码

第三步:构建连接混合对象(相对于Redis集群来说)
ConnectionMultiplexer redis = ConnectionMultiplexer.Connect(“Redis1_IP地址:端口,password=密码”);

第四步:获取指定数据库(相对Redis集群来说)
connectionMultiplexer.GetDatabase(0);//这里获取第一个数据库(没有搭建Redis集群)

第五步:直接设置或者取值(获取字符串的值)
//设置name的值,取name得值
database.StringSet(“name”, “Hello,Word”);

        //取得name的值
        string getName=database.StringGet("name");

Redis相对MemoryCache和Mongodb三者对比(思考)

什么是Redis雪崩或者击穿?

1.Redis 雪崩
对于系统 A,假设每天高峰期每秒 5000 个请求,本来缓存在高峰期可以扛住每秒 4000 个请求,但是缓存机器意外发生了全盘宕机。缓存挂了,此时 1 秒 5000 个请求全部落数据库,数据库必然扛不住,它会报一下警,然后就挂了。此时,如果没有采用什么特别的方案来处理这个故障,DBA 很着急,重启数据库,但是数据库立马又被新的流量给打死了。
这就是缓存雪崩。

缓存雪崩的事前事中事后的解决方案如下。
事前:redis 高可用,主从+哨兵,redis cluster,避免全盘崩溃。
事中:本地 ehcache 缓存 + hystrix 限流&降级,避免 数据库被打死。
事后:redis 持久化,一旦重启,自动从磁盘上加载数据,快速恢复缓存数据。

2.缓存穿透
对于系统A,假设一秒 5000 个请求,结果其中 4000 个请求是黑客发出的恶意攻击。
黑客发出的那 4000 个攻击,缓存中查不到,每次你去数据库里查,也查不到。
举个栗子。数据库 id 是从 1 开始的,结果黑客发过来的请求 id 全部都是负数。这样的话,缓存中不会有,请求每次都“视缓存于无物”,直接查询数据库。这种恶意攻击场景的缓存穿透就会直接把数据库给打死。

  缓存穿透解决方案: 

解决方式很简单,每次系统 A 从数据库中只要没查到,就写一个空值到缓存里去,比如 set -999 UNKNOWN。然后设置一个过期时间,这样的话,下次有相同的 key 来访问的时候,在缓存失效之前,都可以直接从缓存中取数据。

3.缓存击穿
缓存击穿,就是说某个 key 非常热点,访问非常频繁,处于集中式高并发访问的情况,当这个 key 在失效的瞬间,大量的请求就击穿了缓存,直接请求数据库,就像是在一道屏障上凿开了一个洞。

缓存击穿解决方案:
1.可以将热点数据设置为永远不过期
2.基于 redis or zookeeper 实现互斥锁,等待第一个请求构建完缓存之后,再释放锁,进而其它请求才能通过该 key 访问数据


版权声明:本文为weixin_48002669原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。