redis缓存技术学习_第1页
redis缓存技术学习_第2页
redis缓存技术学习_第3页
redis缓存技术学习_第4页
redis缓存技术学习_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、redisredis 是一个 key-value 存储系统。和Memcached 类似,它支持存储的value 类型相更多,包括string( 字符串)、list(链表)、set(集合)和 zset(有序集合)。这些数据类型都支 持push/pop 、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都 是原子性的。在此基础上,redis 支持各种不同方式的排序。与memcached 一样,了保证效率,数据都是缓存在内存中。区别的是redis 会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave( 主从)同步。性能怎么样R

2、edis key-value 内存数据库。官方性能测试结果: set 110000 次,get 81000 次。可不可以存对象Memcached 类似,它支持存储的 value 类型相对更多,包括 string( 字符串)、list链表)set集合)zset( )。这些数据类型都支持 push/pop add/remove 及取交集并集和差集及更丰富的操作。Redis memcache 的最大区别Replication(树形)很多开发者都认为Redis 不可能比Memcached 快,Memcached 完全基于内存,而Redis也不可能比Memcached 本是Redis 占绝对优势。一直在

3、思考这个原因,目前想到的原因有这几方面。很多开发者都认为Redis 不可能比Memcached 快,Memcached 完全基于内存,而Redis也不可能比Memcached 本是Redis 占绝对优势。一直在思考这个原因,目前想到的原因有这几方面。Libevent。和 Memcached 不同,Redis 并没有选择libevent。Libevent 为了迎合通用性造目前Redis 代码还不到libevent 1/3)用libevent中两个文件修改实现了自己的epollevent使用另外一个使用另外一个libevent 高性能替代libev,但是作者还是坚持Redis 应该小巧并去依赖的思

4、路。一个印象深刻的细节是编译Redis 之前并不需要执行./configure。CASCASMemcachedCAS实现需要为每个cachekey设置一个隐藏的casvalue版本号,每次settokenCPU 10G+ cache以及 QPS 上万之后这些开销就会给双方相对带来一些细微性能差别(5)。Redis 的存放数据必须比物理内存小RedisRedis 100 Redis 100万用户。但是业务实际情况是 100 万用户只有 5 万活跃用户,1 周来访问过 1 次的也只有15100万用户的数据都放在内存有不合理之处RAM需要为冷数据买单。这跟操作系统非常相似,操作系统所有应用访问的数据

