什么是Redis
Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库。它通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止Redis支持的键值数据类型如下:
1、 字符串类型
2、 散列类型 hash被(string和json)取代了
3、 列表类型
4、 集合类型
5、 有序集合类型。
概述
在Redis中,我们可以将Set类型看作为没有排序的字符集合,和List类型一样,我们也可以在该类型的数据值上执行添加、删除或判断某一元素是否存在等操作。需要说明的是,这些操作的时间复杂度为O(1),即常量时间内完成次操作。Set可包含的最大元素数量是4294967295。
和List类型不同的是,Set集合中不允许出现重复的元素,这一点和C++标准库中的set容器是完全相同的。换句话说,如果多次添加相同元素,Set中将仅保留该元素的一份拷贝。和List类型相比,Set类型在功能上还存在着一个非常重要的特性,即在服务器端完成多个Sets之间的聚合计算操作,如unions(并集)、intersections(交集)和differences(差集)。由于这些操作均在服务端完成,因此效率极高,而且也节省了大量的网络IO开销。
redis的应用场景
缓存(数据查询、短连接、新闻内容、商品内容等等)。(最多使用,变化不大)
聊天室的在线好友列表。
任务队列。(秒杀、抢购、12306等等)
应用排行榜。
网站访问统计。
数据过期处理(可以精确到毫秒)
分布式集群架构中的session分离。【第二个大型电商项目中使用】
Redis中server命令
Flushall 命令用于清空整个 Redis 服务器的数据(删除所有数据库的所有 key )
Redis Flushdb 命令用于清空当前数据库中的所有 key。
SHUTDOWN 命令是关闭redis服务
数据类型的使用方法 (String、list、hash、set、zset)
常用命令
l hset key field value:为指定的key设定field/value对(键值对)
l hmset key field value [field2 value2 …]:设置key中的多个filed/value
l hget key field:返回指定的key中的field的值
l hmget key fileds:获取key中的多个filed的值
l hgetall key:获取key中的所有filed-vaule
l hdel key field [field … ] :可以删除一个或多个字段,返回值是被删除的字段个数
l lpush key values[value1 value2…]:在指定的key所关联的list的头部插入所有的values,如果该key不存在,该命令在插入的之前创建一个与该key关联的空链表,之后再向该链表的头部插入数据。插入成功,返回元素的个数。
l lrange key start end:获取链表中从start到end的元素的值,start、end从0开始计数;也可为负数,若为-1则表示链表尾部的元素,-2则表示倒数第二个,依次类推…
l lpop key:返回并弹出指定的key关联的链表中的第一个元素,即头部元素。如果该key不存在,返回nil;若key存在,则返回链表的头部元素。
l rpop key:从尾部弹出元素。
l rpushx key value:在该list的尾部添加元素
l lset key index value:设置链表中的index的脚标的元素值value(执行的是替换该位置的数据),0代表链表的头元素,-1代表链表的尾元素。操作链表的脚标不存在则抛异常。
l rpoplpush resource destination:将链表中的尾部元素弹出并添加到头部。
Redis 持久化(RDB,AOF)
1.为什么要持久化:
Redis是内存数据库。他将自己的数据库存储状态存储在内存中,如果不想方法把数据库状态保存到磁盘中,一旦服务进程退出,服务器中的数据库状态也将消失不见。
2.解决方法:redis提供了RDB持久化功能,这个功能将redis内存中的数据库状态保存到磁盘中,避免数据意外丢失。
3.RDB持久化:
RDB持久化功能产生一个RDB文件(经过压缩的二进制文件)可还原成数据库状态。
保存在硬盘里,存在即可还原。
3.3保存条件
[redis]$ more /usr/local/redis/conf/redis.conf
save 900 1 #服务器900秒内,对数据库至少修改一次
save 300 10 #服务器300秒内,对数据库至少10次修改
save 60 10000 #服务器60秒内,对数据库至少10000次修改
dbfilename “dump.rdb” #持久化文件名称
dir "/data/dbs/redis/ #持久化数据文件存放的路径
满足任意三个条件之一,bgsave就会执行。
Value:1.字符串对象,2.列表对象3.集合对象,4.哈希表对象5.有序集合对象
扩展:1.不包含任何键值对的RDB文件
2包含字符串键的RDB文件
3包含过期时间的字符串键的RDB文件
4包含集合键的RDB文件
4.简单介绍AOF持久化和AOF文件与RDB持久化的区别.:
因为AOF文件的更新频率比RDB文件的更新频率高,所以:
如果服务器开启了AOF持久化功能,那么服务器会优先使用AOF文件来还原数据库状态。
只有在AOF持久化功能处于关闭状态的时候,服务器才会使用RDB文件来还原数据库状态。
.AOF
默认情况下,AOF是处于关闭状态的
只要当前指令会修改Redis中的数据,那么Redis就会将这条命令存储到硬盘中,比较消耗资源,当然我们也可以通过固态硬盘等硬件来提升性能
Redis会遇到的问题以及解决方案
1.缓存雪崩
发生场景 :当Redis服务器重启或者大量缓存在同一时期失效时,此时大量的流量会全部冲击到数据库上面,数据库有可能会因为承受不住而宕机
解决方案 :
均匀分布 : 我们应该在设置失效时间时应该尽量均匀的分布,比如失效时间是当前时间加上一个时间段的随机值
熔断机制 : 类似于SpringCloud的熔断器,我们可以设定阈值或监控服务,如果达到熔断阈值(QPS,服务无法响应,服务超时)时,则直接返回,不再调用目标服务,并且还需要一个检测机制,如果目标服务已经可以正常使用,则重置阈值,恢复使用
隔离机制 : 类似于Docker一样,当一个服务器上某一个tomcat出了问题后不会影响到其它的tomcat,这里我们可以使用线程池来达到隔离的目的,当线程池执行拒绝策略后则直接返回,不再向线程池中增加任务
限流机制 : 其实限流就是熔断机制的一个版本,设置阈值(QPS),达到阈值之后直接返回
双缓存机制 : 将数据存储到缓存中时存储俩份,一份的有效期是正常的,一份的有效期长一点.不建议用这个方案,因为比较消耗内存资源,毕竟Redis是直接存储到内存中的
2.缓冲穿透
发生场景 : 此时要查询的数据不存在,缓存无法命中所以需要查询完数据库,但是数据是不存在的,此时数据库肯定会返回空,也就无法将该数据写入到缓存中,那么每次对该数据的查询都会去查询一次数据库
解决方案 :
布隆过滤 : 我们可以预先将数据库里面所有的key全部存到一个大的map里面,然后在过滤器中过滤掉那些不存在的key.但是需要考虑数据库的key是会更新的,此时需要考虑数据库 --> map的更新频率问题
缓存空值 : 哪怕这条数据不存在但是我们任然将其存储到缓存中去,设置一个较短的过期时间即可,并且可以做日志记录,寻找问题原因
本文详细介绍了Redis这一高性能键值数据库,涵盖其数据类型、应用场景、命令使用、持久化机制及常见问题解决方案,如缓存雪崩和缓冲穿透。
173万+

被折叠的 条评论
为什么被折叠?



