优缺点
|
|-优缺点|--优点|---纯内存操作,单线程操作,速度快,每秒可以处理超过 10 万次读写操作
| | |---支持多种数据结构
| |
| |--缺点:数据库容量受到物理内存的限制, 不能用作海量数据的高性能读写
| |
| | 因此 Redis 适合的场景主要局限在较小数据量的高性能操作和运算上
|
|-对比memcached|--(1) memcached 所有的值均是简单的字符串, Redis 作为其替代者, 支持更为丰富的数据类型
| |--(2)Redis 的速度比 memcached 快很多
| |--(3)Redis 可以持久化其数据
| |--(4)Redis单个value 的最大限制是 1GB,而memcached 只能保存 1MB 的数据
支持的数据类型
String, List, Set, Sorted Set, hash
|
|--String|---格式: set key value
| |---string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。
| |---string类型是Redis最基本的数据类型,一个键最大能存储512MB。
|
|--List|---Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
| |---格式: lpush name value // 在 key 对应 list 的头部添加字符串元素
| |---格式: rpush name value // 在 key 对应 list 的尾部添加字符串元素
| |---格式: lrem key count value// key 对应 list 中删除 count 个和 value 相同的元素
| |---格式: llen name // 返回 key 对应 list 的长度
|
|--Set(集合)|---格式: sadd name value
| |---Redis的Set是string类型的无序集合。
| |---集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
|
|--zset(sorted set:有序集合)|---格式: zadd name score value
| |---Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。
| |---不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序
| |---zset的成员是唯一的,但分数(score)却可以重复。
|
|--Hash(哈希)|---格式: hmset name key1 value1 key2 value2
| |---Redis hash 是一个键值(key=>value)对集合。
| |---Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。
缓存穿透(两层都被击穿就"透"了)
|--定义|---一般的缓存系统,都是按照key去缓存查询,如果不存在对应的value,就去后端系统查找(比如DB)
| |---一些恶意的请求会故意查询不存在的key,请求量很大,就会对后端系统造成很大的压力。这就叫做缓存穿透
|
|--如何避免|--- 查询结果为空的情况也进行缓存,这样,再次访问时,缓存层会直接返回空值。
| |--- 对一定不存在的key进行过滤。具体请看布隆过滤器
缓存击穿
|--定义|---是针对缓存中没有但数据库有的数据
| |---当Key失效后,假如瞬间突然涌入大量的请求,来请求同一个Key,这些请求不会命中Redis,都会请求到DB,导致数据库压力过大
|
|--解决办法|---设置热点Key,自动检测热点Key,将热点Key的过期时间加大或者设置为永不过期,或者设置为逻辑上永不过期
| |---加互斥锁。当发现没有命中Redis,去查数据库的时候,在执行更新缓存的操作上加锁,
| | 当一个线程访问时,其它线程等待,这个线程访问过后,缓存中的数据会被重建,这样其他线程就可以从缓存中取值
缓存雪崩
|--定义:是指大量Key同时失效,对这些Key的请求又会打到DB上,同样会导致数据库压力过大甚至挂掉
|
|--解决办法|---1)让Key的失效时间分散开,可以在统一的失效时间上再加一个随机值,或者使用更高级的算法分散失效时间。
| |---2)构建多个redis实例,个别节点挂了还有别的可以用
| |---3)多级缓存:比如增加本地缓存,减小redis压力
| |---4)对存储层增加限流措施,当请求超出限制,提供降级服务(一般就是返回错误即可)
redis持久化
|
|-持久化方式|--快照持久化 : rdb
| |--AOF 持久化 : aof
|
|-默认是开启了rdb,aof是关闭的。若开启了aof,一般aof更新频率高,所以优先aof还原数据库。只有aof关闭时,才会使用rdb还原数据库。
|
|-redis关闭持久化(当redis只用来做查询缓存时,应关闭持久化)|--配置文件: redis.conf
| |
| |--1.注释掉原来的持久化规则|-- #save 900 1
| | |-- #save 300 10
| | |-- #save 60 10000
| |
| |--2.设置为空(添加一行): save ""
| |
| |--3.重启redis服务
|
|-aof开停相关配置|--appendonly no
| |--appendfsync always
| |--appendfsync everysec