Redis是一款开源的,高性能的键值存储。它常被称为是一款数据结构服务器。Redis的键值可以包含字符串,哈希,列表,集合和有序集合等数据类型。对于这些数据类型,你可以执行原子操作.
为了获得优异的性能,redis采用了内存中(in memory)数据集的方式。同时redis支持数据的持久化,可以每隔一段时间将数据转存到磁盘上(snapshot),也可以在日志尾部追加每一条操作命令(append only file, aof)
redis支持主从复制(master-slave replication),并且具有非常快速的非阻塞首次同步,网络断开自动重连等功能。
redis支持的数据类型
测试指定的key是否存在,返回1表示存在,0表示不存在
删除指定的key,返回删除key的数目,0表示给定eky都不存在
返回指定key的value类型。返回none表示不存在。
返回匹配指定模式的所有key(支持*,?,[abc]的方式)
返回当前数据库中随机选择的一个key,如果当前数据库是空的,返回空串
原子的重命名一个key,如果newkey存在,将会被覆盖,返回1表示成功,0表示失败。失败可能是oldkey不存在或者和newkey相同
同上,但是如果newkey存在则返回失败
返回当前数据库的key的数量
为指定的key设置过期时间,单位是秒。返回1表示成功,0表示key已经设置过期时间或者不存在。
返回设置了过期时间的key的剩余过期秒数。-1表示key不存在或者没有设置过期时间
通过索引选择数据库,默认连接的是数据库是0。默认数据库数是16.返回1表示成功,0表示失败
将key从当前数据库移动到指定数据库。返回1表示成功,0表示key不存在或者已经在指定的数据库中
删除当前数据库中所有key,此方法不会失败(慎用)
删除所有数据库中的所有的key,此方法不会失败(慎用)
string是redis最基本的数据类型,而且string类型是二进制安全的
redis的string可以包含任何数据,包括jpg图片或者序列化对象
最大上限是1G字节
如果只用string类型,redis就可以被看作是特性的memcached
设置key的值,成功返回1,失败返回0
同上,如果key已经存在,返回0。nx表示not exist的意思
获取key的值,如果key不存在则返回nil
设置key的值,并返回key的旧值。如果key不存在,则返回nil
一次获取多个key的值,如果对应的key不存在,则对应返回nil
一次设置多个key的值,成功返回1,表示所有的值都设置了,失败返回0,表示任何值都没有被设置
同上,但是不会覆盖已经存在的key
对key的值做加加操作,并返回新的值。incr一个不是int的value会返回错误,incr一个不存在的key,则设置key为1
做减减操作。decr一个不存在的key,则设置key的值为-1
加指定值
减去指定值
给指定key的字符串追加value,返回新字符串值得长度
返回截取过的key的字符串,并不修改key的值。下表是从0开始的。
redis的list类型其实就是一个每个子元素都是string类型的双向链表。我们可以通过push,pop操作从链表的头部或者尾部添加删除元素。这使得list既可以用作栈,又可以用作队列list的pop操作还有阻塞版本。当我们使用[lr]pop一个list对象的时候,如果list为空,或者list不存在,会立即返回nil。但是如果使用b[lr]pop可以阻塞,也可以设置超时时间,超过超时时间返回nil。阻塞版本的pop主要是为了避免轮训。
在key对应list的头部添加字符串元素,成功返回1,失败返回0,表示key存在且不是list类型
同上,在尾部添加
返回key对应list的长度,key不存在返回0,如果key对应类型不是list返回错误
返回指定区间内的元素,下标从0开始,负值表示从后面计算,-1表示倒数第一个元素,key不存在返回空列表
截取list,保留指定区间内的元素,成功返回1,key不存在返回错误
设置list中指定下标的元素值,成功返回1,key或者下标不存在返回错误
从key对应的list中删除count个和value相同的元素。count为0的时候删除全部
从list的头部删除数据,并返回删除的数据。如果key对应的list不存在或者是空返回nil,如果key对应值不是list,返回错误
同上,从尾部删除
从左到右扫描返回对第一个非空list进行lpop操作并返回。比如blpop list1 list2 list3 0 ,如果list不存在,list2,list3都是非空则对list2做lpop并返回从list2中删除的元素。如果所有的list都是空或不存在,则会阻塞timeout秒,timeout为0表示一直阻塞。当阻塞时,如果有client对key1…keyN中的任意key进行push操作,则第一在这个key上被阻塞的client会立即返回。如果超时发生,则返回nil。
同blpop,从尾部删除
从srckey对应的list的尾部移除元素并添加到destkey对应list的头部,最后返回被移除的元素值,整个操作是原子操作的。如果srckey是空或者不存在返回nil
redis的set是string类型的无序集合
set元素最大可以包含2的32次方-1个元素
set是通过hash table实现的,hash table会随着添加或者删除自动跳帧大小
关于set集合类型除了基本的添加操作删除,其他有用的操作还包含集合的取并集(union),交集(insertsection),差集(difference)。
添加一个string元素到key对应的set集合中,成功返回1
删除并返回key对应set中随机的一个元素,如果set是空,或者key不存在则返回nil
从srckey对应的set中移除member并添加到dstkey对应的set中,整个操作是原子的,成功返回1,如果member在srckey中不存在返回0,如果key不是set类型返回错误
返回set的元素的个数,如果set是空或者key不存在返回0
判断member是否在set中,存在返回1,不存在或者key不存在返回0
返回所有给定key的交集
同sinter,但是同时将交集存到dstkey下
返回所有给定key的并集
同sunion,并同时保存并集到dstkey下
返回所有给定key的差集
同sdiff,并同时保存差集到dstkey下
返回key对应set的所有不元素,结果是无序的
和set一样sorted set也是string类型元素的集合,不同的是每个元素都会关联一个double类型的score。sorted set的实现是skip list和hash table的混合体。当元素被添加到集合中时,一个元素到score的映射被添加到hash table中,另一个score到元素的映射被添加到skip list并按照score排序,所以就可以有序的获取集合中的元素
添加元素到集合,元素在集合中存在则更新对应score
删除指定元素,1表示成功,如果不存在返回0
增加对应的member的score值,然后移动元素并报出skip list有序,返回更新后的score值
返回指定元素在集合中的排名(下标,非score),结合中元素是按score从小到大排序的
同上,但是集合中元素是按score从大到小排序
类似zrange操作从集合中取指定区间的元素,返回的是有序的结果
同上,返回结果是按score倒序的
返回集合中score在给定区间的元素
返回集合中score在给定区域间的数量
返回集合中元素的个数
返回给定元素对应的score
删除集合中排名在给定区间的元素
删除集合中score在给定区间的元素
redis hash是一个string类型的field和value的映射表hash特别适合用于存储对象,相对于将对象的每个字段存在单个string类型。将一个对象存储在hash类型中会占用更少的内存,并且可以更方便的存取整个对象。
设置hash field为指定值,如果key不存在,则先创建
获取指定的hash field
同时设置hash的多个field
将指定的hash field加上给定值
测试指定field是否存在
删除指定的hash field
返回指定hash的field
返回hash的所有field
返回hash的所有value
返回hash的所有field和value
redis是一个支持持久化的数据库,也就是说redis需要经常将内存中的数据同步到磁盘来保证持久化。这是相对于memcache来说一个大的优势。redis支持两种持久化方式:
Snapshotting(快照)redis的默认持久化方式。这种方式将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。可以配置自动做快照持久化的方式。我们可以配置redis在n秒内如果超过m个key并修改就自动做快照。
save 900 1 #900秒内如果超过1个key被修改,则发起快照保存
save 300 10 #300秒内容如超过10个key被修改,则发起快照保存
save 60 10000
Append-only file(AOF)AOF快照方式有更好的持久化性,是由于在使用AOF持久化方式时,redis会将每个收到的写命令都通过write函数追加到文件中(默认是applendonly.aof)。当redis重启时,会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。当然由于os会在内核中缓存write做的修改。不过我们可以通过配置文件告诉redis我们想要通过fsync函数强制os写入到磁盘的实际。有三种方式:
appendonly yes // 启用AOF持久化方式
appendfsync always // 每次收到写命令就立即强制写入磁盘,最慢的,但是保证完全的持久化,不推荐使用
appendfsync eversec // 每秒强制写入磁盘一次,在性能和持久化方面做了很好的这种,推荐
appendfsync no // 完全依赖os,性能最好,持久化没有保证
主从复制允许多个slave server拥有和master server相同的数据库副本。
redis对事物的支持目前还比较简单。redis只能保证一个client发起的事物中的命令可以连续的执行,而中间不会插入其他client的命令
watch命令会监事给定的key,当exec时候如果监听的key从调用watch后发生过变化,则整个事物会失败。注意watch的key是对整个连接有效的,和事物一样,如果连接断开,监听和事物都会被自动清除
发布定于是一种消息通信模式。订阅者可以通过subscribe和psubscribe命令向redis server订阅自己甘心去的消息类型,redis将消息类型成为通道(channel)。当发布者通过publish命令向redis server发送特定类型的消息时。订阅该消息类型的全部client都会收到此消息。这里消息的传递是多对多的。一个client可以订阅多个channel,也可以向多个channel发送消息。