20200216更新
一、redis是开源的,基于内存的键值数据存储,用作数据库(键值对数据库)、缓存、消息代理
性能:执行耗时久且结果不经常变动的sql,将结果放进缓存。
并发:redis缓存作为缓冲,支持高性能的主从复制的集群策略
分布式锁功能可用其他中间件替代(如zookeeper)
redis五种主要的数据类型:String、Hash、list、set、sortedSet有序集合
redis的架构模式:
(1)单机版:多个客户端对应一个redis服务器,特点是简单,但是内存容量有限,处理能力有限,无法高可用;
(2)主从复制:多个从redis服务器从一个主redis服务器拷贝数据,多个客户端从从redis服务器get数据(也可从主redis服务器get)
优点:用户从主redis服务器复制多个从redis服务器,两者数据相同,主服务器更新数据到从服务器,降低了主服务器的读压力,再转交从库
缺点:未解决主服务器的写压力
(3)哨兵
(4)集群(proxy型)
二、使用redis有什么缺点?
1、缓存与DB双写一致性问题
(1)有强一致性要求的数据,不能放缓存
(2)采取正确更新策略,先更新DB再删缓存,删缓存失败可提供补偿,用消息队列
2、缓存雪崩:即缓存在同一时间大面积失效,这时来了一拨请求,全怼到DB上导致DB连接异常
解决办法就是,给缓存的失效时间加一个随机值,避免集体失效
3、缓存穿透:即请求缓存中不存在的数据,导致所有请求到DB上,从而DB连接异常
三、单线程redis为什么这么快?
redis是单线程工作模型。快的原因是1 纯内存操作 2、单线程操作,避免经常的上下文切换 3、采用非阻塞I/O多路复用机制
四、redis的过期策略及内存淘汰机制
redis采用定期删除+惰性删除策略
阿里云redis开发规范解读
-------开始-----
1、key命名设计:可读性、可管理性、简洁性
规范建议使用冒号进行分割拼接,因为很多redis客户端是根据冒号分类的: apps:app:1、apps:app:2、apps:app:3
2、value设计:拒绝bigkey
规范建议String类型的value控制在10kb范围内,因为redis随着value不断增长,在超过10kb后,性能明显下降
3、控制key的生命周期:设定过期时间
尽可能对每个Key都设置过期时间
4、时间复杂度为O(n)的命令需要注意N的数量
以list为例,元素数量越多,命令的性能越差,而redis 是单线程的,若出现一个慢命令,会导致之后的命令耗时增长。这也是jdk1.8对hashmap进行链条冲突优化:当entry数量不少于64时,如果冲突链表长度达到8,会将其转化为红黑树,因为链表长度越长,性能越差。
5、禁用命令:KEYS、FLUSHDB、FLUSHALL等
这些命令在搭建redis环境的时候就应该禁用掉(在config配置文件中通过rename-command禁用)。
FLUSHDB、FLUSHALL这两个命令是会删库数据的
6、推荐使用批量操作提升操作效率
批量命令包括原生命令(mget、mset、hmget、hmset、LPUSH key value)、非原生命令(Pipeline)
7、monitor命令控制使用时间
monitor命令一般是用来观察redis服务端都在执行哪些命令并实时输出。规范建议控制monitor命令的使用时间,是因为随着monitor命令的执行时间越长,越多数据积压在输出缓冲区,从而导致输出缓冲区占用内存越来越大
-----结束-----
原文:https://www.cnblogs.com/blackdd/p/12089184.html