Redis 初识(一)

在此是对实验楼的练习笔记的整理。

Redis 是什么

Remote DIctionaryServer(Redis) 是一个由 Salvatore Sanfilippo 写的key-value存储系统。
Redis 提供了一些丰富的数据结构,包括 lists, sets, ordered sets 以及 hashes ,当然还有和 Memcached 一样的 strings 结构。Redis 当然还包括了对这些数据结构的丰富操作。

Redis 常被称作是一款数据结构服务器(data structure server)。Redis 的键值可以包括字符串(strings)类型,同时它还包括哈希(hashes)、列表(lists)、集合(sets)和 有序集合(sorted sets)等数据类型。 对于这些数据类型,可以执行原子操作。例如:对字符串进行附加操作(append);递增哈希中的值;向列表中增加元素;计算集合的交集、并集与差集等。

优点

性能极高 – Redis能支持超过 100K+ 每秒的读写频率。

丰富的数据类型 – Redis 支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。

原子 – Redis 的所有操作都是原子性的,同时 Redis 还支持对几个操作全并后的原子性执行。

丰富的特性 – Redis 还支持 publish/subscribe, 通知, key 过期等等特性。

安装参考链接: http://www.linuxidc.com/Linux/2014-05/101544p2.htm

Redis数据类型

Redis 不仅仅是简单的 key-value 存储器,同时也是一种 data structures server。传统的 key-value 是指支持使用一个 key 字符串来索引 value 字符串的存储,而 Redis 中, value 不仅仅支持字符串,还支持更多的复杂结构,包括列表,集合,哈希表等。
Redis keys 是采用二进制安全,这就意味着可以使用任何二进制序列作为重点,从像”foo”可以联系一个 JPEG 文件。空字符串也是一个有效的密钥。

Redis strings

Redis字符串是二进制安全的,这意味着一个 Redis 字符串能包含任意类型的数据,例如: 一张 JPEG 格式的图片或者一个序列化的 Ruby 对象。一个字符串类型的值最多能存储 512M 字节的内容。

数据类型

如上例所示,可以 SET 和 GET 命令来创建和检索 strings 。
注意 set 命令将取代现有的任何已经存在的 key 。
SET 命令还有一个提供附加参数的选项,能够让 SET 命令只有在没有相同 key 的情况下成功,反之亦然,可以让 SET 命令在有相同 key 值得情况下成功。

即使 string 是 Redis 的基本类型,也可以对其进行一些有趣的操作,例如加法器:

INCR 命令让 the value 成为一个整数,运行一次 INCR 便 +1 。INCRBY 命令便是一个加法运算。类似的命令如减法运算为: DECR and DECRBY。

Redis 可以运用 MSET and MGET 命令完成一次性的完成多个 key-value 的对应关系,使用 MGET 命令, Redis 返回一个 value 数组。

Redis Lists

Redis 列表是简单的字符串列表,按照插入顺序排序。可以添加一个元素导列表的头部(左边)或者尾部(右边) LPUSH 命令插入一个新的元素导头部, 而 RPUSH 插入一个新元素导尾部.当一个这两个操作在一个空的 Key 上被执行的时候一个新的列表被创建。相似的,如果一个列表操作清空一个列表那么对应的 key 将被从 key 空间删除。这是非常方便的语义,因为他们被调用使用一个空列表完全就像他们被调用时使用一个不存在的键值(可以)做为参数。

PUSH 一类的命令的返回值为 list 的长度。一些类表操作和结果的例子:

注意: LRANGE 利用了两个检索值, 0 表示 list 的开头第一个, -1 表示 list 的倒数第一个,即最后一个。 -2 则便是 list 的倒数第二个,以此类推。

这些命令都是可变的命令,也就是说你可以一次加入多个元素放入 list。

还有一类重要的操作: POP ,取出 list 元素。和 PUSH 操作类似, POP 命令可以选择不同的方向取出元素. POP 命令返回值为取出的元素。

在 Redis list 中还有很多有用的命令,更多内容可以查看官方文档。

Redis Hashes

Redis Hashes 是字符串字段和字符串值之间的映射,因此他们是展现对象的完美数据类型。
(例如:一个有名,姓,年龄等等属性的用户):一个带有一些字段的 hash 仅仅需要一块很小的空间存储,因此你可以存储数以百万计的对象在一个小的 Redis 实例中。
哈希主要用来表现对象,它们有能力存储很多对象,因此可以将哈希用于许多其他的任务。

