发布时间:2024-01-24阅读(3)
Redis 是一个速度非常快的非关系型数据库(non-relational database)/ NoSQL 数据库。
Redis 不使用表,也不会预定义或者强制去要求用户对 Redis 存储不同的数据进行关联。
Redis 为什么速度非常快?
Redis 存储键(key)和 5 种不同类型的值(value)之间的映射。这 5 中类型分别为:
STRING(字符串)、LIST(列表)、HASH(散列)、SET(集合)和 ZSET(有序集合)。
1. STRING(字符串)
字符串示例,键为 hello,值为 world:
①. 字符串命令:
②. 使用
127.0.0.1:6379> set hello worldOK127.0.0.1:6379> get hello"world"127.0.0.1:6379> del hello(integer) 1127.0.0.1:6379> get hello(nil)
127.0.0.1:6379> set num 1OK127.0.0.1:6379> incr num(integer) 2127.0.0.1:6379> get num"2"
2. LIST(列表)
list-key 是一个包含 3 个元素的列表键,列表中的元素是可以重复的:
①. 列表命令
②. 使用
127.0.0.1:6379> rpush list-key item(integer) 1127.0.0.1:6379> rpush list-key item2(integer) 2127.0.0.1:6379> rpush list-key item(integer) 3 # 返回的列表长度
127.0.0.1:6379> lrange list-key 0 -11) "item"2) "item2"3) "item"# 使用 0 为范围的开始索引,-1 为范围索引的结束索引,可以去除列表包含的所有元素127.0.0.1:6379> lindex list-key 1"item2"
127.0.0.1:6379> lpop list-key"item"127.0.0.1:6379> lrange list-key 0 -11) "item2"2) "item"
3. HASH(散列)
hash-key 是一个包含两个键值对的散列键:
①. 散列命令
②. 使用
127.0.0.1:6379> hset hash-key sub-key1 value1(integer) 1127.0.0.1:6379> hset hash-key sub-key2 value2(integer) 1127.0.0.1:6379> hset hash-key sub-key1 value2(integer) 0127.0.0.1:6379> hgetall hash-key1) "sub-key1"2) "value2"3) "sub-key2"4) "value2"
127.0.0.1:6379> hdel hash-key sub-key2(integer) 1127.0.0.1:6379> hdel hash-key sub-key2(integer) 0127.0.0.1:6379> hget hash-key sub-key1"value2"127.0.0.1:6379> hgetall hash-key1) "sub-key1"2) "value2"
4. SET(集合)
set-key 是一个包含 3 个元素的集合键:
①. 集合命令
②. 使用
127.0.0.1:6379> sadd set-key item(integer) 1127.0.0.1:6379> sadd set-key item2(integer) 1127.0.0.1:6379> sadd set-key item3(integer) 1127.0.0.1:6379> sadd set-key item(integer) 0127.0.0.1:6379> smembers set-key1) "item"2) "item3"3) "item2"
127.0.0.1:6379> sismember set-key item4(integer) 0127.0.0.1:6379> sismember set-key item(integer) 1
127.0.0.1:6379> srem set-key item(integer) 1127.0.0.1:6379> srem set-key item(integer) 0127.0.0.1:6379> smembers set-key1) "item3"2) "item2"
5. ZSET(有序集合)
zset-key 是已一个包含 2 个元素的有序集合键:
①. 有序集合命令:
②. 使用
127.0.0.1:6379> zadd zset-key 728 member1(integer) 1127.0.0.1:6379> zadd zset-key 982 member2(integer) 1127.0.0.1:6379> zadd zset-key 982 member2(integer) 0127.0.0.1:6379> zrange zset-key 0 -1 withscores1) "member1"2) "728"3) "member2"4) "982"
127.0.0.1:6379> zrangebyscore zset-key 0 800 withscores1) "member1"2) "728"
127.0.0.1:6379> zrem zset-key member1(integer) 1127.0.0.1:6379> zrem zset-key member1(integer) 0127.0.0.1:6379> zrange zset-key 0 -1 withscores1) "member2"2) "982"
两者都是非关系型内存键值数据库,主要有以下不同:
1. 数据类型
2. 数据持久化
3. 分布式
4. 内存管理机制
5. 线程模型
Redis 是内存型数据库,为了保证数据断电后不丢失,需要将内存中的数据持久化到磁盘上;另一方面,保存中间结果,不必重新计算。
持久化有 2 种:
Redis 提供的持久化配置选项:
# 快照持久化save 60 1000stop-writes-on-bgsave-error yesrdbcompression no# AOF 持久化appendonly yesappendfsync always # 同步选项auto-aof-rewrite-percentage 100auto-aof-rewrite-min-size 64mb# 共享选项,决定了快照文件和 AOF 文件的保存位置dir ./
1. 快照持久化
快照持久化是通过创建快照来获得 Redis 存储在内存中数据在某个时间点上的副本。在创建快照后,用户可对快照备份,可将快照留在原地以便重启 Redis 时使用。
①. 快照持久化配置
save 60 10000 # 在60秒(1分钟)之后,如果至少有10000个键发生变化,Redis 就会自动触发 BGSAVE 命令创建快照。stop-writes-on-bgsave-error yes # 表示备份进程出错的时候,主进程就停止接收新的写入操作,是为了保护持久化数据的一致性。rdbcompression no# RDB 的压缩设置为 no,因为压缩会占用更多的 CPU 资源。
②. 创建快照的方法
save 60 10000# 从 redis 最近一次创建快照之后算起,满足 “60 s 内 10000 次写入”,Redis 会自动触发 BGSAVE 命令
③. 存在的问题
2. AOF 持久化
AOF 持久化将被执行的写命令写到 AOF 文件末尾,记录数据发生的变化。Redis 值要从头到尾重新执行一次 AOF
文件包含的所有写命令,就可恢复 AOF 文件所记录的数据。
默认情况下,Redis 没有开启 AOF(append only file)方式的持久化,可以通过 appendonly 参数开启:
appendonly yes
①. 快照持久化配置
appendonly yesappendfsync always # 同步选项auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb
②. 同步选项
使用 AOF 持久化需要设置同步选项,从而确保写命令什么时候会同步到磁盘文件上。
3. 重写 / 压缩 AOF 文件
AOF 持久化存在的问题:
为了解决 AOF 文件不断增大的问题,我们采用重写 / 压缩 AOF 文件的方式:
用户 Redis 发送 BGREWRITEAOF 命令,通过移除 AOF 文件中冗余命令来重写 AOF 文件来减小 AOF 文件的体积。
(新的 AOF 文件和原有的 AOF 文件所保存的数据状态是一致的,但是体积更小)。
BGREWRITEAOF 原理:
Redis 维护 AOF 重写缓冲区和 AOF 缓冲区。子进程创建新的 AOF 文件期间,记录服务器执行的所有写命令会同时写入 2 个缓冲区中,使得新旧两个 AOF 文件中所保存的数据状态一致。
4. 对比
5. 优化
Redis 4.0 以后将快照和 AOF 混合持久化(默认关闭,使用 aof-user-rdb-preamble开启),AOF 重写时将快照写入 AOF 文件开头。
这样做的好处是可以结合 RDB 和 AOF 的优点, 快速加载同时避免丢失过多的数据,当然缺点也是有的, AOF 里面的 RDB 部分是压缩格式不再是 AOF 格式,可读性较差。
五. Redis事务1. 命令
2. 简述
Redis 通过 MULTI、EXEC、WATCH 等命令来实现事务功能。
事务提供了一种将多个命令请求打包,然后一次性、按顺序地执行多个命令的机制。服务器在执行事务期间,不会改去执行其它客户端的命令请求,它会将事务中的所有命令都执行完毕,然后才去处理其他客户端的命令请求。
事务中的多个命令被一次性发送给服务器,而不是一条一条发送,这种方式被称为pipeline。
注意:
1. 什么是Redis?简述它的优缺点?
Redis的全称是:Remote Dictionary.Server,本质上是一个Key-Value类型的内存数据库,很像 memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘 上进行保存。
因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作,是已知性能最快的 Key-Value DB。
Redis的出色之处不仅仅是性能,Redis最大的魅力是支持保存多种数据结构,此外单个value的最大限 制是1GB,不像 memcached只能保存1MB的数据,因此Redis可以用来实现很多有用的功能。
比方说用他的List来做FIFO双向链表,实现一个轻量级的高性 能消息队列服务,用他的Set可以做高 性能的tag系统等等。
另外Redis也可以对存入的Key-Value设置expire时间,因此也可以被当作一 个功能加强版的 memcached来用。 Redis的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能 读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。
2. Redis与memcached相比有哪些优势?
3. Redis支持哪几种数据类型?
String、List、Set、Sorted Set、hashes
4. Redis主要消耗什么物理资源?
内存。
5. Redis有哪几种数据淘汰策略?
6. Redis官方为什么不提供Windows版本?
因为目前Linux版本已经相当稳定,而且用户量很大,无需开发windows版本,反而会带来兼容性等问 题。
7. 一个字符串类型的值能存储最大容量是多少?
512M
8. 为什么Redis需要把所有数据放到内存中?
Redis为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘。 所以redis具有快速和数据持久化的特征,如果不将数据放在内存中,磁盘I/O速度为严重影响redis的 性能。 在内存越来越便宜的今天,redis将会越来越受欢迎, 如果设置了最大使用的内存,则数据已有记录数达 到内存限值后不能继续插入新值。
9. Redis集群方案应该怎么做?都有哪些方案?
10. Redis集群方案什么情况下会导致整个集群不可用?
有A,B,C三个节点的集群,在没有复制模型的情况下,如果节点B失败了,那么整个集群就会以为缺少 5501-11000这个范围的槽而不可用。
11. Redis有哪些适合的场景?
欢迎分享转载→http://www.umpkq.cn/read-255572.html
下一篇:花呗额度怎么分享
Copyright ? 2024 有趣生活 All Rights Reserve吉ICP备19000289号-5 TXT地图