1.什么是Redis
Redis是一个基于内存的高性能key-value数据库。
2.Redis的特点
1.性能出色:它的数据操作是在内存中进行,通过定期将一部分数据保存到硬盘上,每秒可以处理超过10万次的读写操作。
2.支持多种数据结构:string、list、hash、set、zset,单个value的最大限制是1G(memcached是1M)。
3.缺点:数据容量受到内存的限制,不能做海量数据的高性能读写。
3.redis相比memcached有哪些优势
1.数据结构类型redis比memecached多,memecached只支持String;
2.redis支持持久化,memcached不支持;
3.Redis使用单线程的IO复用模型;Memcached是多线程,非阻塞IO复用的网络模型。
4.redis持久化的两种方式
1.RDB
RDB持久化是指在指定的时间内将内存的数据快照写入磁盘,具体执行过程是fork一个子进程,先将数据写做临时文件, 写入成功后再替换之前的文件,用二进制压缩存储。策略有:save 900 1、save 300 10、save 60 10000。
2.AOF
AOF是以日志的形式记录服务器所处理的每一条写、删命令(不记录读)。同步策略:每修改同步、每秒同步、不同步。(redis的默认持久化方式)
3.比较
1、aof文件比rdb更新频率高,优先使用aof还原数据;
2、aof比rdb更安全也更大;
3、rdb性能比aof好;
4、如果两个都配了优先加载AOF。
5.redis常见性能问题和解决方案
1.Master写内存快照:save命令会调用rdbSave函数,它会阻塞主线程工作。因此Master最好不要读写内存快照。
2.Master AOF持久化:虽然该方式的持久化对性能影响最小,但是AOF后面会越来走越大,而AOF文件过大会影响Master重启的恢复速度。
因此Master最好不要做持久化工作,某个salave开启AOF数据备份就好。
3.Redis的主从复制性能问题,为了主从复制的速度和连接的稳定性,salave最好和master在同一局域网内。
6.redis的分布式锁
先拿setnx来争抢锁,抢到之后,再用expire给锁加一个过期时间防止锁忘记了释放。如果中间发生意外,应该同时把setnx和expire合成一条指令来用。
7.如何保证redis的数据都是热点数据
redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。redis 提供 6种数据淘汰策略:
voltile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰;
volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰;
从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰;
allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰;
allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰;
no-enviction(驱逐):禁止驱逐数据。
8.缓存穿透以及解决方式
缓存穿透:一般的缓存系统,都是按照key去缓存查询,如果不存在对应的value,就应该去后端系统查找(比如DB)。一些恶意的请求会故意查询不存在的key,
请求量很大,就会对后端系统造成很大的压力。
解决办法:1:对查询结果为空的情况也进行缓存,缓存时间设置短一点,或者该key对应的数据insert了之后清理缓存。
2:对一定不存在的key进行过滤。可以把所有的可能存在的key放到一个大的Bitmap中,查询时通过该bitmap过滤。
9.缓存雪崩以及解决方法
缓存雪崩:当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,会给后端系统带来很大压力,导致系统崩溃。
解决办法:
1:在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。
2:做二级缓存,A1为原始缓存,A2为拷贝缓存A1失效时,可以访问A2,A1缓存失效时间设置为短期,A2设置为长期;
3:不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。
10.redis的架构模式
只要分:单机版、主从复制、哨兵模式、集群模式。
主从复制:Redis 的复制(replication)功能允许用户根据一个 Redis 服务器来创建任意多个该服务器的复制品,其中被复制的服务器为主服务器(master),
而通过复制创建出来的服务器复制品则为从服务器(slave)。 只要主从服务器之间的网络连接正常,主从服务器两者会具有相同的数据,主服务器就会一直将发生
在自己身上的数据更新同步给从服务器,从而一直保证主从服务器的数据相同。
哨兵模式:Redis sentinel 是一个分布式系统中监控 redis 主从服务器,并在主服务器下线时自动进行故障转移。其中三个特性:
监控(Monitoring):Sentinel会不断地检查你的主服务器和从服务器是否运作正常。
提醒(Notification):当被监控的某个Redis服务器出现问题时,Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
自动故障迁移(Automatic failover):当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作。
参考文章
11.redis的异步队列
一般使用list结构作为队列,rpush生产消息,lpop消费消息。当lpop没有消息的时候,要适当sleep一会再重试。
缺点:在消费者下线的情况下,生产的消息会丢失,得使用专业的消息队列如rabbitmq等。
能不能生产一次消费多次呢?使用pub/sub主题订阅者模式,可以实现1:N的消息队列。
12.redis常见操作命令
key:EXISTS、DEL、EXPIRE、TTL、KEYS;
String:SET、GET、SETNX、MSET、MGET;
List:LPOP、LPUSH、LRANGE;
Hash:HSET、HGET、HGETALL、HEXISTS、HDEL;
Set:SADD、SMEMBERS、SISMEMBER、SDIFF;
SortedSet:ZADD、ZRANGE、ZSCORE。
13.redis做内存优化
- 缩短键值的长度
缩短值的长度才是关键,如果值是一个大的业务对象,可以将对象序列化成二进制数组,去掉不必要的属性,避免存储一些没用的数据;
2.字符串优化
3.控制key的数量 参考文章