Redis
Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合,位图,hyperloglogs等数据类型。内置复制、Lua脚本、LRU收回、事务以及不同级别磁盘持久化功能,同时通过Redis Sentinel提供高可用,通过Redis Cluster提供自动分区。
优势
Redis特点
- Redis是完全在内存中保存数据的数据库,使用磁盘只是为了持久性目的;
- Redis相比许多键值数据存储系统有相对丰富的数据类型;
- Redis可以将数据复制到任意数量的从服务器中;
Redis优势
异常快速 : Redis是非常快的,每秒可以执行大约110000设置操作,81000个/每秒的读取操作。
支持丰富的数据类型 : Redis支持最大多数开发人员已经知道如列表,集合,可排序集合,哈希等数据类型。
这使得在应用中很容易解决的各种问题,因为我们知道哪些问题处理使用哪种数据类型更好解决。
操作都是原子的 : 所有 Redis 的操作都是原子,从而确保当两个客户同时访问 Redis 服务器得到的是更新后的值(最新值)。
MultiUtility工具:Redis是一个多功能实用工具,可以在很多如:缓存,消息传递队列中使用(Redis原生支持发布/订阅),在应用程序中,如:Web应用程序会话,网站页面点击数等任何短暂的数据;
Redis环境
安装
Centos/Redhat
1 2 3 4 5 6
| $ wget http://download.redis.io/releases/redis-2.8.17.tar.gz $ tar xzf redis-2.8.17.tar.gz $ cd redis-2.8.17 $ make $ cp redis-server /usr/local/bin/ $cp redis-cli /usr/local/bin/
|
Ubuntu
1 2
| sudo apt-get update sudo apt-get install redis-server
|
使用
启动redis
redis-server
使用
redis-cli
redis 127.0.0.1:6379>
1 2
| redis 127.0.0.1:6379> ping PONG
|
Redis数据类型
Redis 支持5种数据类型,说明如下:
字符串
Redis 字符串是一个字节序列。在 Redis 中字符串是二进制安全的,这意味着它们没有任何特殊终端字符来确定长度,所以可以存储任何长度为 512 兆的字符串。
示例
1 2 3 4
| redis 127.0.0.1:6379> SET name "yiibai" OK redis 127.0.0.1:6379> GET name "yiibai"
|
在上面的例子中,SET 和 GET 是 Redis 命令,name 和 “yiibai” 是存储在 Redis 的键和字符串值。
哈希
Redis哈希是键值对的集合。 Redis哈希是字符串字段和字符串值之间的映射,所以它们用来表示对象。
示例
1 2 3 4 5 6 7 8 9
| redis 127.0.0.1:6379> HMSET user:1 username yiibai password yiibai points 200 OK redis 127.0.0.1:6379> HGETALL user:1 1) "username" 2) "yiibai" 3) "password" 4) "yiibai" 5) "points" 6) "200"
|
在上面的例子中,哈希数据类型用于存储包含用户基本信息的用户对象。这里 HSET,HEXTALL 是 Redis 命令同时 user:1 也是一个键。
列表
Redis 列表是简单的字符串列表,通过插入顺序排序。可以添加一个元素到 Redis 列表的头部或尾部。
示例
1 2 3 4 5 6 7 8 9 10 11
| redis 127.0.0.1:6379> lpush tutoriallist redis (integer) 1 redis 127.0.0.1:6379> lpush tutoriallist mongodb (integer) 2 redis 127.0.0.1:6379> lpush tutoriallist rabitmq (integer) 3 redis 127.0.0.1:6379> lrange tutoriallist 0 10 1) "rabitmq" 2) "mongodb" 3) "redis"
|
列表的最大长度为 232 - 1 个元素(4294967295,每个列表的元素超过四十亿)。
集合
Redis 集合是字符串的无序集合。在 Redis 可以添加,删除和测试成员存在的时间复杂度为 O(1)。
示例
1 2 3 4 5 6 7 8 9
| redis 127.0.0.1:6379> sadd tutoriallist redis (integer) 1 redis 127.0.0.1:6379> sadd tutoriallist mongodb (integer) 1 redis 127.0.0.1:6379> sadd tutoriallist redis (integer) 1 127.0.0.1:6379> smembers tutoriallist 1) "mongodb" 2) "redis"
|
在上面的例子中 redis 被添加两次,但由于它是只集合具有唯一特性。集合中的成员最大数量为 232 - 1(4294967295,每个集合有超过四十亿条记录)。
不同的是,一个有序集合的每个成员都可以排序,就是为了按有序集合排序获取它们,按权重分值从最小到最大排序。虽然成员都是独一无二的,按权重分数值可能会重复。
示例
1 2 3 4 5 6 7 8 9 10 11 12 13
| redis 127.0.0.1:6379> zadd tutoriallist 0 redis (integer) 1 redis 127.0.0.1:6379> zadd tutoriallist 0 mongodb (integer) 1 redis 127.0.0.1:6379> zadd tutoriallist 0 rabitmq (integer) 1 redis 127.0.0.1:6379> zadd tutoriallist 0 rabitmq (integer) 0 redis 127.0.0.1:6379> ZRANGEBYSCORE tutoriallist 0 1000 1) "redis" 2) "mongodb" 3) "rabitmq"
|
Redis键
Redis 中的 keys 命令用于管理 redis 中的键。Redis keys命令使用的语法如下所示:
1 2 3 4 5 6 7 8
| 语法 redis 127.0.0.1:6379> COMMAND KEY_NAME 示例 redis 127.0.0.1:6379> SET yiibai redis OK redis 127.0.0.1:6379> DEL yiibai (integer) 1 在上面的例子中 DEL 是一个命令,而 yiibai 是一个键。如果键被成功删除,则该命令的输出将是(整数)1,否则这将是(整数)0;
|
Redis字符串
1 2 3 4 5 6 7 8 9
| Redis 的字符串命令用于管理 redis 的字符串值。Redis 的字符串命令语法的使用如下所示: 语法 redis 127.0.0.1:6379> COMMAND KEY_NAME 示例 redis 127.0.0.1:6379> SET yiibai redis OK redis 127.0.0.1:6379> GET yiibai "redis" 在上面示例中 SET 和 GET 是 Redis 的命令,这里 yiibai 就是一个键(key);
|
Redis哈希
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| Redis哈希是字符串字段和字符串值之间的映射,所以它是用来表示对象的一个完美的数据类型,Redis 的哈希值最多可存储超过4十亿字段-值对。 示例 redis 127.0.0.1:6379> HMSET yiibai name "redis tutorial" description "redis basic commands for caching" likes 20 visitors 23000 OK redis 127.0.0.1:6379> HGETALL yiibai 1) "name" 2) "redis tutorial" 3) "description" 4) "redis basic commands for caching" 5) "likes" 6) "20" 7) "visitors" 8) "23000" 在上面的例子,我们在设置一个名为 yiibai Redis的哈希的教程详细信息(name, description, likes, visitors)。
|
Redis列表
Redis列表是简单的字符串列表,通过插入顺序排序。您可以在Redis 列表的头或列表尾添加元素。列表的最大长度为 232 - 1 个元素(4294967295,每个列表可有超过四十亿个元素)。
示例
1 2 3 4 5 6 7 8 9 10 11
| redis 127.0.0.1:6379> LPUSH tutorials redis (integer) 1 redis 127.0.0.1:6379> LPUSH tutorials mongodb (integer) 2 redis 127.0.0.1:6379> LPUSH tutorials mysql (integer) 3 redis 127.0.0.1:6379> LRANGE tutorials 0 10 1) "mysql" 2) "mongodb" 3) "redis"
|
在上面的例子中的三个值由命令LPUSH 插入到 redis 名称为 tutorials 的列表。
Redis集合
Redis集合是唯一字符串的无序集合。唯一集合是不允许数据有重复的键的。在 Redis 集合中添加,删除和测试成会是否存的时间复杂度为O(1)(恒定的时间,无论集合内包含元素的数量)。集合的最大长度为 232 - 1 个元素(4294967295,每个集合中超过四十亿个元素)。
示例
1 2 3 4 5 6 7 8 9 10 11 12 13
| redis 127.0.0.1:6379> SADD yiibai redis (integer) 1 redis 127.0.0.1:6379> SADD yiibai mongodb (integer) 1 redis 127.0.0.1:6379> SADD yiibai mysql (integer) 1 redis 127.0.0.1:6379> SADD yiibai mysql (integer) 0 redis 127.0.0.1:6379> SMEMBERS yiibai 1) "mysql" 2) "mongodb" 3) "redis"
|
在上面的例子中的三个值被 Redis 的命令SADD插入到一个名为 yiibai 集合。
Redis有序集合
Redis的有序集合类似于 Redis 的集合,但是存储的值在集合中具有唯一性。另外有序集合的每个成员都使用分值(score)的东西,这个分值就是用于将有序集合排序,从分值最小到最大来排序。
在 Redis 有序集合添加,删除和测试成员的存在的时间复杂度为 O(1)(恒定时间,无论集合内包含元素的数量)。列表的最大长度为 232 - 1 个元素(4294967295,每个集合的元素超过四十亿)。
示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| redis 127.0.0.1:6379> ZADD yiibai 1 redis (integer) 1 redis 127.0.0.1:6379> ZADD yiibai 2 mongodb (integer) 1 redis 127.0.0.1:6379> ZADD yiibai 3 mysql (integer) 1 redis 127.0.0.1:6379> ZADD yiibai 3 mysql (integer) 0 redis 127.0.0.1:6379> ZADD yiibai 4 mysql (integer) 0 redis 127.0.0.1:6379> ZRANGE yiibai 0 10 WITHSCORES 1) "redis" 2) "1" 3) "mongodb" 4) "2" 5) "mysql" 6) "4"
|
Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。
在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。
示例
下面的例子说明了 HyperLogLog Redis 的工作原理:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| redis 127.0.0.1:6379> PFADD tutorials "redis" 1) (integer) 1 redis 127.0.0.1:6379> PFADD tutorials "mongodb" 1) (integer) 1 redis 127.0.0.1:6379> PFADD tutorials "mysql" 1) (integer) 1 redis 127.0.0.1:6379> PFCOUNT tutorials (integer) 3
|