一、常用命令
1、String类型
(1)setkeyvalue nx:如果key不存在则建立 xx:如果key存在则修改其值 (2)getkey:取值 (3)msetkey1value1key2value2一次设置多个值 (4)mgetkey1key2:一次获取多个值 (5)getrangekeystartstop:获取字符串中[start,stop]范围的值 对于字符串的下标,左数从0开始,右数从-1开始 注意:当start>length,则返回空字符串 当stop>=length,则截取至字符串尾 如果start所处位置在stop右边,则返回空字符串 (6)getsetkeynrevalue:获取并返回旧值,在设置新值 (7)incrkey:自增,返回新值, 如果incr一个不是int的value则返回错误, incr一个不存在的key,则设置key为1(8)incrbykey2:跳2自增 (9)strlenkey:取指定key的value值的长度 (10)setexkeytimevalue:设置key对应的值value,并设置有效期为time秒1234567891011121314151617181920212223242526272812345678910111213141516171819202122232425262728
2、List类型
(1)lpushkeyvalue:把值插入到链表头部 (2)rpushkeyvalue:把值插入到链表尾部 (3)lpopkey:返回并删除链表头部元素 (4)rpopkey:返回并删除链表尾部元素 (5)lrangekeystartstop:返回链表中[start,stop]中的元素 (6)lremkeycountvalue:从链表中删除value值,删除count的绝对值个value后结束count>0从表头删除count<0从表尾删除count=0全部删除 (7)ltrimkeystartstop:剪切key对应的链接,切[start,stop]一段并把改制重新赋给key(8)lindexkeyindex:返回index索引上的值 (9)llenkey:计算链表的元素个数 (10)linsertkeyafter|beforesearchvalue:在key链表中寻找search,并在search值之前|之后插入value(11)rpoplpushsourcedest:把source的末尾拿出,放到dest头部,并返回单元值1234567891011121314151617181920212223242512345678910111213141516171819202122232425
3、Hash类型
(1)hsetmyhashfieldvalue:设置myhash的field为value (2)hsetnxmyhashfieldvalue:不存在的情况下设置myhash的field为value (3)hmsetmyhashfield1value1field2value2:同时设置多个field (4)hgetmyhashfield:获取指定的hashfield (5)hmgetmyhashfield1field2:一次获取多个field (6)hincrbymyhashfield5:指定的hashfield加上给定的值 (7)hexistsmyhashfield:测试指定的field是否存在 (8)hlenmyhash:返回hash的field数量 (9)hdelmyhashfield:删除指定的field (10)hkeysmyhash:返回hash所有的field (11)hvalsmyhash:返回hash所有的value (12)hgetallmyhash:获取某个hash中全部的field及value123456789101112131415161718192021222324123456789101112131415161718192021222324
4、Set类型
(1)saddkeyvalue1value2:往集合里面添加元素 (2)smemberskey:获取集合所有的元素 (3)sremkeyvalue:删除集合某个元素 (4)spopkey:返回并删除集合中1个随机元素(可以坐抽奖,不会重复抽到某人) (5)srandmemberkey:随机取一个元素 (6)sismemberkeyvalue:判断集合是否有某个值 (7)scardkey:返回集合元素的个数 (8)smovesourcedestvalue:把source的value移动到dest集合中 (9)sinterkey1key2key3:求key1key2key3的交集 (10)sunionkey1key2:求key1key2的并集 (11)sdiffkey1key2:求key1key2的差集 (12)sinterstorereskey1key2:求key1key2的交集并存在res里 123456789101112131415161718192021222324123456789101112131415161718192021222324
5、Zset类型
(1)zaddkeyscore1value1:添加元素 (2)zrangekeystartstop[withscore]:把集合排序后,返回名次[start,stop]的元素 默认是升续排列 withscores是把score也打印出来 (3)zrankkeymember:查询member的排名(升序0名开始) (4)zrangebyscorekeyminmax[withscores]集合(升序)排序后取score在[min,max]内的元素 (5)zrevrankkeymember:查询member排名(降序0名开始) (6)zremrangebyscorekeyminmax:按照score来删除元素,删除score在[min,max]之间 (7)zremkeyvalue1value2:删除集合中的元素 (8)zremrangebyrankkeystartend:按排名删除元素,删除名次在[start,end]之间的 (9)zcardkey:返回集合元素的个数 (10)zcountkeyminmax:返回[min,max]区间内元素数量1234567891011121314151617181920212212345678910111213141516171819202122
二、高级特性
1、事务
redis通过 MULTI 、 DISCARD 、 EXEC 和 WATCH 四个命令来实现事务功能,对事务的支持目前还比较简单。redis只能保证一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client的命令。
由于redis是单线程来处理所有client的请求的所以做到这点是很容易的。一般情况下redis在接受到一个client发来的命令后会立即处理并 返回处理结果,但是当一个client在一个连接中发出multi命令有,这个连接会进入一个事务上下文,该连接后续的命令并不是立即执行,而是先放到一 个队列中。当从此连接受到exec命令后,redis会顺序的执行队列中的所有命令。并将所有命令的运行结果打包到一起返回给client.然后此连接就 结束事务上下文。
例子:
redis127.0.0.1:6379>multiOKredis127.0.0.1:6379>incraQUEUEDredis127.0.0.1:6379>incrbQUEUEDredis127.0.0.1:6379>exec1.(integer)1 2.(integer)11234567891012345678910
2、持久化
redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到磁盘来保证持久化。redis支持两种持久化方式,一种是 Snapshotting(快照)也是默认方式,另一种是Append-only file(缩写aof)的方式。
快照Snapshotting
快照是默认的持久化方式。这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。可以通过配置设置自动做快照持久化的方式。我们可以配置redis在n秒内如果超过m个key被修改就自动做快照,下面是默认的快照保存配置:
save9001#900秒内如果超过1个key被修改,则发起快照保存save30010#300秒内容如超过10个key被修改,则发起快照保存save6010000123123
Append-only file(AOF)
aof 比快照方式有更好的持久化性,是由于在使用aof持久化方式时,redis会将每一个收到的写命令都通过write函数追加到文件中(默认是appendonly.aof)。
当redis重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。当然由于os会在内核中缓存 write做的修改,所以可能不是立即写到磁盘上。这样aof方式的持久化也还是有可能会丢失部分修改。不过我们可以通过配置文件告诉redis我们想要通过fsync函数强制os写入到磁盘的时机。
有三种方式如下
appendonlyyes#启用aof持久化方式#appendfsyncalways#每次收到写命令就立即强制写入磁盘,最慢的,但是保证完全的持久化,不推荐使用appendfsynceverysec#每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,推荐#appendfsyncno#完全依赖os,性能最好,持久化没保证1234512345
3、主从复制
redis支持主从复制,而且配置比较简单。主从复制实现了数据的备份,冗余,以构建高可用的系统。当master不能正常工作时,可以把slave切换成master。
原理过程
在Slave启动并连接到Master之后,它将主动发送一个SYNC命令。此后Master将启动后台存盘进程,同时收集所有接收到的用于修改数据集的命令,在后台进程执行完毕后,Master将传送整个数据库文件到Slave,以完成一次完全同步。而Slave服务器在接收到数据库文件数据之后将其存盘并加载到内存中。此后,Master继续将所有已经收集到的修改命令,和新的修改命令依次传送给Slaves,Slave将在本次执行这些数据修改命令,从而达到最终的数据同步。
图片描述" src="http://img.jb51.cc/vcimg/static/loading.png" src="http://img.blog.csdn.net/20160427120126094">
4、发布订阅
发布订阅(pub/sub)是一种消息通信模式,主要的目的是解耦消息发布者和消息订阅者之间的耦合,这点和设计模式中的观察者模式比较相似。
pub /sub不仅仅解决发布者和订阅者直接代码级别耦合也解决两者在物理部署上的耦合。
redis作为一个pub/sub server,在订阅者和发布者之间起到了消息路由的功能。订阅者可以通过subscribe和psubscribe命令向redis server订阅自己感兴趣的消息类型,redis将消息类型称为通道(channel)。当发布者通过publish命令向redis server发送特定类型的消息时。订阅该消息类型的全部client都会收到此消息。这里消息的传递是多对多的。一个client可以订阅多个 channel,也可以向多个channel发送消息。
下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 ―― client2 、 client5 和 client1 之间的关系:
图片描述" src="http://img.jb51.cc/vcimg/static/loading.png" src="http://img.blog.csdn.net/20160427122512654">
当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端:
图片描述" src="http://img.jb51.cc/vcimg/static/loading.png" src="http://img.blog.csdn.net/20160427122523310">
总结:
从redis的介绍到简单的操作命令,然后又了解了它的事务,持久化,主从复制等特性,希望在以后的项目中使用的时候会得心应手,至于redis其他的特性,如虚拟内存等,我们可以以后一点点深入。而且在实际应用过程中还会出现各种各样的问题,到时候再逐个解决。