redis简单介绍随笔
,1.redis是一个内存型的,nosql的数据库,是key-value形式的。value有本地方法。redis是一个单work线程的,是串行化执行的。
缓存一致性:使用分布式事务。???。
2,5种常用的数据类型:
redis的key,value都是一个redisObject对象,redisObject对象主要结构如下:
String:底层使用可变字符串和直接存储,编码是raw,int。是一个二进制安全的,可以存储图片或者序列化的对象等。
常用命令:get、set、incr、decr、mget, append, strlen等
list:底层使用linkList或者zipList
常用命令:lpush(添加左边元素),rpush,lpop(移除左边第一个元素),rpop,lrange(获取列表片段,LRANGE key start stop)等
hash:底层使用ziplist和hashtable
常用命令:hget,hset,hgetall
set:集合对象的编码可以是intset和hashtable之一
常用命令:sadd,spop,smembers,sunion 等。
orderSet:使用skipList或者ziplist实现,
常用命令:zadd,zrange,zrem,zcard等
3.redis 内存占用过高,有几种淘汰策略?
noeviction: 永不回收策略,当内存限制达到并且达到客户端尝试执行会让内存更多被使用的命令时,会返回错误。
allkeys-lru: 会尝试回收所有键中,最少使用的键。
volatile-lru: 在设置过期时间的键中,会尝试回收最少使用的键
allkeys-random: 在所有的键中,随机的回收。
volatile-random: 在设置过期的键中,随机的回收
volatile-ttl: 回收即将过期的键
4.redis的持久化方式?
aof:
每次缓存的写操作都会被记录下来,保存到日志文件
redis默认使用的是everysec就是每秒持久化一次,always则是每次操作都会立即写入aof文件,而no则是不主动进行同步操作,是默认30秒一次。
rdb(默认): 每隔一段时间或者变化了几个值做快照
方法: bgSava:调用fork,产生子进程,父进程继续处理请求。子进程将数据写入临时文件,并在写完后,替换原有的rdb文件。fork发生时,父子进程内存共享,所哟为了不影响子进程做数据快照,在这期间修改的数据,将会被复制一份,而不进共享内存。所以,rdb所持久化的数据时fork发生时的数据。如果因为默写情况宕机,则会丢失一段时间的数据。
save:
save 900 1
save 300 10
save 60 10000
rdb配置文件的默认策略,他们之间的关系是:每个900秒,在这期间变化了至少一个键值,做快照。或者每300秒,变化十个键值做快照。或者每60秒变化了10000个键值做快照。
5.aof文件过大,宕机之后,加载会很慢,怎么处理?
①.手动触发 bgrewriteaof 。此命令是优化文件。
②.配置自动触发
在redis.conf中配置
auto-aof-rewrite-percentage 100 #代表当前Aof文件空间和上次重写后aof空间的比值
auto-aof-rewrite-min-size 10mb #Aof 超过10m就开始收缩
6.redis为什么速度那么快?
数据存于内存中;单线程;用了多路复用I/O。
7.数据库里有2000w条数据,redis只有20w数据,如何保证redis里面都热点数据?
reids的内存容量上升到一定大小的时候,就会实施数据淘汰策略。从而保证数据都是热点数据。
秒杀系统是一个倒金字塔型的,从前到后流量一层层过滤,到db层只需要执行真正需要的流量就可以。