银海软件Redis培训丁永华2014年5月目录Redis介绍Redis安装与配置Redis命令Redis数据类型Redis介绍Redis是RemoteDictionaryServer的缩写,是一个key-value存储系统Redis提供了一些丰富的数据结构,包括Strings,Lists,Hashes,Sets和OrderedSets以及Hashes.包括对这些数据结构的操作支持.Redis可以替代Memcached,并且解决了断电后数据完全丢失的问题.Redis官方网站:优点性能极高,redis能支持10万每秒的读写频率丰富的数据类型及对应的操作Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行,也即支持事务.丰富的特性,Redis还支持publish/subscribe,key过期等特性.windows下Redis安装服务器端运行程序redis-server.exe即可,默认端口6379.客户端运行程序redis-client连接服务器端,可查看服务器配置信息。linux下Redis安装下载#wget解压tarxfredis-tar.gz编译make安装makeinstalllinux下Redis配置配置通过修改文件redis.conf实现daemonizeyes日志等级loglevelwarning日志文件logfile/var/log/redis.log数据文件目录dir/var/db/redis内存设置maxmemory连接数设置maxclients端口portLinux下redis管理:启动#redis-server/etc/redis.conf关闭#redis-clishutdown关闭某个端口上的redis#redis-cli-pportshutdownRedis数据类型redis常用五种数据类型:String字符串Hash一个key,多个fieldList双向链表Set集合,元素不重复sortedset有序的集合Redis数据类型StringString常用命令:set,get,decr,incr,mget等.应用场景:String是最常用的一种数据类型,普通的key/value存储实现方式:String在redis内部存储默认就是一个字符串,被redisObject所引用,当遇到incr,decr等操作时会转成数值型进行计算,此时redisObject的encoding字段为int.Redis数据类型HashHash常用命令:hget,hset,hgetall等.应用场景:比如,我们存储供应商酒店价格的时候可以采取此结构,用酒店编码作为Key,RatePlan+RoomType作为Filed,价格信息作为Value实现方式:Hash对应Value内部实际就是一个HashMap,实际这里会有2种不同实现,这个Hash的成员比较少时Redis为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的HashMap结构,对应的valueredisObject的encoding为zipmap,当成员数量增大时会自动转成真正的HashMap,此时encoding为ht.Redis数据类型ListList常用命令:lpush,rpush,lpop,rpop,lrang等.应用场景:Redislist应用场景非常多,也是Redis最重要的数据结构之一,比如twitter的关注列表,粉丝列表等都可以用Redis的list结构来实现.实现方式:Redislist的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,Redis内部的很多实现,包括发送缓冲队列等也都是用的这个数据结构.Redis数据类型SetSet常用命令:sadd,spop,smembers,sunion等.应用场景:Set对外提供的功能与list类似,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的接口,这个也是list所不能提供的.实现方式:Set的内部实现是一个value永远为null的HashMap,实际就是通过计算hash的方式来快速排除重复的,这也是set能提供判断一个成员是否在集合内的原因.Redis数据类型SortedsetSortedset常用命令:zadd,zrange,zrem,zcard等.使用场景:Sortedset的使用场景与set类似,区别是set不是自动有序的,而sortedset可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序.当你需要一个有序的并且不重复的集合列表,那么可以选择sortedset数据结构.实现方式:Sortedset的内部使用HashMap和跳跃表(SkipList)来保证数据的存储和有序,HashMap里放的是成员到score的映射,而跳跃表里存放的是所有的成员,排序依据是HashMap里存的score,使用跳跃表的结构可以获得比较高的查找效率.Redis数据过期设置Redis可以按key设置过期时间,过期后将被自动删除,这个特性让Redis很适合用来存储酒店动态流量和价格信息.用TTL命令可以获取某个key值的过期时间,-1表示不会过期.Expirekey15Redis事务支持Redis目前对事务支持还比较简单,也即支持一些简单的组合型的命令,只能保证一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client的命令.由于Redis是单线程来处理所有client的请求的所以做到这点是很容易的.一般情况下redis在接受到一个client发来的命令后会立即处理并返回处理结果,但是当一个client在一个连接中发出multi命令后,这个连接会进入一个事务上下文,该连接后续的命令并不是立即执行,而是先放到一个队列中。当从此连接受到exec命令后,redis会顺序的执行队列中的所有命令。并将所有命令的运行结果打包到一起返回给client.然后此连接就结束事务上下文。下面可以看一个例子:127.0.0.1:6379multiOK127.0.0.1:6379incraQUEUED127.0.0.1:6379incrbQUEUED127.0.0.1:6379exec1)(integer)12)(integer)1Redis事务支持discard命令来取消一个事务,discard命令其实就是清空事务的命令队列并退出事务上下文。例子:multiIncraIncrbDiscardRedis使用乐观锁来实现了CAS(checkandset)操作,在redis2.1后添加了watch命令,可以用来实现Redis事务中的CAS操作watch监视指定的key,这个key可以有多个。当被watched的key在事务exec前至少有一个发生改变,那么整个事务将跳出,exec命令返回(nil)。演示事务的执行过程中,如果redis意外的挂了,这时候事务可能只被执行了一半,可以用redischeck-aof工具进行修复.Redis数据存储数据快照数据快照的原理是将整个redis内存中存的所有数据遍历一遍存到一个扩展名为rdb的数据文件中.通过SAVE命令可以调用这个过程.数据快照配置save9001save30010save6010000以上在redis.conf中的配置指出在多长时间内,有多少次更新操作,就将数据同步到数据文件,这个可以多个条件配合.上面的含义是900秒后有一个key发生改变就执行save,300秒后有10个key发生改变执行save,60秒有10000个key发生改变执行saveRedisAOF数据快照的缺点是持久化之后如果出现crash则会丢失一段数据,因此作者增加了另外一种追加式的操作日志记录,叫appendonlyfile,其日志文件以aof结尾,我们一般称为aof文件.要开启aof日志的记录,需要在配置文件中进行如下设置:appendonlyyesappendonly配置如果不开启,可能会在断电时导致一段时间内的数据丢失.因为redis本身同步数据文件是按save条件来同步的,所以有的数据会在一段时间内只存在于内存中.appendfsyncno/always/everysec1.no:表示等操作系统进行数据缓存同步到磁盘.性能最好,持久化没保证。2.always:每次收到写命令就立即强制写入磁盘,最慢的,但是保证完全的持久化,不推荐使用3.everysec:表示每秒同步一次.一般用everysec.在性能和持久化方面做了很好的折中(推荐)Redis数据恢复当Redis服务器挂掉时,重启时将按以下优先级恢复数据到内存中:1.如果只配置了AOF,重启时加载AOF文件恢复数据.2.如果同时配置了RBD和AOF,启动时只加载AOF文件恢复数据.3.如果只配置了RDB,启动时将加载dump文件恢复数据.Redis主从复制Master配置:MasterIP:192.168.1.129MasterRedisServerPort:6379Slave配置在slave服务器的redis.conf加入:slaveof192.168.1.1796379启动master和slave,然后写入数据到master,读取slave,可以看到数据被复制到slave了.用途:读写分离,数据备份,灾难恢复等Redis主从复制Redis主从复制过程配置好slave后,slave与master建立连接,然后发送sync命令.无论是第一次连接还是重新连接,master都会启动一个后台进程,将数据库快照保存到文件中,同时master主进程会开始收集新的写命令并缓存.后台进程完成写文件后,master就发送文件给slave,slave将文件保存到硬盘上,再加载到内存中,接着master就会把缓存的命令转发给slave,后续master将收到的写命令发送给slave.如果master同时收到多个slave发来的同步连接命令,master只会启动一个进程来写数据库镜像,然后发送给所有的slave.Redis主从复制Redis主从复制特点:1.master可以拥有多个slave.2.多个slave可以连接同一个master外,还可以连接到其他slave.3.主从复制不会阻塞master,在同步数据时,master可以继续处理client请求.4.可以在master禁用数据持久化,注释掉master配置文件中的所有save配置,只需在slave上配置数据持久化.5.提高系统的伸缩性.Redis客户端客户端列表:Java客户端推荐Jedis:最简单的使用方式:工程中引入jedis-2.1.0.jarJedisjedis=newJedis(localhost);jedis.set(foo,bar);Stringvalue=jedis.get(foo);redis常用命令—stringEXISTS:判断一个键是否存在;存在返回1;否则返回0;DEL:删除某个key,或是一系列key;DELkey1key2TYPE:返回某个key元素的数据类型(none:不存在,string:字符,list,set,zset,hash)KEYS:返回匹配的key列表(KEYSfoo*:查找foo开头的keys)RANDOMKEY:随机获得已经存在的keyRENAME:更改key的名字,如果名字存在则更改失败DBSIZE:返回当前数据库的key的总数EXPIR