Redis(Remote Dictionary Server)

本文链接: https://blog.csdn.net/Kesa_Wu/article/details/102643426

优缺点

|
|-优缺点|--优点|---纯内存操作,单线程操作,速度快,每秒可以处理超过 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

猜你喜欢

转载自blog.csdn.net/Kesa_Wu/article/details/102643426
今日推荐