以下内容主要是摘自网上资料,用于方便自己查阅
一、简介
HackerNews在2012年发布了一份数据库的使用情况调查,结果显示有近12%的公司在使用Redis。国内如新浪微博、街旁和知乎,国外如GitHub、Stack Overflow、Flickr、暴雪和Instagram,都是Redis的用户。
Redis是一个开源的高性能键值对数据库, 在一台普通的笔记本电脑上,Redis可以在一秒内读写超过十万个键值。它通过提供多种键值数据类型来适应不同场景下的存储需求,并借助许多高层级的接口使其可以胜任如缓存、队列系统等不同的角色。
Redis是REmoteDIctionary Server(远程字典服务器)的缩写,它以字典结构存储数据,并允许其他应用通过TCP协议读写字典中的内容。同大多数脚本语言中的字典一样,Redis字典中的键值除了可以是字符串,还可以是其他数据类型。到目前为止Redis支持的键值数据类型如下:
●字符串类型
●散列类型
●列表类型
●集合类型
●有序集合类型
这种字典形式的存储结构与常见的MySQL 等关系数据库的二维表形式的存储结构有很
大的差异。举个例子,如下所示,可以这样存储一篇文章的数据(包括标题、正文、阅读量和标签):
title="Hello World!"
content="Blablabla..."
views=0
tags=["PHP","Ruby","Node.js"]
Redis数据库中的所有数据都存储在内存中,不过Redis提供了对持久化的支持,即将可以内存中的数据异步写入到硬盘中,同时不影响继续提供服务。
Redis可以为每个键设置生存时间(Time ToLive,TTL),生存时间到期后键会自动被删除,这一功能配合出色的性能让Redis可以作为缓存系统来使用。
Redis是单线程模型,但它的性能已经足够优异,在绝大部分场合下其性能都不会成为瓶颈。
Redis提供了一百多个命令(如图1-2所示),听起来很多,但是常用的却只有十几个,并且每个命令都很容易记忆。
二、支持数据类型
redis默认有16个数据库,从0开始递增,与redis连接后默认选择0号数据库,可以随时使用SELECT命令更换数据库,如要选择1号数据库:
redis>SELECT1
OK
redis[1]>GET foo
(nil)
Redis不支持为每个数据库设置不同的访问密码,所以一个客户端要么可以访问全部数据库,要么连一个数据库也没有权限访问。最重要的一点是多个数据库之间并不是完全隔离的,比如FLUSHALL命令可以清空一个Redis实例中所有数据库中的数据。综上所述,这些数据库更像是一种命名空间,而不适宜存储不同应用程序的数据。比如可以使用0号数据库存储某个应用生产环境中的数据,使用1号数据库存储测试环境中的数据,但不适宜使用0号数据库存储A应用的数据而使用1号数据库存储B应用的数据,不同的应用应该使用不同的Redis实例存储数据。由于Redis非常轻量级,一个空Redis实例占用的内存只有1MB左右,所以不用担心多个Redis实例会额外占用很多内存。
●字符串类型
1.赋值与取值
SETkey value
GETkey
SET和GET是Redis中最简单的两个命令,它们实现的功能和编程语言中的读写变量相
似,如key="hello"在Redis中是这样表示的:
redis>SET key hello
OK
2.递增数字
INCR key
字符串类型可以存储任何形式的字符串,当存储的字符串是整数形式时,Redis提供了一个实用的命令INCR,其作用是让当前键值递增,并返回递增后的值,用法为:
redis>INCR num
(integer) 1
redis>INCR num
(integer) 2
相应DECR key是递减命令。
3. 增加指定的整数
INCRBY key increment
redis>INCRBY bar 2
(integer)2
相应DECRBY key decrement减少指定的整数。
4.增加指定浮点数
INCRBYFLOAT key increment
INCRBYFLOAT 命令类似INCRBY命令,差别是前者可以递增一个双精度浮点数,如:
redis>INCRBYFLOAT bar 2.7
"6.7"
5. 向尾部追加值
APPEND key value
APPEND作用是向键值的末尾追加value。如果键不存在则将该键的值设置为value,即相
当于SET key value。返回值是追加后字符串的总长度。例如:
redis>SET key hello
OK
redis>APPEND key " world!"
(integer)12
此时key的值是"hello world!"。APPEND命令的第二个参数加了双引号,原因是该参数包
含空格,在redis-cli中输入需要双引号以示区分。
6.获取字符串长度
STRLEN key
STRLEN命令返回键值的长度,如果键不存在则返回0。例如:
redis>STRLEN key
(integer)12
7.同时获得/设置多个键值
MGET key [key …]
MSET key value [key value …]
MGET/MSET与GET/SET相似,不过MGET/MSET可以同时获得/设置多个键的键值。例
如:
redis>MSET key1 v1 key2 v2 key3 v3
OK
redis>GET key2
"v2"
redis>MGET key1 key3
1)"v1"
2)"v3"
8. 位操作
GETBIT key offset
SETBIT key offset value
BITCOUNT key [start] [end]
BITOP operation destkey key [key …]
一个字节由8个二进制位组成,Redis提供了4个命令可以直接对二进制位进行操作。为了演示,我们首先将foo键赋值为bar:
redis>SET foo bar
OK
bar的3个字母对应的ASCII码分别为98、97和114,转换成二进制后分别为1100010、
1100001和1110010,所以foo键中的二进制位结构如下图所示:
GETBIT命令可以获得一个字符串类型键指定位置的二进制位的值(0或1),索引从0开始:
redis>GETBIT foo 0
(integer)0
redis>GETBIT foo 6
(integer)1
SETBIT 命令可以设置字符串类型键指定位置的二进制位的值,返回值是该位置的旧值。如我们要将foo键值设置为aar,可以通过位操作将foo键的二进制位的索引第6位设为0,第7位设为1:
redis>SETBIT foo 6 0
(integer)1
redis>SETBIT foo 7 1
(integer)0
redis>GET foo
"aar"
如果要设置的位置超过了键值的二进制位的长度,SETBIT命令会自动将中间的二进制位
设置为0,同理设置一个不存在的键的指定二进制位的值会自动将其前面的位赋值为0:
redis>SETBIT nofoo 10 1
(integer)0
redis>GETBIT nofoo 5
(integer)0
BITCOUNT命令可以获得字符串类型键中值是1的二进制位个数,例如:
redis>BITCOUNT foo
(integer)10
可以通过参数来限制统计的字节范围,如我们只希望统计前两个字节(即"aa"):
redis>BITCOUNT foo 0 1</