redis简介

原文地址:http://xmong.iteye.com/blog/1840242


目录 

1 REDIS 1 
1.1 REDIS简介 1 
1.2 REDIS特点 1 
2 REDIS安装 2 
2.1 安装REDIS 2 
2.2 配置REDIS 2 
2.3 启动REDIS 3 
2.4 访问REDIS 4 
2.5 关闭REDIS 4 
3 REDIS的REPLICATION 5 
4 REDIS适用场景 6 

1 Redis  
1.1 Redis简介  
  redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。 
  Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Java,Python,Ruby,Erlang,PHP客户端,使用很方便。 

  Redis的java客户端Jedis使用: http://xmong.iteye.com/blog/1841444  

1.2 Redis特性  
1、数据类型 
  作为Key-value型数据库,Redis也提供了键(Key)和键值(Value)的映射关系。但是,除了常规的数值或字符串,Redis的键值还可以是以下形式之一: 
  ●Lists (列表) 
  ●Sets (集合) 
  ●Sorted sets (有序集合) 
  ●Hashes (哈希表) 
  键值的数据类型决定了该键值支持的操作。Redis支持诸如列表、集合或有序集合的交集、并集、查集等高级原子操作;同时,如果键值的类型是普通数字,Redis则提供自增等原子操作。 
2、持久化 
  通常,Redis将数据存储于内存中,或被配置为使用虚拟内存。通过两种方式可以实现数据持久化:使用截图的方式,将内存中的数据不断写入磁盘;或使用类似MySQL的日志方式,记录每次更新的日志。前者性能较高,但是可能会引起一定程度的数据丢失;后者相反。 
3、主从同步 
  Redis支持将数据同步到多台从库上,这种特性对提高读取性能非常有益。 
4、性能 
  相比需要依赖磁盘记录每个更新的数据库,基于内存的特性无疑给Redis带来了非常优秀的性能。读写操作之间有显著的性能差异。 
5、提供多语言支持 
Java,C/C++,C#,Php,Javascript,perl,Python,Objective-c等。 

2 Redis安装  
2.1 安装Redis  
Java代码   收藏代码
  1. #使用wget命令将Redis安装包下载到当前目录下。当然可以通过其它工具(如浏览器)下载安装包。  
  2. $wget http://redis.googlecode.com/files/redis-2.6.12.tar.gz  
  3.   
  4. #解压安装包  
  5. $tar xzf redis-2.6.12.tar.gz   
  6.   
  7. #进入安装目录  
  8. $cd redis-2.6.12  
  9.   
  10. #编译安装包  
  11. $make  


(1) 使用make编译,此方式安装的Redis会在src目录下生成几个可执行文件,其中几个如: 
redis-server:Redis服务器的daemon启动程序 
redis-cli:Redis命令行操作工具。当然,你也可以用telnet根据其纯文本协议来操作 
redis-benchmark:Redis性能测试工具,测试Redis在你的系统及你的配置下的读写性能 
Redis-sentinel:Redis实例的监控管理、通知和实例失效备援服务,是Redis集群的管理工具,这是新加的一个工具功能。 

(2) 使用make install,使用此方式会把可执行文件放在/usr/local/bin目录下。 
(3) 使用make prefix=../install/redis,则可以将执行文件生成到指定的目录中。 

2.2 配置Redis  
在/home/xmong/redis/redis-2.6.12目录下有一个redis.conf文件,修改redis.conf文件,完成自己想要的配置。 
下面是一些主要配置参数: 
Java代码   收藏代码
  1. •   daemonize:是否以后台daemon方式运行,默认为no  
  2. •   pidfile:pid文件位置,默认/var/run/redis.pid  
  3. •   port:监听的端口号,默认为6379  
  4. •   timeout:请求超时时间,默认为0  
  5. •   loglevel:log信息级别,默认为notice  
  6. •   logfile:log文件位置,默认stdout  
  7. •   databases:开启数据库的数量,默认为16  
  8. •   save * *:保存快照的频率,第一个*表示多长时间,第三个*表示执行多少次写操作。在一定时间内执行一定数量的写操作时,自动保存快照。可设置多个条件。  
  9. •   rdbcompression:是否使用压缩,默认为yes  
  10. •   dbfilename:数据快照文件名(只是文件名,不包括目录),默认为当前目录dump.rdb  
  11. •   dir:数据快照的保存目录(这个是目录)  
  12. •   appendonly:是否开启appendonlylog,开启的话每次写操作会记一条log,这会提高数据抗风险能力,但影响效率。默认为no  
  13. •   appendfsync:appendonlylog如何同步到磁盘(三个选项,分别是每次写都强制调用fsync、每秒启用一次fsync、不调用fsync等待系统自己同步),默认是everysec  
  14. •   slaveof <masterip> <masterport> :主从配置,在redis-slave上配置master的ip port,即可。  


