非关系型数据库
非关系型数据库一般是指NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,作为关系数据库的一个重要补充 。
Redis作用、适用场景
![](https://i-blog.csdnimg.cn/blog_migrate/b1ee832d9fbfb7a0e339407aaee12dd9.png)
Redis常用命令
一、redis启动
◆
本地启动:redis-cli
◆
远程启动:redis-cli -h host -p port -a password
二、清空Redis所有key
◆
flushdb # 清除当前数据库的所有keys
◆
flushall # 清除所有数据库的所有keys
三、查询匹配key
◆
keys * # 查看所有keys
◆
keys prefix_* # 查看前缀为"prefix_"的所有keys
四、key基本操作
◆
exists key # 确认一个key是否存在
◆
set key value # 设置key和value
◆
get key # 获取key的value
◆
del key # 删除一个key
◆
type key # 返回值的类型
◆
rename oldname newname # 重命名key
◆
dbsize # 返回当前数据库中key的数目
五、String字符串
◆
set key value # 设置指定 key 的值
◆
get key #获取指定 key 的值
◆
strlen key # 返回 key 所储存的字符串值的长度
◆
mset key value [key value ...] # 同时设置一个或多个 key-value 对
◆
mget key1 [key2..] # 获取所有(一个或多个)给定 key 的值
六、List列表
◆
rpush key value # 在名称为key的list尾添加一个值为value的元素
◆
lpush key value # 在名称为key的list头添加一个值为value的 元素
◆
lpop key # 返回并删除名称为key的list中的首元素
◆
rpop key # 返回并删除名称为key的list中的尾元素
◆
llen key # 返回名称为key的list的长度
◆
lindex key index # 通过索引获取列表中的元素
◆
lrange key start stop # 获取列表指定范围内的元素
七、Set无序集合
◆
sadd key member1 [member2] # 向集合添加一个或多个成员
◆
smembers key # 返回集合中的所有成员
◆
scard key #获取集合的成员数
◆
sinter key1 key2 # 求交集
◆
sunion key1 key2 # 求并集
◆
sdiff key1 key2 # 求差集
八、Zset有序集合
◆
zadd key score1 member1 [score2 member2] # 向有序集合添加一个或多个成员,或者更新已存在成员的分数
◆
zcard key # 获取有序集合的成员数
◆
zrange key start stop # 通过索引区间返回有序集合成指定区间内的成员
◆
zscore key member # 查询成员的分数值
◆
zrangebyscore key min max # 通过分数返回有序集合指定区间内的成员
九、Hash哈希
◆
hset key field value #将哈希表 key 中的字段 field 的值设为 value
◆
hget key field #获取给定字段的值
◆
hmset key field1 value1 [field2 values] # 一次赋值多个字段
◆
hmget key field1 [field2] # 一次取多个字段的值
◆
hexists key field # 判断字段是否存在
◆
hkeys key # 获取所有字段名
◆
hvals key # 获取所有字段值
◆
hlen key # 获取字段数量
◆
hgetall key # 获取所有字段的值
◆
hdel key field # 删除字段
十、设置key的生存时间
◆
expire key seconds #设置key的有效时间 单位为秒
◆
ttl key #获取key的剩余有效时间,持久key返回-1,key不存在返回-2,具体时间返回秒数
Redis 数据备份与恢复
Redis SAVE 命令用于创建当前数据库的备份。
1、数据备份
redis Save 命令基本语法如下:redis 127.0.0.1:6379> SAVE
该命令将在 redis 安装目录中创建dump.rdb文件。
2、恢复数据
如果需要恢复数据,只需将备份文件 (dump.rdb) 移动到 redis 安装目录并启动服务即可。
获取 redis 目录可以使用 CONFIG GET dir
非关系型数据库的优点:
- 分布式计算,无需经过SQL层的解析,读写性能高;
- 高可扩展性,基于键值对,数据没有耦合性,容易扩展;
- 存储数据的格式丰富多样:包括key-value形式、文档形式、图片形式等,而关系型数据库则只支持基础类型。
非关系型数据库的缺点:
- 没有标准化,不提供SQL支持,学习和使用成本较高;
- 查询功能有限;
测试Redis时关注要点
◆
缓存有效,验证相关业务功能?
◆
缓存被删除,验证相关业务功能?
◆
缓存过期失效,验证相关业务功能?
◆
缓存达到上限怎么处理?
◆
redis缓存服务停掉?
◆
缓存超时,验证相关业务功能?
✓
缓存穿透?(面试常问)
✓
缓存雪崩? (面试常问)
- 缓存穿透:key对应的数据在数据源并不存在,每次针对此key的请求从缓存获取不到,请求都会到数据源,从而可能压垮数据源。比如用一个不存在的用户id获取用户信息,不论缓存还是数据库都没有,若黑客利用此漏洞进行攻击可能压垮数据库。
- 缓存击穿:key对应的数据存在,但在redis中过期,此时若有大量并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。
- 缓存雪崩:当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,也会给后端系统(比如DB)带来很大压力。
- Redis为什么会这么快?
1、Redis是纯内存操作,需要的时候可以以手动或自动化的方式将数据持久化到硬盘中
2、Redis是单线程,从而避开了多线程中上下文频繁切换而浪费CPU时间片的操作。
3、Redis中存储数据的数据类型大量使用高效率的数据结构算法,对数据的操作更加快捷高效
4、使用底层协议不同,比如Redis自创RESP通讯协议,即保证了运行效率又保证了数据通讯
5、使用多路I/O复用模型,非阻塞I/O - python获取redis key过期的信息 python获取redis key过期的信息 - WU大雄 - 博客园
常用的五种类型:string(字符串),hash(哈希),list(列表),set(集合),zset(有序集合)
1.String类型
String是最简单的类型,一个key对应一个value
String类型的数据最大512MB。
String类型的值可以被视作integer,从而可以让“INCR”命令族操作(incrby、decr、decrby),这种情况下,该integer的值限制在64位有符号数。
在list、set和zset中包含的独立的元素类型都是Redis String类型。
2.List类型
链表类型,主要功能是push、pop、获取一个范围的所有值等。其中的key可以理解为链表的名字。
在Redis中,list就是Redis String的列表,按照插入顺序排序。比如使用LPUSH命令在list头插入一个元素,使用RPUSH命令在list的尾插入一个元素。当这两个命令之一作用于一个空的key时,一个新的list就创建出来了。
一个List的最大长度是2^32-1个元素 (4294967295, 每个列表超过40亿个元素)。
3.Set类型
集合,和数学中的集合概念相似。操作中的key理解为集合的名字。
在Redis中,set就是Redis String的无序集合,不允许有重复元素。
Set的最大元素数是2^32-1。
Redis中对set的操作还有交集、并集、差集等。
4.ZSet类型
Zset是set的一个升级版本,在set的基础上增加了一个顺序属性,这一属性在添加修改元素时可以指定,每次指定后zset会自动安装指定值重新调整顺序。可以理解为一张表,一列存value,一列存顺序。操作中的key理解为zset的名字。
Zset的最大元素数是2^32-1。
对于已经有序的zset,仍然可以使用SORT命令,通过指定ASC|DESC参数对其进行排序。
5.hash类型
hash是最接近关系数据库结构的数据类型,可以将数据库一条记录或程序中一个对象转换成hashmap存放在redis中。