没有合适的资源?快使用搜索试试~ 我知道了~
redis缓存技术学习.docx
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 48 浏览量
2022-07-09
12:32:13
上传
评论
收藏 200KB DOCX 举报
温馨提示
试读
19页
redis缓存技术学习.docx
资源推荐
资源详情
资源评论
很多开发者都认为Redis 不可能比Memcached 快,Memcached 完全基于内存,而Redis
具有持久化保存特性,即使是异步的,Redis 也不可能比Memcached 快。但是测试结果基
本是Redis 占绝对优势。一直在思考这个原因,目前想到的原因有这几方面。
Libevent。和 Memcached 不同,Redis 并没有选择libevent。Libevent 为了迎合通用性造
成代码庞大(目 前 Redis 代码还不到libevent 的 1/3)及牺牲了在特定平台的不少性能。Redis
用 libevent 中两个文件修改实现了自己的epoll event loop(4)。业界不少开发者也建议Redis
1
什么是 redis
redis 是一个 key-value 存储系统 。和 Memcached 类似,它支持存储的 value 类型相对
更多,包括 string( 字符串 )、list( 链表 )、set( 集合 )和 zset( 有序集合 )。这些数据类型都
支 持 push/pop 、add/remove 及取交集并集和差集及更丰富的操作,而且这些操作都
是原子性的。在此基础上, redis 支持各种不同方式的排序。与 memcached 一样,为
了保证效率,数据都是缓存在内存中。区别的是 redis 会周期性的把更新的数据写入
磁盘或者把修改操作写入追加的记录文件, 并且在此基础上实现了 master-slave( 主从 )
同步。
2
性能怎么样
Redis 是一个高性能的 key-value 内存数据库。官方性能测试结果:
set 操作每秒 110000 次,get 操作每秒 81000 次。
3
可不可以存对象
和 Memcached 类似,它支持存储的 value 类型相对更多,包括 string( 字符串)、list( 链表
)、set( 集合)和 zset( 有序集合 )。这些数据类型都支持 push/pop 、add/remove 及取交集并
集和差集及更丰富的操作。
4
Redis 与 memcache 的最大区别
Replication(树形)
data types(String、Lists、Sorted Sets、Hashes)
persistence (snapshot、aof)
Redis 的数据全部放在内存带来了高速的性能,但是也带来一些不合理之处。比如一个中型
网站有 100 万注册用户,如果这些资料要用 Redis 来存储,内存的容量必须能够容纳这 100
万用户。但是业务实际情况是 100 万用户只有 5 万活跃用户,1 周来访问过 1 次的也只有
15
万用户,因此全部100
万用户的数据都放在内存有不合理之处,
RAM
需要为冷数据买单。
这跟操作系统非常相似,操作系统所有应用访问的数据都在内存,但是如果物理内存容纳不
下新的数据,操作系统会智能将部分长期没有访问的数据交换到磁盘,为新的应用留出空间。现
代操作系统给应用提供的并不是物理内存,而是虚拟内存(Virtual Memory)的概念。
基于相同的考虑,
Redis
2.0
也增加了
VM
特性。让
Redis
数据容量突破了物理内存的限制。
并实现了数据冷热分离。
Redis 的 VM 依照之前的epoll 实现思路依旧是自己实现。但是在前面操作系统的介绍提到
OS 也可以自动帮程序实现冷热数据分离,Redis 只需要OS 申请一块大内存,OS 会自动
将热数据放入物理内存,冷数据交换到硬盘,另外一个知名的“理解了现代操作系统(3)”的
Varnish 就是这样实现,也取得了非常成功的效果。
作者 antirez 在解释为什么要自己实现VM 中提到几个原因(6)。主要 OS 的 VM 换入换出是
基于Page 概念,比如OS VM1 个 Page 是 4K, 4K 中只要还有一个元素即使只有 1 个字节
被访问,这个页也不会被SWAP, 换入也同样道理,读到一个字节可能会换入4K 无用的内
5
单台 Redis 的存放数据必须比物理内存小
6
Redis 的 VM 实现是重复造轮子
使用另外一个libevent 高性能替代libev,但是作者还是坚持Redis 应该小巧并去依赖的思
路。一个印象深刻的细节是编译Redis 之前并不需要执行./configure。
CAS 问题。CAS 是 Memcached 中比较方便的一种防止竞争修改资源的方法。CAS 实现需
要为每个cache key 设置一个隐藏的cas token,cas 相当 value 版本号,每次set 会 token
需要递增,因此带来 CPU 和内存的双重开销,虽然这些开销很小,但是到单机 10G+ cache
以及 QPS 上万之后这些开销就会给双方相对带来一些细微性能差别(5)。
作为一个key value 存在,很多开发者自然的使用 set/get 方式来使用Redis,实际上这并不
是最优化的使用方法。尤其在未启用VM 情况下,Redis 全部数据需要放入内存,节约内存
尤其重要。
假如一个key-value 单元需要最小占用 512 字节,即使只存一个字节也占了512 字节。这
时候就有一个设计模式,可以把key 复用,几个key-value 放入一个key 中,value 再作为
一个 set 存入,这样同样 512 字节就会存放 10-100 倍的容量。
这就是为了节约内存,建议使用hashset 而不是set/get 的方式来使用Redis
Redis 有两种存储方式,默认是snapshot 方式,实现方法是定时将内存的快照(snapshot)
持久化到硬盘,这种方法缺点是持久化之后如果出现crash 则会丢失一段数据。因此在完美主
义者的推动下作者增加了aof 方式。aof 即 append only mode,在写入内存数据的同时将操
作命令保存到日志文件,在一个并发更改上万的系统中,命令日志是一个非常庞大的数据, 管理维
护成本非常高,恢复重建时间会非常长,这样导致失去aof 高可用性本意。另外更重要的是 Redis
是一个内存数据结构模型,所有的优势都是建立在对内存复杂数据结构高效
的原子操作上,这样就看出aof 是一个非常不协调的部分。
其实 aof 目的主要是数据可靠性及高可用性,在Redis 中有另外一种方法来达到目的:
Replication。由于 Redis 的高性能,复制基本没有延迟。这样达到了防止单点故障及实现了高
可用。
7
用 get/set 方式使用 Redis
8
使用 aof 代替 snapshot
存。而Redis 自己实现则可以达到控制换入的粒度。另外访问操作系统SWAP 内存区域时
block 进程,也是导致Redis 要自己实现VM 原因之一。
在多台服务器上简单实现 Redis 的数据主从复制
Redis 的主从复制功能非常强大,一个 master 可以拥有多个 slave,而一个 slave
又可以拥有多个 slave,如此下去,形成了强大的多级服务器集群架构。下面我演示下怎样在
多台服务器上进行 Redis 数据主从复制。这里我假设有两台服务器,一台是 Windows
操作
系统(局域网IP:192.168.3.82),一台是Linux
操作系统(局域网IP:192.168.3.90),
在两
个操作系统都安装 redis,Windows 操作系统使用 cygwin 工具进行安装,命令为:
view sourceprint?
1 $ tarxzf redis-2.2.2.tar.gz
2 $ cdredis-2.2.2
3 $ make
9Redis 是否支持集群
支持
redis 主从复制配置和使用都非常简单。通过主从复制可以允许多个 slave server 拥有
和 master server 相同的数据库副本。下面是关于redis 主从复制的一些特点
1. master 可以有多个 slave
2. 除了多个 slave 连到相同的 master 外,slave 也可以连接其他 slave 形成图状结构
3. 主从复制不会阻塞 master。也就是说当一个或多个 slave 与 master 进行初次同步数据
时,master 可以继续处理 client 发来的请求。相反 slave 在初次同步数据时则会阻塞不能
处理 client 的请求。
4. 主从复制可以用来提高系统的可伸缩性,我们可以用多个slave 专门用于client 的读请求,
比如 sort 操作可以使用 slave 来处理。也可以用来做简单的数据冗余
5. 可以在 master 禁用数据持久化,只需要注释掉 master 配置文件中的所有 save 配置,
然后只在 slave 上配置数据持久化。
下面介绍下主从复制的过程
当设置好 slave 服务器后,slave 会建立和 master 的连接,然后发送 sync 命令。无
论是第一次同步建立的连接还是连接断开后的重新连接,master 都会启动一个后台进程, 将
数据库快照保存到文件中,同时 master 主进程会开始收集新的写命令并缓存起来。后台进程
完成写文件后,master 就发送文件给 slave,slave 将文件保存到磁盘上,然后加载到内存
恢复数据库快照到 slave 上。接着 master 就会把缓存的命令转发给 slave。而且后续
master 收到的写命令都会通过开始建立的连接发送给slave。从 master 到 slave 的同步数
据的命令和从 client 发送的命令使用相同的协议格式。当master 和 slave 的连接断
开时 slave 可以自动重新建立连接。如果 master 同时收到多个 slave 发来的同步连接命
令,只会使用启动一个进程来写数据库镜像,然后发送给所有slave。
可以通过"make test”命令判断是否安装成功。
剩余18页未读,继续阅读
资源评论
Cheng-Dashi
- 粉丝: 108
- 资源: 1万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功