缓存Redis

1.简介

  Redis一般是将一些高频使用的数据放到内存中,提供快速读取数据的技术

  Redis是一个nosql(非关系型数据库),使用 key-value(键值对),

    value支持类型有 string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合),且每种类型都有自己的本地方法。

  Redis是单线程还是多线程:对于用户来说,使用的所有指令和操作都是单线程的,也就是 worker 是单线程的

                6.x版本的Redis支持 io threads,也就是IO操作是多线程的,但是从io操作读出来的数据也是进行单线程处理的

2.Redis 和 Memcache 的区别

  数据持久化:Redis支持;Memcache也支持,但重启会丢失数据,一般不做持久化

  value类型:Redis支持5种;Memcache只支持 string

  存储量:Redis比较大;Memcache存储量比较小,不能超过1M

  特征:Redis不是所有数据都存储在内存,在很多方面具备数据库的特征;Memcache只是简单的key-value缓存,像Redis的一个子功能

3.docker 安装Redis

docker pull redis:6.0.6

docker run -d --name myredis -p 6379:6379 redis:6.0.6 --requirepass "123456" --requirepass 设置密码

  查看一下进程

ps -ef|grep redis

 4.net core

  RedisHelper

  安装nuget包:CSRedisCore

using System.Threading.Tasks;
using CSRedis;
namespace StudyRedis
{
    public class RedisHelper
    {
        private CSRedisClient _client;
        public RedisHelper()
        {
            //创建链接
            _client = new CSRedisClient("106.52.228.213:6379,password=123456,defaultDatabase=1,poolsize=50,ssl=false,writeBuffer=10240");
        }

        public void Set(string key, string value)
        {
            _client.SetAsync(key, value);
        }

        public async Task<string> Get(string key)
        {
            return await _client.GetAsync(key);
        }
    }
}

 5.持久化

  Redis持久化是将内存的数据写入硬盘,在重启后会从硬盘读回内存,避免关机后缓存丢失

  有两种持久化方式

  1)RDB:全量备份数据,以快照的形式保存在磁盘上,通俗点说就是,在指定的时间间隔内将内存中的数据全部写入磁盘,新的rdb文件会覆盖旧的

  优点:恢复数据集的速度比AOF快

  缺点:快照存储期间,如果有数据进来,会保存不到;突然宕机会丢失数据。

  2)AOF:以秒为周期记录每条修改到Redis的命令,只进行追加记录,不覆盖现有文件

  优点:实时性好,不容易造成数据丢失;稳健性强,比如不小心执行了 【flushall】命令 删除了整个Redis的数据,可以通过AOF去掉最后的【flushall】命令来恢复以前数据

  缺点:命令日志大,恢复数据用时多;监听频繁,内存消耗大

 6.Redis有什么模式

  1)主从

  2)哨兵

  3)集群 (使用最多)

7.避免缓存问题

  1)缓存穿透:恶意软件故意大量请求Redis不存在的key,程序会查数据库,数据不存在不会进行缓存,进而大量访问数据库造成系统压力

  解决方法:1、读库时不存在数据,给这个key缓存个【null】值,下次访问Redis会直接返回null,但是记得在系统真正insert该数据的时候,要更新Redis

       2、做key规则判断,当访问该api的key不应是Redis缓存该有的规则,不予通过

       2、使用过滤器进行定时筛选,对数据库和Redis都不存在数据的恶意请求加以过滤,如:布隆过滤器

  2)缓存雪崩:同一时间大量缓存过期,造成系统压力

  解决方法:1、不同key类型设置不同失效时间,让缓存均匀过期

       2、使用队列,排队访问数据库

       3、使用固定过期时间+滑动过期时间:

          滑动过期时间:过期之前获取过该缓存,重置滑动过期时间(续命)

             固定过期时间和滑动过期时间同时用:固定时间长,滑动短,使用较少的接口会较早过期

          PS:一般不只使用滑动过期时间,这样可能导致缓存永远不过期

 

posted @ 2020-08-12 10:59  wskxy  阅读(23)  评论(0编辑  收藏  举报