Memcache和Redis复习总结
Posted lovele-
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Memcache和Redis复习总结相关的知识,希望对你有一定的参考价值。
Memcache
Memcache是一个高性能的分布式的内存对象缓存系统,主要是用来缓存从mysql数据库中查询的数据,减少对mysql数据库的压力。
Memcache的工作流程:
当用户发生一个动态请求的时候,先去Memcache服务器里面查询缓存数据,当首次查询的时候,Memcache里面肯定是没有数据的,这个时候需要php程序去MySQL数据库里面获取数据,将获取先缓存一份到Memcache服务器里面,在把数据返回给用户。当第二次发生相同的动态的请求的时候,这个时候由于上一次上Memcache 里面已经缓存了对应的查询数据,这个Memcache就可以直接的返回数据,而不需要MySQL数据库的参与,减少了MySQL数据库的压力。?对于这种架构来说,由于Memcache是处于旁边的,这种缓存系统叫做旁路式缓存系统。
Memcache使用了一个预分配的机制来管理自己的内存单元。Memcache的这一套分配机制主要是为了解决Memcache的一个内存碎片化的问题。??
Memcache的基本命令:
add 添加一个key
replace 更新(update)
set 如果一个不存在则添加如果存在则更新
delete 删除一个key
get 获取一个指定key的值
prepend 在一个值的前面追加
stats 查看memcache的状态
flush_all 清空memcache里面的所有
Memcache分布式:Memcache是一个高性能、开放源代码、分布式缓存系统。由于单台Memcache服务的能力有限,这个时候就可以使用多台Memcache来完成服务,形成的架构就叫做Memcache的分布式(多台)缓存系统。
Memcache安全问题:
1. Memcache在使用过程中,是没有用户名的验证操作的。所以一般在使用Memcache的时候都是在内网使用,不要使用公网IP。
2. 如果真的要在公网IP使用,可以写一个专门的防火墙验证规则,只允许规定的IP去操作Memcache服务器。
Memcache雪崩:当使用Memcache缓存系统全部崩溃的时候,这个时候所有的压力全部加在了MySQL服务器上,MySQL服务器无法支撑其访问,会立马的崩溃,这种现象叫做Memcache的雪崩现象。为了防止此类问题的发送,需要对Memcache的缓存系统做优化处理(使用一致性hash算法来实现缓存系统)。
? Memcache总结:
1、Memecache把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小。
2、Memcache使用了SlabAllocator的内存分配机制:按照预先规定的大小,将分配的内存分割成特定长度的块,以完全解决内存碎片问题。
3、Memcache存在内存中,分配的内存满后,会按一定的规则删除一些k/v数据,重启后自然全部丢失。
4、过期策略--Memcache在set时就指定,例如set key1 0 08,即永不过期。Redis可以通过例如expire 设定。
5、首先要说明的是Memcached支持最大的存储对象为1M。它的内存分配比较特殊,但是这样的分配方式其实也是基于性能考虑的,简单的分配机制可以更容易回收再分配,节省对CPU的使用。大于1M需要拆分。
6、Memcached能接受的key的最大长度是,255字符。
7、同一份数据同时发送了一个set命令和一个get命令,它们不会影响对方,但是get以后,处理期间可能先被其他Set了,后面的Set会覆盖前面的,但是Memcached1.2.5以及更高版本,提供了gets和cas命令,它们可以解决上面的问题。如果您使用gets命令查询某个key的item,Memcached会给您返回该item当前值的唯一标识。如果您覆写了这个item并想把它写回到Memcached中,您可以通过cas命令把那个唯一标识一起发送给Memcached。如果该item存放在Memcached中的唯一标识与您提供的一致,您的写操作将会成功。如果另一个进程在这期间也修改了这个item,那么该item存放在Memcached中的唯一标识将会改变,您的写操作就会失败。
8、无身份验证,认为身份验证是更高层的问题。
9、删除Delete操作只是将该chunk置为删除状态,这样在下次使用将优先利用这样的chunk。
10、Flush操作相当于将所有的item失效的一个动作。并不会改变Memcache内存分配情况。
11、Memcache已经分配的内存不会再主动清理。
12、Memcache分配给某个slab的内存页不能再分配给其他slab。
13、flush_all不能重置Memcache分配内存页的格局,只是给所有的item置为过期。
14、Memcache最大存储的item(key+value)大小限制为1M,这由page大小1M限制。
15、由于Memcache的分布式是客户端程序通过hash算法得到的key取模来实现,不同的语言可能会采用不同的hash算法,同样的客户端程序也有可能使用相异的方法,因此在多语言、多模块共用同一组Memcached服务时,一定要注意在客户端选择相同的hash算法。
16、启动Memcached时可以通过-M参数禁止LRU替换,在内存用尽时add和set会返回失败。
17、Memcached启动时指定的是数据存储量,没有包括本身占用的内存、以及为了保存数据而设置的管理空间。因此它占用的内存量会多于启动时指定的内存分配量,这点需要注意。
Redis
Redis: REmoteDIctionaryServer,可以直接理解为远程字典服务
Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sortedset--有序集合)和hash(哈希类型,类似php里面的关联数组)。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件(数据持久化)。?
redis的出现很大程度补偿了Memcached这类key/value(Memcache的value只能保存单一的string类型)存储不足的问题。
Redis的特性:
1、(value可以是多种数据类型)多种数据类型存储:字符串类型String、哈希类型(关联数组)Hash、 列表类型List、集合类型Set、 有序集合类型
2、内存存储与持久化
(1)、内存的读写速度远快于硬盘
(2)、自身提供了持久化功能(RDB、AOF两种方式)
RDB(快照) 持久化可以在指定的时间间隔内将内存里面的数据保存到硬盘上。这种保存方式是有丢失数据的危险的。
AOF 持久化记录redis服务器上所执行的所有写操作命令(有点类似MySQL里面的bin日志)全部保存到磁盘文件的日志上,并在服务器启动时,通过重新执行这些命令来还原数据集。AOF 文件中的命令全部以Redis 协议的格式来保存,新命令会被追加到文件的末尾。
Redis 还可以同时使用 AOF 持久化和RDB 持久化。在这种情况下,当Redis 重启时,它会优先使用AOF 文件来还原数据集,因为AOF 文件保存的数据集通常比RDB 文件所保存的数据集更完整。
甚至可以关闭持久化功能,让数据只在服务器运行时内存中存在。等同于Memcache。
3、功能丰富
(1)、可以用作缓存、队列(先进先出)
(2)、支持键的生存时间(缓存时间可以设置到毫秒级别(做秒杀应用),memcache里面只支持到秒级别)
(3)、按照一定规则删除相应的键
4、简单稳定
(1)、相比SQL而言更加简洁,不需要做sql语句的解析。
(2)、不同语言的客户端丰富,支持多种语言来操作redis
(3)、基于C语言开发(效率更高),代码量只有3万多行
? redis多数据库:
redis默认支持16个数据库,对外都是以一个从0开始的递增数字命名,可以通过参数database来修改默认数据库个数。客户端连接redis服务后会自动选择0号数据库,可以通过select命令更换数据库,例如选择1号数据库。
说明:
Redis不支持自定义数据库名称。
Redis不支持为每个数据库设置访问密码。
Redis的多个数据库之间不是安全隔离的,FLUSHALL命令会清空所有数据库的数据。
Redis生存时间:
Redis在实际使用过程中更多的用作缓存,然而缓存的数据一般都是需要设置生存时间的,即到期后数据销毁。
设置生存时间语法:
EXPIRE keyseconds?:以分钟设置生存时间
PEXPIRE keymilliseconds?:以毫秒设置生存时间,可以做到更精确的控制。
TTL查看key的剩余时间,当返回值为-2时,表示key已经过期,被删除了。
清除生存时间语法:PERSIST key
设置新的数据时需要重新设置该key的生存时间。重新设置值也会清除生存时间。
?
Redis中的常用命令:?
客户端连接命令: src/redis-cli
? 停止redis服务: src/redis-clishutdown?
1、发送命令: ping (返回pong)
?2、命令返回值: set KEYVALUE
3、获取帮助命令: help?
4、数据库切换: select 1
5、获取符合规则的建名列表命令:
KEYS* keystest[_]* keyst[a-d] 说明: ? 匹配一个字符 * 匹配任意个(包括0个)字符 [] 匹配括号间的任一字符,可以使用“-“表示范围。如a[a-d]匹配ab/ac/ad x 匹配字符x,用于转义符合,如果要匹配“?“就需要使用?
6、EXISTS判断命令: exists KEY
判断一个key是否存在。如果key存在则返回整数类型1,否则返回0。
7、DEL删除命令: del KEY
? 删除键,可以删除一个或者多个键,多个键用空格隔开,返回值是删除的键的个数。
8、TYPE查看键值类型命令: type KEY
获得键值的数据类型,返回值可能是string(字符串)、hash(散列类型)、list(列表类型)、set(集合类型)、zset(有序集合类型)。
9、FLUSHALL命令:flushall (该命令一般只在做测试的时候使用)
清空所有数据库。(包含默认配置的16个数据库里面的所有的数据)
10、赋值与取值命令:
SET key value(赋值)
GET key(取值)
注意:字符中间有空格时,用单撇或者双撇括起来。
多个msetmget
11、同时设置/获取多个键值
MSET key value [keyvalue …]
MGET key[key …]
12、INCR自增实现命令: INCRBY keynumber
当存储的字符串是整数时,redis提供了一个实用的命令INCR,其作用是让当前键值递增,并返回递增后的值。如果key不存在,则自动会创建,如果存在自动+1。
13、DECR自减命令:
?DECR key
DECRBY key number(减少指定的整数)
14、Append追加命令: APPEND keyvalue
向尾部追加值。如果键不存在则创建该键,其值为写的value,即相当于SET keyvalue。返回值是追加后字符串的总长度。
15、STRLEN获取字符串长度命令: STRLENkey
字符串长度,返回数据的长度,如果键不存在则返回0。注意,如果键值为空串,返回也是0。
16、 zadd操作
zadd keyscore1 value1socre2 value2 ......
17、zrange操作
zrangekey 0 -1 (-1代表集合里面的最后一个下标,从小到大)
? 18、zrevrange操作
zrevrangekey 0 -1 (代表反转排序 从大大小)
19、lpush 在链表的左侧增加元素信息
lpush link2 a d e f
20、lrange操作:获取链表里面的内容
lrangelink1 0 -1(-1代表最后一个元素下标)
21、 lrem 删除链表里面的内容
lrem link -2 b (代表的含义是从左开始删除 2 个元素b)
lrem link 2 b(代表的含义是从右边开始删除2 个元素b)
??补充:如果网站处于高并发的情况下:有两种方式扩展:1.做集群:扩展服务器2.硬件升级,在原本的项目里面加一个队列服务器。队列服务器可以支持很高的并发,可以先将用户的请求直接保存起来,后面慢慢的处理。
Redis小结:
1、Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储。
2、Redis支持数据的备份,即master-slave模式的数据备份。
3、Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
4、Redis,具备一定的数据库特征。
5、Redis数据可以存储到硬盘,基本没有过期策略。
6、redis有一个致命缺陷 当内存满了时dump数据cpu占用100%。
Memcache和Redis区别
Redis中,并不是所有的数据都一直存储在内存中的,这是和Memcached相比一个最大的区别。
Redis在很多方面具备数据库的特征,或者说就是一个数据库系统,而Memcached只是简单的K/V缓存。
他们的扩展都需要做集群;实现方式:master-slave、Hash。
在100k以上的数据中,Memcached性能要高于Redis。
如果要说内存使用效率,使用简单的key-value存储的话,Memcached的内存利用率更高,而如果Redis采用hash结构来做key-value存储,由于其组合式的压缩,其内存利用率会高于Memcached。当然,这和你的应用场景和数据特性有关。
以上是关于Memcache和Redis复习总结的主要内容,如果未能解决你的问题,请参考以下文章