2.3 启动Redis  
Java代码   收藏代码
  1. #通过help查看启动命令使用  
  2. $src/redis-server  --help  
  3. Usage: ./redis-server [/path/to/redis.conf] [options]  
  4.        ./redis-server - (read config from stdin)  
  5.        ./redis-server -v or --version  
  6.        ./redis-server -h or --help  
  7.        ./redis-server --test-memory <megabytes>  
  8.   
  9. Examples:  
  10.        ./redis-server (run the server with default conf)  
  11.        ./redis-server /etc/redis/6379.conf  
  12.        ./redis-server --port 7777  
  13.        ./redis-server --port 7777 --slaveof 127.0.0.1 8888  
  14.        ./redis-server /etc/myredis.conf --loglevel verbose  
  15.   
  16. Sentinel mode:  
  17.        ./redis-server /etc/sentinel.conf –sentinel  
  18.   
  19. #指定配置文件启动redis  
  20. $ src/redis-server ./redis.conf  


2.4 访问Redis  
Redis服务启动后可以通过下面两种方法来访问redis服务。 
(1)通过telnet 
Java代码   收藏代码
  1. $telnet ip 6379  
  2. >set name xmong  
  3. +ok  
  4. >get name  
  5. xmong  
  6. >del name  
  7. :1  
  8. >exists name  
  9. :0  
  10. >quit  
  11. +ok  

(2)通过redis-cli 
Java代码   收藏代码
  1. $Redis-cli  
  2. >set name xmong  
  3. ok  
  4. >get name  
  5. “xmong”  
  6. >del name  
  7. (integer) 1  
  8. >quit  


2.5 关闭Redis  
Java代码   收藏代码
  1. $redis-cli shutdown  

如果redis-server启动的时候修改了默认的端口号,则关闭是需要指定关闭的端口号。 
Java代码   收藏代码
  1. $redis-cli –p 6380 shutdown  

Redis服务关闭后,缓存数据会自动dump到硬盘上,文件路径为配置文件redis.conf中的配置项dbfilename所设定路径的dump.rdb文件。 

3 Redis的Replication  
在redis中实现Replication可以通过Master-Slave模式配置来实现,只需要一个命令或修改一个配置项就可以搞定。 
Redis实现Master-Slave的一些特点: 
(1)、同一台Master可以同步多个Slaves,同样Slave也可以及时其它slaves的连接同步请求,这样可以有效分载Master的同步压力。 
(2)、Master-Slave是非阻塞方式的同步服务。所以在同步期间,客户端仍然可以提交请求。 
(3)、Master-Slave可以实现读写分离,Master提供写服务,Slaves提供读服务,提供redis的服务性能。 
Replication的工作原理: 在Slave启动并连接到Master之后,它将主动发送一个SYNC命令。此后Master将启动后台存盘进程,同时收集所有接收到的用于修改数据集的命令,在后台进程执行完毕后,Master将传送整个数据库文件到Slave,以完成一次完全同步。而Slave服务器在接收到数据库文件数据之后将其存盘并加载到内存中。此后,Master继续将所有已经收集到的修改命令,和新的修改命令依次传送给Slaves,Slave将在本次执行这些数据修改命令,从而达到最终的数据同步。 
如果Master和Slave之间的链接出现断连现象,Slave可以自动重连Master,但是在连接成功之后,一次完全同步将被自动执行。 

Master-Slave实现如下: 
(1)、通过命令 
启动好Master Server和Slave Server后,在Slave Server上执行命令: 
Java代码   收藏代码
  1. #打开Slave Server命令窗口  
  2. $redis-cli  
  3. #执行slaveof命令,指定Slave Server同步Master Server的IP和port端口号。  
  4. $slaveof MasterIp MasterPort  

