Redis(非关系型数据库)
1.什么是redis?
1.1. Redis是一个开源的(被BSD许可),由C语言编写而成的,支持网络交互的,在内存中以Key-Value形式存储的数据结构存储系统;
1.2. Redis一般被用于数据库,缓存或是消息中间件;
1.3. Redis的作者是目前在Pivotal公司的意大利人Salvatore Sanfilippo,目前是被Vmware赞助开发。
2.Redis的数据类型
2.1 string(字符串)
2.1.1. string是Redis最基本的类型,其表现形式为一个key对应一个value;
2.1.2. string类型是二进制安全的(意思是可以包含任何数据类型;比如jpg图片或者序列化的对象等等);
2.1.3. string类型值的存储空间很大,最大能存储512MB。
实例:
redis 127.0.0.1:6379> SET name"jim"
OK
redis 127.0.0.1:6379> GET name
"jim"
2.2 Hash(哈希)
2.2.1. Redis hash 是一个键值对的集合;
2.2.2. Redis hash特别适合存储对象;
2.2.3. Redis hash存储的是字符串与字符串之间的映射,例如一个用户要存储其相关信息姓名,年龄等,就比较适合使用哈希。
实例:
redis 127.0.0.1:6379>HMSET user name “jim” age 20
“ok”
redis 127.0.0.1:6379>HGET user name
“jim”
redis 127.0.0.1:6379>HGET user age
20
HMSET可以设置多个属性比如name和age,HGET可以获取对应属性的值;每个hash可以存储二的三十二次方减一 键值对(约40多亿)。
2.3 List(列表)
2.3.1. Redis List是简单的字符串列表,按照插入的顺序排序。也可以将元素添加到列表的头部(lpush)或尾部(rpush)。
实例:
//创建列表
redis 127.0.0.1:6379>DEL name
//向列表头部添加元素
redis 127.0.0.1:6379>lpush name redis
redis 127.0.0.1:6379>lpush name model
redis 127.0.0.1:6379>lpush name reade
//查询列表中索引0至5的元素
redis 127.0.0.1:6379>lrange name 0 5
1) "reade"
2) "model"
3) "redis"
2.3.2. 列表最多可以存储二的三十二次方减一 键值对(约40多亿)。
2.4 Set(集合)
2.4.1. Redis Set是 string类型的无序集合;
2.4.2. 这里的集合是通过哈希表实现的,因此添加,删除,查找的复杂度都为O(1).
2.4.3. 添加一个 string 元素到 key 对应的 set 集合中,成功返回 1,如果元素已经在集合中返回 0,且第二次插入的元素将被忽略。
实例:
redis 127.0.0.1:6379>DEL name
redis 127.0.0.1:6379>sadd name redis
1
redis 127.0.0.1:6379>sadd name model
1
redis 127.0.0.1:6379>sadd name radal
1
redis 127.0.0.1:6379>sadd name redis
0
redis 127.0.0.1:6379>smembers name
1) "redis" 2) “radal” 3) “model”
2.4.4. zset(有序集合)
redis zset 和 set 一样也是 string 类型元素的集合,且不允许重复的成员;
3. 设置键的失效时间
在使用缓存,验证码等数据时,我们并不希望redis的key一直存在,因此我们可以给key设置过期时间,并且让key在过期后自动被删除。
设置方法有两种:
1.在设置值时直接设置有效时间:
//给key(name)设置失效时间30秒 EX(秒) PX(毫秒)
set name jack EX 30
//查看剩余有效时间(秒)
ttl name
//查看剩余有效时间(毫秒)
pttl name
2.在设置值后设置有效时间:
//给key(name)设置失效时间30秒
expire name 30
//给key(name)设置失效时间30毫秒
pexpire name 30
4.主从复制
4.1.1 主从复制,是指将一台 Redis 服务器的数据,复制到其他的 Redis 服务器。前者称为主节点(master),后者称为从节点(slave),数据的复制是单向的,只能由主节点到从节点。
4.1.2 由主机将数据复制到从机,数据是一致的。
4.1.3 主机主要负责写,从机负责读
4.2 主从复制的的作用:
4.2.1.数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
4.2.2.故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。
4.2.3.负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写 Redis 数据时应用连接主节点,读 Redis 数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高 Redis 服务器的并发量。
4.2.4.高可用(集群)基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是 Redis 高可用的基础。
5.哨兵机制
哨兵是一个独立的进程,可以独立进行运行;
哨兵机制则是通过哨兵发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。
一旦主机宕机,哨兵就会重新选举一台从机作为主机;担当主机重新启动后,哨兵又会将主机的位置归还给原来的主机。
6.缓存的穿透,击穿与雪崩
6.1缓存的处理流程:
前台请求,后台先从缓存中取数据,取到直接返回结果,取不到时将从数据库中取,数据库取到后更新缓存,并返回结果,数据库也没取到,那直接返回空结果。
6.2缓存穿透
当用户不断访问数据库中没有且缓存中也没有的数据时就很有可能压垮数据库。
6.3缓存击穿
当某个数据在redis的某一时间节点上过期时,恰好有大量的请求访问该数据,致使这些大量的请求直接面向后端数据库,压垮数据库。
6.4缓存雪崩
在高并发情况下,大量的缓存失效或出现故障时,导致所有请求都到达后端数据库,从而压垮数据库。
6.5对于“Redis 宕机,请求全部走数据库”这种情况,我们可以有以下的思路:
事发前:实现 Redis 的高可用(主从架构+Sentinel(哨兵),尽量避免 Redis挂掉这种情况发生。
事发中:万一 Redis 真的挂了,我们可以设置本地缓存(ehcache)+限流,尽量避免我们的数据库被干掉(起码能保证我们的服务还是能正常工作的)。
事发后:redis 持久化,重启后自动从磁盘上加载数据,快速恢复缓存数据。
7.布隆过滤器
Redis存储数据时使用到了布隆过滤器;
7.1 是一个很长的二进制向量和一系列的映射函数;
可以检索一个元素是否存在在一个集合中;
7.2 通过哈希表存储数据,(通过hash函数将元素映射在一个位阵列中,通过判断这个点是不是1就可以知道集合中有没有这个元素)
7.3 算法:
7.3.1.首先需要k个hash函数,每个函数都可以吧key散列成为1个整数;
7.3.2.初始化时,需要一个长度为n比特的数组,每个比特位初始化为0;
7.3.3.某个key加入集合时,用k个函数计算出k个散列值,并把数组中对应的比特位置设为1;
7.3.4.判断某个key是否存在集合时,用k个hash函数计算出k个算劣质,并查询数组中对应的比特位,如果所有的比特位都是1,就认为在集合中。
如果这些点有任何一个 0,则被查询变量一定不在;
如果都是 1,则被查询变量可能存在(存在哈希冲突)
7.4 优点:
空间效率和查询效率都比一般算法要好;
缺点:
有一定的误识率和删除困难;
8.删除机制
Redis中的Key到期后的删除机制:
有三种策略:
1.定时删除:时间到了就会删除
2.惰性删除:过期后,下次获取时再删除
3.定期删除:每隔指定时间,删除过期的键
,则被查询变量可能存在(存在哈希冲突)
7.4 优点:
空间效率和查询效率都比一般算法要好;
缺点:
有一定的误识率和删除困难;
8.删除机制
Redis中的Key到期后的删除机制:
有三种策略:
1.定时删除:时间到了就会删除
2.惰性删除:过期后,下次获取时再删除
3.定期删除:每隔指定时间,删除过期的键