5、都在内存,但是如果物理内存容纳不(Virtual 的概念。Redis 2.0也增加了VMRedis数据容量突破了物理内存的限制。并实现了数据冷热分离。Redis VM 实现是重复造轮子Redis Redis 的VM 依照之前的epoll 实现思路依旧是自己实现。但是在前面操作系统的介绍提到OS 只需要OS (3)”的Varnish 就是这样实现,也取得了非常成功的效果。antirez 在解释为什么要自己实现VM (6)OS VM 换入换出是基于Page概念,比如OSVM1Page4K,4K1个字节被访问,这个页也不会被SWAP, 换入也同样道理,读到一个字节可能会换入4K 存。而存。而Redi

6、s 自己实现则可以达到控制换入的粒度。另外访问操作系统SWAP 内存区域时block 进程,也是导致Redis 要自己实现VM 原因之一。get/setRedis作为一个作为一个key value set/get 方式来使用是最优化的使用方法。尤其在未启用VM 情况下,Redis 全部数据需要放入内存,节约内存尤其重要。假如一个key-value 单元需要最小占用 512 字节,即使只存一个字节也占了512 字节。这时候就有一个设计模式,可以把key 复用,几个key-value 放入一个key 中,value 再作为一个 set 存入,这样同样 512 字节就会存放 10-100 倍的容量。

7、这就是为了节约内存,建议使用hashset 而不是set/get 的方式来使用Redisaof snapshotRedisRedis 有两种存储方式,默认是snapshot (snapshot)crash aofaof即appendonlyaof 是Redis 是一个内存数据结构模型,所有的优势都是建立在对内存复杂数据结构高效的原子操作上,这样就看出aof 是一个非常不协调的部分。aof目的主要是数据可靠性及高可用性,在Redis中有另外一种方法来达到目的:ReplicationRedis 高可用。9Redis 是否支持集群支持redis 主从复制配置和使用都非常简单。通过主从复制可以允许多个

8、 slave server 拥有和 master server 相同的数据库副本。下面是关于redis 主从复制的一些特点masterslaveslavemaster外,slaveslave形成图状结构masterslave master 进行初次同步数据 client slave 在初次同步数据时则会阻塞不能client的请求。,我们可以用多个slave 专门用于client的读请求,比如 sort 操作可以使用 slave 来处理。也可以用来做简单的数据冗余mastermaster save配置, slave上配置数据持久化。下面介绍下主从复制的过程slave master sync 命令

9、。无master 就发送文件给 slave,slave 将文件保存到磁盘上,然后加载到内存slave master master 收到的写命令都会通过开始建立的连接发送给master slave 的同步数据的命令和从 client 发送的命令使用相同的协议格式。当master slave 的连接断开时 slave 可以自动重新建立连接。如果 master 同时收到多个 slave 发来的同步连接命令,只会使用启动一个进程来写数据库镜像,然后发送给所有slave。在多台服务器上简单实现 Redis 在多台服务器上简单实现 Redis 的数据主从复制Redis master 可以拥有多个 ,而一个

10、 slave 又可以拥有多个 多台服务器上进行 Redis Windows 操(局域网x(局域网,在redis,Windowscygwin工具进行安装,命令为:view sourceprint?1 $ tarxzf redis-2.2.2.tar.gz2 $cdredis-2.2.23 $make可以通过可以通过make test”命令判断是否安装成功。这里我使用1个r以及2个r在se在下,一个e在x下,基本流程是:. 在s服务器上创建两个目录1用来存放服务,Demo2 Slave 服务,在 Master 服务中的配置文件修改:view sourceprint?1 bind 2在 在 Slav

11、e 服务中的配置文件修改:view sourceprint?1port 6381(服务端口号要分开)2 bind23slaveof 2 6379 (masterHostPort)2. 2. 在 Linux 服务器上创建一个目录,Demo,Demo 存放 Slave 服务,在服务中的配置文件修改:view sourceprint?这样就完成了所有的配置。3这样就完成了所有的配置。3. 3 个服务,通过命令:view sourceprint?1 ./redis-server redis.conf1 bind02slaveof 2 6379(masterHostPort)来启动 redis 服务。注

12、意到,当我启动 master,然后启动一个 slave 的时候,可以发现 slave 上:会发送一个 SYNC 请求,从 Master 上面进行相应,而且它支持自动重连,即当 master掉线的情况下,它会处于等待请求的状态。而 Master 上:Slave Slave Master 的时候, 都会去持久化磁盘。4. 现在开始写一个客户端程序,使用到ServiceStack.Redis.dll的.NET 组件:view sourceprint?01 usingServiceStack.Redis;0203 staticvoidMain(string args)04 05IRedisClient

13、Factory factory = newRedisCacheClientFactory();运行结果:数据 运行结果:数据 Set 的时候,数据保存在内存中,当调用Save 方法时候,将数据保存在磁盘中。其中你会发现在3r的文件都同步到中去了。IRedisClient client = factory.CreateRedisClient(2,066379);0708client.Set(username, leepy);0910stringusername = client.Get(username);1112client.Save();1314Console.WriteLine(usern

14、ame: 0, username);1516Console.ReadLine();17UE UE 编辑器打开文件查看:从 Redis 源码中,可以发现rdb 文件采用的是 lzf 压缩算法进行实现,默认lzf 压缩算法是开启的。一、下载安装一、下载安装Wget HYPERLINK /files/redis-2.2.7.tar.gz /files/redis-2.2.7.tar.gzRedis 代码二、.安装部署Redis 代码tar zxvfredis-2.2.7.tar.gzcd redis-2.2.7.tar.gzmakeRedis 代码redis.conf 复制到 /etc/下Redis

15、 代码cp redis.conf /etc/cp src/redis-serversrc/redis-cli src/redis-benchmark al/redisRedis 代码启动 redisRedis 代码1. /usr/local/redis/redis-server redis.confPort Port 默认端口是 6379简单的测试:简单的测试:存值:存值:./redis-cli set hxaaa./redis-cli set hxaaa取值:取值:./redis-cli get hx./redis-cli get hx要配置参数的意义:要配置参数的意义:daemonized

16、aemon 方式运行pidfile:pid 文件位置port: 监 听 的 端 口 号 timeout:请求超时时间loglevel:log 信息级别logfile:log 文件位置databases:开启数据库的数量save * *:保存快照的频率,第一个*表示多长时间,第三个*表示执行多少次写操作。在一定时间内执行一定数量的写操作时,自动保存快照。可设置多个条件。rdbcompression: 是 否 使 用 压 缩 dbfilename:数据快照文件名(只是文件名,不包括目录) dir:数据快照的保存目录(这个是目录)appendonly:是否开启appendonlylog,开启的话每次

17、写操作会记一条log,这会提高数据抗风险能力,但影响效率。appendfsyncappendfsync:appendonlylog 如何同步到磁盘(fsync、fsyncfsync 等待系统自己同步)Redis 命令总结Redis(command)对数据库和各种数据类型进行操作,这些commandLinuxRedisJavasaddSADDRedis连接操作相关的命令quit:关闭连接auth:简单密码认证value 操作的命令exists(key):确认一个 key 是否存在del(key): 删 除 一 个 key type(key): 返 回 值 的 类 型 patternrandomk

18、ey:随机返回keykeykeyoldnamenewname,newnamenewnamekeydbsize:返回当前数据库中key 的数目expire:设定一个key 的活动时间(s) ttl:获得一个 key 的活动时间select(index):按索引查询move(key, dbindex):将当前数据库中的 key 转移到有 dbindex 索引的数据库flushdb:flushall:删除所有数据库中的所有keyString 操作的命令set(key, keystringvalue get(key)keystringvalue getset(key, keystringmget(ke

19、y1,key2,keykey2)的valuesetnx(key, keystring,则向库中添加string,名称为 key,值为 valuesetex(keyvalue) timemset(key1,value1,key2,value2,keyN,valuestringkey istringvalue imsetnx(key1, value1, key2, value2,key N, value:如果所有名keyistringkeyiiincr(key)keystring1incrby(key,keystringinteger decr(key)keystring1decrby(key,

20、key 的 string 减 少 integer append(key, key 的 string 的 值 附 加 value substr(key, start, keystringvalueList 操作的命令rpush(key, keylistvaluekeylistvaluellen(key)keylistlrange(key, start, keyliststartend的元素(0)ltrim(key, start, ekeylist,startend间的元素lindex(key, keylistindexindex, keylistindex值为 valuelrem(key,cou

21、nt,countkeylistcountvaluevalue,count0|count|valuelpop(key)keylistrpop(key)keylistblpop(key1, key2, key N, block0keyilistlisttimeoutkey i+1listpopbrpop(key1, key2, key N, block命令。rpoplpush(srckey,dstke)srckeylistdstkeylistSet 操作的命令sadd(key, keysetmembersrem(key, keysetspop(key:随机返回并删除名称为keysetsmove(s

22、rckey, dstkey, membe) :将membersrckeydstkeyscard(key) :返回名称为keysetsismember(key, memberkeysetsinter(key1, key2,key ) :求交集sinterstore(dstkey, key1, key2,keydstkey 的集合sunion(key1,key2,key) :求并集N:求交集并将交集保存到sunionstore(dskey,key1,key2,key) :求并集并将并集保存到dstkey 的集合sdiff(key1,key2,key) :求差集sdiffstore(dstkey,

23、key1, key2,keydstkey 的集合N:求差集并将差集保存到smembers(keykeysetkeysetzset(sorted set)操作的命令zadd(key,score,membe)keyzsetmember,score 用于排序。如果该元素已经存在,则根据 score 更新该元素的顺序。zrem(key, keyzsetmember zincrby(key, increment, membe) :如果在名称为keyzset存在元素memberscoreincrement其 score 的值为 incrementzrank(key,keyzset(scorememberr

24、ank(index,0),member返回“nil”zrevrank(key,:返回名称为keyzset(score到小排序member0member返回“nil”zrange(key, start, keyzset(score小到大排序)indexstartendzrevrange(key, start, keyzset(score从大到小排序)indexstartendzrangebyscore(key,min,keyzsetscoremin且 score = max 的所有元素zcard(key)keyzsetzscore(key,keyzsetelementzremrangebyran

25、k(key,min,keyzsetrank且 rank = max 的所有元素zremrangebyscore(key,min,:删除名称为keyzsetscoreminscore = maxzunionstore / zinterstore(dstkeyN, WEIGHTS w1,wN, AGGREGATE SUM|MIN|MAX)Nzsetscore,AGGREGATEWEIGHTWEIGHT,1AGGREGATE SUM,即结果集合中元素的scoreSUMMAXscoreHash 操作的命令hset(key, field, keyhashfieldvaluehget(key, keyha

26、shfieldvaluehmget(key,field1,field)keyhashfield i对应的 valuehmset(key,field1,valueN):向名称为keyhash中添加元素 field ivalue ihincrby(key,field,intege)keyhashfieldvalue增加 integerhexists(key, keyhashfieldhdel(key, keyhashfieldkey 的 hash 中元素个数hkeys(key):返回名称为 key 的 hash 中所有键hvals(key):返回名称为 keyhashvaluehgetall(ke

27、y)keyhash(field)value持久化save:将数据同步保存到磁盘 bgsave:将数据异步保存到磁盘 lastsave:返回上次成功将数据保存到磁盘的Unixshundown:将数据同步保存到磁盘,然后关闭服务远程服务控制info:提供服务器的信息和统计monitor:实时转储收到的请求slaveof:改变复制策略设置config:在运行时配置Redis 服务器在 6 上安装了 redis 的 master在7上安装了slave 绑定了6redis 事务redis redis client 发起的事务中的命令可以连续的执行,而中间不会插入其他client redis client

28、 的请求的所以做到这点是很容易的。一般情况下redis client 发来的命令后会立即处理并返回处理结果,但是当一个client multi 命令有,这个连exec 会顺序的执行队列中的所有命令。并将所有命令的运行client.然后此连接就结束事务上下文。下面可以看一个例子redisredis multi OKredisincr a QUEUEDQUEUEDredis exec(integer)1(integer)1从这个例子我们可以看到incr a ,incr b 命令发出后并没执行而是被放到了队列中e xec 后俩个命令被连续的执行,最后返回的是两条命令执行后的结果redis multi

29、 OKredisredis multi OKredisincr a QUEUEDQUEUEDredis discard OKredis get a 1redis getb1incr a incr b discard 命令其实就是清空事务的命令队列并退出事务上下文。redis multi OKredis get a QUEUEDredis multi OKredis get a QUEUEDredis getb QUEUEDredis exec 1.12.1发现问题了吧。假如我们想用事务实现incr 操作怎么办?可以这样做吗?redisredis get a 1redis multi OKred

30、is set a 2 QUEUEDredis exec1. OKredis get a, 2get a set a 是没区别的。很明显由于get a set a (get )。很可能有两个client a 1 3. 但是很有可能两个c lient get a的访问进行任何的同步也就是说 redis 没提供任何的加锁机制来同步对a 的访问。redis watch a OKredis get a 1redis multi OKredis set a 2 QUEUEDredisredis watch a OKredis get a 1redis multi OKredis set a 2 QUEUE

31、Dredis exec1. OKredis get a, 2watch 命令会监视给定的key,当exec 时候如果监视的key 从调用watch 后发生过变化, watch key.key 加乐观锁了。注意watch key exec,discard,unwatch . redis 的事务实现是如此简单,当然会存在一些问题。第一个问题是redis 只能保证事务的redis set a 5 OKredis set a 5 OKredislpushb 5(integer) 1 redis set c 5 OKredis multi OKredisincr a QUEUEDQUEUEDredisi

32、ncr c QUEUEDredis exec(integer)6(error) ERR Operation against a key holding the wrong kind ofvalue(integer)6可以看到虽然 incr b 失败了,但是其他两个命令还是执行了。redis append-only file 方式持久化, redis write 务到磁盘。发生部分写入事务的情况下,redis redis-check-aof 工具进行修复,修复会删除部分写入的事务内容。修复完后就能够重新启动了。redis 的持久化redis 是一个支持持久化的内存数据库,也就是说redis 需要经常将内存中的数据同步到磁redis 支持两种持久化方式,一种是 快照)也是默认方Append-only aof)的方式。下面分别介绍Snapshotting,默认的文件名为 。可以通过配置设置自动做快照持久化的方式。我们可redis n 秒内如果超过m key save 900 1 #900 秒内如果超过 1 个 key 被修改,则发起快照保存save 300 10 #300 秒内容如超过 10

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论