HMSET 命令设置一个多域的 hash 表, HGET 命令获取指定的单域,HGETALL 命令获取指定 key 的所有信息。 HMGET 类似于 HGET ,只是返回一个 value 数组。

同样可以根据需要对 hash 表的表项进行单独的操作,例如 HINCRBY。

Redis 无序集合

Redis 集合(Set)是一个无序的字符串集合.
可以以O(1)的时间复杂度 (无论集合中有多少元素时间复杂度都是常量)完成添加,删除,以及测试元素是否存在。
Redis 集合拥有令人满意的不允许包含相同成员的属性。多次添加相同的元素,最终在集合里只会有一个元素。 实际上说这些就是意味着在添加元素的时候无须检测元素是否存在。 一个 Redis 集合的非常有趣的事情是他支持一些服务端的命令从现有的集合出发去进行集合运算,因此你可以在非常短的时间内进行合并(unions), 求交集(intersections),找出不同的元素(differences of sets)。

SADD 命令产生一个无序集合,返回集合的元素个数。SMEMBER 用于查看集合。

SISMEMBER 用于查看集合是否存在,匹配项包括集合名和元素个数。匹配成功返回 1,匹配失败返回 0。

Redis有序集合

Redis 有序集合与普通集合非常相似,是一个没有重复元素的字符串集合。
不同之处是有序集合的没有成员都关联了一个评分,这个评分被用来按照从最低分到最高分的方式排序集合中的成员。
集合的成员是唯一的,但是评分可以是重复了。 使用有序集合你可以以非常快的速度(O(log(N)))添加,删除和更新元素。因为元素是有序的, 所以也可以很快的根据评分(score)或者次序(position)来获取一个范围的元素。访问有序集合的中间元素也是非常快的,因此能够使用有序集合作为一个没有重复成员的智能列表。在有序集合中,可以很快捷的访问一切需要的东西:有序的元素,快速的存在性测试,快速访问集合的中间元素! 简而言之使用有序集合可以做完成许多对性能有极端要求的任务,而那些任务使用其他类型的数据库真的是很难完成的。

ZADD 与 SADD 类似,但是在元素之前多了一个参数,这个参数便是用于排序的。形成一个有序的集合。

查看集合 ZRANGE 是查看正序的集合, ZREVRANGE 是查看反序的集合。 0 表示集合第一个元素, -1 表示集合的倒数第一个元素。
使用 WITHSCORES 参数返回记录值。

Redis 常用命令

在Redis中,命令大小写不敏感。

启动 redis 服务和 redis-cli 命令界面
sudo service redis-server start
redis-cli

EXISTS and DEL

EXISTS key 判断一个 key 是否存在;存在返回 1;否则返回0;
DEL key 删除某个 key ,或是一系列 key;
DEL key1 key2 key3 key4。成功返回 1,失败返回 0(key值不存在)。

TYPE and KEYS

TYPE key:返回某个 key 元素的数据类型 ( none:不存在,string:字符,list,set,zset,hash), key 不存在返回空。
KEYS key—pattern: 返回匹配的key列表 (KEYS foo*:查找foo开头的keys)。

RANDOMKEY and CLEAR

RANDOMKEY : 随机获得一个已经存在的 key ,如果当前数据库为空,则返回空字符串。
CLEAR :清除界面。

RENAME and RENAMENX

RENAME oldname newname:改 key 的名字,新键如果存在将被覆盖 。
RENAMENX oldname newname:更改 key 的名字,如果名字存在则更改失败。

DBSIZE

DBSIZE :返回当前数据库的key的总数。

限定 key 生存时间

这同样是一个无视数据类型的命令,对于临时存储很有用处。避免进行大量的DEL操作。

EXPIRE:设置某个key的过期时间(秒),(EXPIRE bruce 1000:设置 bruce 这个 key 1000 秒后系统自动删除)注意:如果在还没有过期的时候,对值进行了改变,那么那个值会被清除。

查询 key 剩余生存时间

限时操作可以再 SET 命令中实现,并且可用 TTL 命令查询 key 剩余生存时间。
TTL:查找某个 key 还有多长时间过期,返回时间秒。

清除 key

FLUSHDB:清空当前数据库中的所有键。

FLUSHALL:清空所有数据库中的所有键。