1. Memcached简介
Memcached是以LiveJurnal旗下Danga Interactive公司的Bard Fitzpatric为首开发的高性能分布式内存缓存服务器。其本质上就是一个内存key-value数据库,但是不支持数据的持久化,服务器关闭之后数据全部丢失。Memcached使用C语言开发,在大多数像Linux、BSD和Solaris等POSIX系统上,只要安装了libevent即可使用。在Windows下,它也有一个可用的非官方版本(http://code.jellycan.com/memcached/)。Memcached的客户端软件实现非常多,包括C/C++, PHP, Java, Python, Ruby, Perl, Erlang, Lua等。当前Memcached使用广泛,除了LiveJournal以外还有Wikipedia、Flickr、Twitter、Youtube和WordPress等。
在Window系统下,Memcached的安装非常方便,只需从以上给出的地址下载可执行软件然后运行memcached.exe –d install即可完成安装。在Linux等系统下,我们首先需要安装libevent,然后从获取源码,make && make install即可。默认情况下,Memcached的服务器启动程序会安装到/usr/local/bin目录下。在启动Memcached时,我们可以为其配置不同的启动参数。
1.1 Memcache配置
Memcached服务器在启动时需要对关键的参数进行配置,下面我们就看一看Memcached在启动时需要设定哪些关键参数以及这些参数的作用。
1)-p <num> Memcached的TCP监听端口,缺省配置为11211;
2)-U <num> Memcached的UDP监听端口,缺省配置为11211,为0时表示关闭UDP监听;
3)-s <file> Memcached监听的UNIX套接字路径;
4)-a <mask> 访问UNIX套接字的八进制掩码,缺省配置为0700;
5)-l <addr> 监听的服务器IP地址,默认为所有网卡;
6)-d 为Memcached服务器启动守护进程;
7)-r 最大core文件大小;
8)-u <username> 运行Memcached的用户,如果当前为root的话需要使用此参数指定用户;
9)-m <num> 分配给Memcached使用的内存数量,单位是MB;
10)-M 指示Memcached在内存用光的时候返回错误而不是使用LRU算法移除数据记录;
11)-c <num> 最大并发连数,缺省配置为1024;
12)-v –vv –vvv 设定服务器端打印的消息的详细程度,其中-v仅打印错误和警告信息,-vv在-v的基础上还会打印客户端的命令和相应,-vvv在-vv的基础上还会打印内存状态转换信息;
13)-f <factor> 用于设置chunk大小的递增因子;
14)-n <bytes> 最小的chunk大小,缺省配置为48个字节;
15)-t <num> Memcached服务器使用的线程数,缺省配置为4个;
16)-L 尝试使用大内存页;
17)-R 每个事件的最大请求数,缺省配置为20个;
18)-C 禁用CAS,CAS模式会带来8个字节的冗余;
2. Redis简介
Redis是一个开源的key-value存储系统。与Memcached类似,Redis将大部分数据存储在内存中,支持的数据类型包括:字符串、哈希表、链表、集合、有序集合以及基于这些数据类型的相关操作。Redis使用C语言开发,在大多数像Linux、BSD和Solaris等POSIX系统上无需任何外部依赖就可以使用。Redis支持的客户端语言也非常丰富,常用的计算机语言如C、C#、C++、Object-C、PHP、Python、Java、Perl、Lua、Erlang等均有可用的客户端来访问Redis服务器。当前Redis的应用已经非常广泛,国内像新浪、淘宝,国外像Flickr、Github等均在使用Redis的缓存服务。
Redis的安装非常方便,只需从http://redis.io/download获取源码,然后make && make install即可。默认情况下,Redis的服务器启动程序和客户端程序会安装到/usr/local/bin目录下。在启动Redis服务器时,我们需要为其指定一个配置文件,缺省情况下配置文件在Redis的源码目录下,文件名为redis.conf。
2.1 Redis配置文件
为了对Redis的系统实现有一个直接的认识,我们首先来看一下Redis的配置文件中定义了哪些主要参数以及这些参数的作用。
1)daemonize no 默认情况下,redis不是在后台运行的。如果需要在后台运行,把该项的值更改为yes;
2)pidfile /var/run/redis.pid当Redis在后台运行的时候,Redis默认会把pid文件放在/var/run/redis.pid,你可以配置到其他地址。当运行多个redis服务时,需要指定不同的pid文件和端口;
3)port 6379指定redis运行的端口,默认是6379;
4)bind 127.0.0.1 指定redis只接收来自于该IP地址的请求,如果不进行设置,那么将处理所有请求。在生产环境中最好设置该项;
5)loglevel debug 指定日志记录级别,其中Redis总共支持四个级别:debug、verbose、notice、warning,默认为verbose。debug表示记录很多信息,用于开发和测试。verbose表示记录有用的信息,但不像debug会记录那么多。notice表示普通的verbose,常用于生产环境。warning 表示只有非常重要或者严重的信息会记录到日志;
6)logfile /var/log/redis/redis.log 配置log文件地址,默认值为stdout。若后台模式会输出到/dev/null;
7)databases 16 可用数据库数,默认值为16,默认数据库为0,数据库范围在0-(database-1)之间;
8)save 900 1保存数据到磁盘,格式为save <seconds> <changes>,指出在多长时间内,有多少次更新操作,就将数据同步到数据文件rdb。相当于条件触发抓取快照,这个可以多个条件配合。save 900 1就表示900秒内至少有1个key被改变就保存数据到磁盘;
9)rdbcompression yes 存储至本地数据库时(持久化到rdb文件)是否压缩数据,默认为yes;
10)dbfilename dump.rdb本地持久化数据库文件名,默认值为dump.rdb;
11)dir ./ 工作目录,数据库镜像备份的文件放置的路径。这里的路径跟文件名要分开配置是因为redis在进行备份时,先会将当前数据库的状态写入到一个临时文件中,等备份完成时,再把该临时文件替换为上面所指定的文件。而这里的临时文件和上面所配置的备份文件都会放在这个指定的路径当中,AOF文件也会存放在这个目录下面。注意这里必须指定一个目录而不是文件;
12)slaveof <masterip> <masterport> 主从复制,设置该数据库为其他数据库的从数据库。设置当本机为slave服务时,设置master服务的IP地址及端口。在Redis启动时,它会自动从master进行数据同步;
13)masterauth <master-password> 当master服务设置了密码保护时(用requirepass制定的密码)slave服务连接master的密码;
14)slave-serve-stale-data yes 当从库同主机失去连接或者复制正在进行,从机库有两种运行方式:如果slave-serve-stale-data设置为yes(默认设置),从库会继续相应客户端的请求。如果slave-serve-stale-data是指为no,除去INFO和SLAVOF命令之外的任何请求都会返回一个错误"SYNC with master in progress";
15)repl-ping-slave-period 10从库会按照一个时间间隔向主库发送PING,可以通过repl-ping-slave-period设置这个时间间隔,默认是10秒;
16)repl-timeout 60 设置主库批量数据传输时间或者ping回复时间间隔,默认值是60秒,一定要确保repl-timeout大于repl-ping-slave-period;
17)requirepass foobared 设置客户端连接后进行任何其他指定前需要使用的密码。因为redis速度相当快,所以在一台比较好的服务器下,一个外部的用户可以在一秒钟进行150K次的密码尝试,这意味着你需要指定非常强大的密码来防止暴力破解;
18)rename-command CONFIG "" 命令重命名,在一个共享环境下可以重命名相对危险的命令,比如把CONFIG重名为一个不容易猜测的字符:# rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52。如果想删除一个命令,直接把它重命名为一个空字符""即可:rename-command CONFIG "";
19)maxclients 128设置同一时间最大客户端连接数,默认无限制。Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件描述符数。如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clients reached错误信息;
20)maxmemory <bytes> 指定Redis最大内存限制。Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key,Redis同时也会移除空的list对象。当此方法处理后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。注意:Redis新的vm机制,会把Key存放内存,Value会存放在swap区;
21)maxmemory-policy volatile-lru 当内存达到最大值的时候Redis会选择删除哪些数据呢?有五种方式可供选择:volatile-lru代表利用LRU算法移除设置过过期时间的key (LRU:最近使用 Least Recently Used ),allkeys-lru代表利用LRU算法移除任何key,volatile-random代表移除设置过过期时间的随机key,allkeys_random代表移除一个随机的key,volatile-ttl代表移除即将过期的key(minor TTL),noeviction代表不移除任何key,只是返回一个写错误。
注意:对于上面的策略,如果没有合适的key可以移除,写的时候Redis会返回一个错误;
22)appendonly no 默认情况下,redis会在后台异步的把数据库镜像备份到磁盘,但是该备份是非常耗时的,而且备份也不能很频繁。如果发生诸如拉闸限电、拔插头等状况,那么将造成比较大范围的数据丢失,所以redis提供了另外一种更加高效的数据库备份及灾难恢复方式。开启append only模式之后,redis会把所接收到的每一次写操作请求都追加到appendonly.aof文件中。当redis重新启动时,会从该文件恢复出之前的状态,但是这样会造成appendonly.aof文件过大,所以redis还支持了BGREWRITEAOF指令对appendonly.aof 进行重新整理,你可以同时开启asynchronous dumps 和 AOF;
23)appendfilename appendonly.aof AOF文件名称,默认为"appendonly.aof";
24)appendfsync everysec Redis支持三种同步AOF文件的策略: no代表不进行同步,系统去操作,always代表每次有写操作都进行同步,everysec代表对写操作进行累积,每秒同步一次,默认是"everysec",按照速度和安全折中这是最好的。
25)slowlog-log-slower-than 10000 记录超过特定执行时间的命令。执行时间不包括I/O计算,比如连接客户端,返回结果等,只是命令执行时间。可以通过两个参数设置slow log:一个是告诉Redis执行超过多少时间被记录的参数slowlog-log-slower-than(微妙),另一个是slow log 的长度。当一个新命令被记录的时候最早的命令将被从队列中移除,下面的时间以微妙微单位,因此1000000代表一分钟。注意制定一个负数将关闭慢日志,而设置为0将强制每个命令都会记录;
26)hash-max-zipmap-entries 512 && hash-max-zipmap-value 64 当hash中包含超过指定元素个数并且最大的元素没有超过临界时,hash将以一种特殊的编码方式(大大减少内存使用)来存储,这里可以设置这两个临界值。Redis Hash对应Value内部实际就是一个HashMap,实际这里会有2种不同实现。这个Hash的成员比较少时Redis为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的HashMap结构,对应的value redisObject的encoding为zipmap。当成员数量增大时会自动转成真正的HashMap,此时encoding为ht;
27)list-max-ziplist-entries 512 list数据类型多少节点以下会采用去指针的紧凑存储格式;
28)list-max-ziplist-value 64数据类型节点值大小小于多少字节会采用紧凑存储格式;
29)set-max-intset-entries 512 set数据类型内部数据如果全部是数值型,且包含多少节点以下会采用紧凑格式存储;
30)zset-max-ziplist-entries 128 zsort数据类型多少节点以下会采用去指针的紧凑存储格式;
31)zset-max-ziplist-value 64 zsort数据类型节点值大小小于多少字节会采用紧凑存储格式。
32)activerehashing yes Redis将在每100毫秒时使用1毫秒的CPU时间来对redis的hash表进行重新hash,可以降低内存的使用。当你的使用场景中,有非常严格的实时性需要,不能够接受Redis时不时的对请求有2毫秒的延迟的话,把这项配置为no。如果没有这么严格的实时性要求,可以设置为yes,以便能够尽可能快的释放内存;
相关推荐
通过《谈谈Memcached与Redis》这篇文档,我们可以深入理解这两种技术的原理、优缺点,并根据具体需求选择合适的缓存解决方案。同时,文档可能还会涵盖安装配置、优化技巧以及实际案例分析,帮助读者更好地掌握和应用...
此外,还有分布式缓存系统,如Memcached和Redis,它们为应用提供高性能的数据缓存服务,特别适用于数据库的读取优化。 在“PD201909300945191818677”这份文档或论文中,可能详细探讨了上述存储技术的实现、优化...
对于性能优化,可以使用索引来加快数据库查询速度,合理设计数据库表结构以减少冗余,以及使用缓存技术如Memcached或Redis来减少数据库访问。 在开发过程中,版本控制工具如Git可以帮助团队协作和管理代码。使用...
6. **缓存技术**:Memcached和Redis都是高速缓存,面试中会讨论它们的区别、应用场景、数据结构及操作命令。 7. **数据库**:MySQL是常用的SQL数据库,面试会涉及SQL优化、事务、索引、存储引擎等相关知识。 8. **...
可以使用分布式会话管理,例如Memcached或Redis来存储会话信息。 2. **修改Tomcat配置**:在每个Tomcat实例的server.xml文件中,添加`<Cluster>`元素,配置集群通信协议(如TCP)和序列化机制。 3. **复制应用程序...
另一种解决方案是利用Memcached这类内存数据库,但效率较低。 **分布式事务**:随着业务复杂度的增加,单体应用的事务管理变得困难。分布式事务解决方案如TCC(Try-Confirm-Cancel),通过预操作、确认和补偿机制...
架构优化则可能涉及主从复制(Master/Slave)、分表分片、分布式数据库,以及利用缓存服务如Redis或Memcached来缓解数据库压力。此外,优化查询语句、事务管理、数据库设计和数据分布也是提升性能的关键。例如,避免...
问题 13:请解释 Redis 与 Memcached 的异同,以及它们各自适用的场景。答案:Redis 和 Memcached 都是高性能的内存数据存储,常用于缓存。Redis 支持更多数据结构(如字符串、列表、哈希表等),支持持久化,可以...
2. 共享存储:使用Redis、Memcached等缓存服务作为共享存储,将Session数据持久化并由所有Tomcat实例访问。 3. 使用Cookie或URL重写来携带Session ID,让服务器根据ID查找对应的Session。 接下来,我们谈谈ANT。Ant...
Homestead是Laravel官方推荐的开发环境,它是一个预配置的Vagrant Box,包含了开发Laravel应用所需的所有组件,如Nginx web服务器、PHP、Composer、MySQL、PostgreSQL、Redis、Memcached等。使用Homestead,开发者...
在服务器端,应用可能会使用内存缓存(如Redis或Memcached)或数据库缓存来加速数据检索。 综合以上,气泡提示和文本框绑定事件关注的是提升用户体验和增强交互性,而缓存技术则旨在优化性能和响应速度。在实际项目...
本地缓存适用于单机应用,而分布式缓存适用于多服务器环境,例如使用Redis或Memcached。通过合理利用缓存,可以显著降低数据库负载,提升系统响应速度。 再来说说Galbanum的Logger模块。日志记录对于软件的调试、...
4. **数据库缓存**:使用如Redis或Memcached等内存数据库作为缓存,可以存储经常访问的数据,减少对硬盘的读取,提高响应速度。 5. **分区和分片**:将大表分为多个小表,可以分散负载,提高查询效率。分区通常是...
- **print**:与echo类似,但只能接受一个参数,返回值始终为1。 - **print_r()**:用于输出数组或对象的结构,对于简单的字符串,它也会输出该字符串,但通常用于调试目的。 ### 3. 能够使HTML和PHP分离开使用的...
- **缓存机制**:使用缓存策略减轻数据库压力,如Memcached或Redis。 #### 7. PHP的意思 PHP是Hypertext Preprocessor的缩写,是一种通用开源脚本语言,尤其适用于Web开发,可以嵌入HTML中。 #### 8. MYSQL取得...
8. **性能优化**:缓存技术的应用,如页面静态化、Redis或Memcached的使用,以提高系统响应速度。 9. **SEO优化**:通过设置元标签、URL重写等方式提高搜索引擎的友好性,提升网站的流量。 10. **移动适配**:考虑...
例如,使用Redis或Memcached作为缓存系统,以减少数据库查询;利用Celery或其他异步任务框架处理耗时操作,如发送邮件通知、生成PDF发票等,以提高系统响应速度。 总结来说,这个项目涵盖了Saleor的深度定制,包括...
常见的分布式缓存系统有Redis、Memcached等,它们能够提供高并发、低延迟的数据访问。 其次,无线数据网络环境下的网络游戏需要面对带宽限制、网络抖动等问题。分布式缓存通过预加载热门游戏资源到离玩家最近的缓存...
6. **缓存优化**:使用缓存(如Redis或Memcached)来减少对后端数据库的访问,降低延迟,提升性能。 7. **数据库优化**:例如使用主从复制、分区、索引等策略,提高数据库的并发处理能力。 8. **硬件升级**:增加...
3. **缓存技术**:为了加速数据访问,大型网站会广泛使用缓存,如Redis或Memcached,以减少数据库的读取压力。缓存策略包括页面缓存、对象缓存和数据库查询缓存等。 4. **数据库集群**:单一数据库难以应对大量并发...