缓存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:一般不只使用滑动过期时间,这样可能导致缓存永远不过期