这种方式只能保证在执行slaveof命令之后,Master-Slave配置成功,一旦Slave Server重启之后,他们之间的Replication关系就失效了。 

(2)、通过修改redis.conf配置文件 
Java代码   收藏代码
  1. #修改Slave的redis.conf配置文件  
  2. $vim redis.conf  
  3. #指定masterip 和masterport的值  
  4. slaveof <masterip> <masterport>  
  5. #保存退出  
  6. $wq  

通过指定配置文件先启动Master Server再启动Slave Server。 
通过这种方式实现Master-Slave可以长期保证两个服务器之间的Replication关系。 
测试: 
Java代码   收藏代码
  1. #启动Master Server  
  2. $redis-server ./redis.conf  
  3. #启动Slave Server  
  4. $redis-server ./redis.conf  
  5. #启动Master Server的命令器  
  6. $redis-cli  
  7. #向Master Server保存信息  
  8. $set name master  
  9. OK  
  10. #启动Slave Server的命令器  
  11. $redis-cli  
  12. #向Slave Server中查取信息  
  13. $get name  
  14. “master”  


通过上面的测试可以看做在Master Server中保存的值已经同步到Slave Server中。 


4 Redis适用场景
 
毫无疑问,Redis开创了一种新的数据存储思路,使用Redis,我们不用在面对功能单调的数据库时,把精力放在如何把大象放进冰箱这样的问题上,而是利用Redis灵活多变的数据结构和数据操作,为不同的大象构建不同的冰箱。希望你喜欢这个比喻。 

1.取最新N个数据的操作  
比如典型的取你网站的最新文章,通过下面方式,我们可以将最新的5000条评论的ID放在Redis的List集合中,并将超出集合部分从数据库获取 
• 使用LPUSH latest.comments<ID>命令,向list集合中插入数据 
• 插入完成后再用LTRIM latest.comments 0 5000命令使其永远只保存最近5000个ID 
• 然后我们在客户端获取某一页评论时可以用下面的逻辑(伪代码) 
Java代码   收藏代码
  1. •   FUNCTION get_latest_comments(start,num_items):  
  2. •       id_list = redis.lrange("latest.comments",start,start+num_items-1)  
  3. •       IF id_list.length < num_items  
  4. •           id_list = SQL_DB("SELECT ... ORDER BY time LIMIT ...")  
  5. •       END  
  6. •       RETURN id_list  
  7. •   END  

如果你还有不同的筛选维度,比如某个分类的最新N条,那么你可以再建一个按此分类的List,只存ID的话,Redis是非常高效的 

2.排行榜应用,取TOP N操作  
这个需求与上面需求的不同之处在于,前面操作以时间为权重,这个是以某个条件为权重,比如按顶的次数排序,这时候就需要我们的sorted set出马了,将你要排序的值设置成sortedset的score,将具体的数据设置成相应的value,每次只需要执行一条ZADD命令即可。 

3.需要精准设定过期时间的应用  
比如你可以把上面说到的sorted set的score值设置成过期时间的时间戳,那么就可以简单地通过过期时间排序,定时清除过期数据了,不仅是清除Redis中的过期数据,你完全可以把Redis里这个过期时间当成是对数据库中数据的索引,用Redis来找出哪些数据需要过期删除,然后再精准地从数据库中删除相应的记录。 

4.计数器应用  
Redis的命令都是原子性的,你可以轻松地利用INCR,DECR命令来构建计数器系统。 

5.Uniq操作,获取某段时间所有数据排重值  
这个使用Redis的set数据结构最合适了,只需要不断地将数据往set中扔就行了,set意为集合,所以会自动排重 

6.实时系统,反垃圾系统  
通过上面说到的set功能,你可以知道一个终端用户是否进行了某个操作,可以找到其操作的集合并进行分析统计对比等。没有做不到,只有想不到。 

7.Pub/Sub构建实时消息系统  
Redis的Pub/Sub系统可以构建实时的消息系统,比如很多用Pub/Sub构建的实时聊天系统的例子。 

8.构建队列系统  
使用list可以构建队列系统,使用sorted set甚至可以构建有优先级的队列系统。 

9.缓存  
这个不必说了,性能优于Memcached,数据结构更多样化。 


******************* 
参考: 
redis简介 
redis配置 
redis适用场景 

你可能感兴趣的:(redis简介)