一、redis介绍##
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。
Redis支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) , bitmaps(一串连续的2进制数字), hyperloglogs (一个概率统计的数据结构,可以被用来估计一个集合的基数)和 地理空间(geospatial) 索引半径查询。
Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。
二、redis特点##
通过上面的介绍可以看到,Redis有以下特点:
1、支持丰富的数据结构和命令
2、支持数据持久化(硬盘上)
3、支持事务
4、值最大可到512M
5、支持集群部署(3.0开始自带)
三、ubuntu下安装##
由于 redis 主要用来作服务器上的缓存和消息队列,主要也是针对linux系统开发的,所以这里也只介绍如何在linux系统(本文用的是ubuntu环境)下安装(windows系统上也是可以安装的,可自行google)
# apt-get install redis-server
安装完成后,redis会自动启动,我们可以通过下面的命令查看:
# ps -aux grep redis
root 2846 0.0 0.0 11740 936 pts/0 S+ 00:59 0:00 grep --color=auto redis
redis 17170 0.0 0.3 39844 7184 ? Ssl Jun12 15:31 /usr/bin/redis-server 127.0.0.1:6379
还可以通过netstat查看6379(redis默认端口)端口监听情况:
# netstat -nlt grep 6379
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN
通过以上命令我们可以看到redis已经正确实装并启用了。
安装了redis服务端后,会自带安装一个命令行客户端程序 redis-cli,直接输入 redis-cli就可以启动:
# redis-cli
127.0.0.1:6379>
以下内容中的代码部分就可以在这里验证。
四、各类型常用操作##
1、String类型常用操作
Strings 数据结构是简单的key-value类型,value其实不仅是String,也可以是数字,常用的命令有:
- set:新增或修改记录
- get:查看获取(打印)记录
- decr:原子递减(此时value为数字)
- incr:原子递增(此时value为数字)
- mset:批量写入
- mget:批量读取
部分命令演示:
# redis-cli
//新增记录
127.0.0.1:6379> set name imooc
OK
//读取记录
127.0.0.1:6379> get name
"imooc"
//修改记录
127.0.0.1:6379> set name imooc2
OK
127.0.0.1:6379> get name
"imooc2"
//value也可以是数字
127.0.0.1:6379> set age 20
OK
127.0.0.1:6379> get age
"20"
//原子递减
127.0.0.1:6379> decr age
(integer) 19
//原子递增
127.0.0.1:6379> incr age
(integer) 20
//批量新增
127.0.0.1:6379> mset sex man city wuhan
OK
//批量读取
127.0.0.1:6379> mget sex city
1) "man"
2) "wuhan"
2、hash类型常用操作
Redis的Hash实际是内部存储的Value为一个HashMap,并提供了直接存取这个Map成员的接口,常用的命令有:
- hset key field value:将哈希表 key 中的字段 field 的值设为 value
- hget key field:获取存储在哈希表中指定字段的值
- hdel key field2 [field2]:删除一个或多个哈希表字段
- hkeys key:获取所有哈希表中的字段
- hvals key:获取哈希表中所有值
- hexists key field:查看哈希表 key 中,指定的字段是否存在
- hgetall key:获取在哈希表中指定 key 的所有字段和值
- hlen key:获取哈希表中字段的数量
- hmset key field1 value1 [field2 value2 ]:同时将多个 field-value (域-值)对设置到哈希表 key 中
- hmget key field1 [field2]:获取所有给定字段的值
部分命令演示:
//新增HASH
127.0.0.1:6379> hset user1 name atwal
(integer) 0
//获取HASH值
127.0.0.1:6379> hget user1 name
"atwal"
//增加HASH值
127.0.0.1:6379> hset user1 city wuhan
(integer) 1
//批量增加HASH值
127.0.0.1:6379> hmset user1 work coder language php
OK
//获取所有HASH字段和值
127.0.0.1:6379> hgetall user1
1) "name"
2) "atwal"
3) "city"
4) "wuhan"
5) "work"
6) "coder"
7) "language"
8) "php"
//删除某个字段
127.0.0.1:6379> hdel user1 language
(integer) 1
127.0.0.1:6379> hgetall user1
1) "name"
2) "atwal"
3) "city"
4) "wuhan"
5) "work"
6) "coder"
3、list类型常用操作
Redis list的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,常用命令:
- lpop key:移出并获取列表的第一个元素
- lpush key value1 [value2]:将一个或多个值插入到列表头部
- lpushx key value:将值value插入到列表key的表头,当且仅当key存在并且是一个列表
- rpop key:移除并获取列表最后一个元素
- rpush key value1 [value2]:在列表中添加一个或多个值
- rpushx key value:为已存在的列表添加值
- lrange key start stop:获取列表指定范围内的元素,lrange key 0 -1 表示输出所有元素
- lrem key count value:根据参数count的值(count > 0:从表头向表尾搜索,数量为count,count < 0从表尾向表头搜索,数量为count的绝对值,count = 0 移除表中所有与value相等的值),移除列表中与参数value相等的元素
- lset key index value:通过索引设置列表元素的值
- lindex key index:通过索引获取列表中的元素
- llen key:获取列表长度
部分命令演示:
//加个多个元素到列表msg
127.0.0.1:6379> lpush msg m i d e h k
(integer) 6
//向列表头部添加a元素
127.0.0.1:6379> lpushx msg a
(integer) 7
//输出列表
127.0.0.1:6379> lrange msg 0 -1
1) "a"
2) "k"
3) "h"
4) "e"
5) "d"
6) "i"
7) "m"
//移除列表第一个元素
127.0.0.1:6379> lpop msg
"a"
127.0.0.1:6379> lrange msg 0 -1
1) "k"
2) "h"
3) "e"
4) "d"
5) "i"
6) "m"
//移除列表最后一个元素
127.0.0.1:6379> rpop msg
"m"
//向列表尾部添加rm元素
127.0.0.1:6379> rpush msg rm
(integer) 6
127.0.0.1:6379> lrange msg 0 -1
1) "k"
2) "h"
3) "e"
4) "d"
5) "i"
6) "rm"
//删除值为d的元素
127.0.0.1:6379> lrem msg 0 d
(integer) 1
127.0.0.1:6379> lrange msg 0 -1
1) "k"
2) "h"
3) "e"
4) "i"
5) "rm"
//修改第二个元素为hello
127.0.0.1:6379> lset msg 1 hello
OK
127.0.0.1:6379> lrange msg 0 -1
1) "k"
2) "hello"
3) "e"
4) "i"
5) "rm"
//获取第二个位置元素值
127.0.0.1:6379> lindex msg 1
"hello"
//获取列表元素个数
127.0.0.1:6379> llen msg
(integer) 5
4、set类型常用操作
Set是string类型的无序集合。集合成员是唯一的。常用命令:
- sadd key member1 [member2]:向集合添加一个或多个成员
- sdiff key1 [key2]:返回给定所有集合的差集
- sdiffstore destination key1 [key2]:返回给定所有集合的差集并存储在 destination 中
- sinter key1 [key2]:返回给定所有集合的交集
- sinterstore destination key1 [key2]:返回给定所有集合的交集并存储在 destination 中
- sunion key1 [key2]:返回所有给定集合的并集
- sunionstore destination key1 [key2]:所有给定集合的并集存储在 destination 集合中
- smove source destination member:将 member 元素从 source 集合移动到 destination 集合
- spop key:移除并返回集合中的一个随机元素
- srandmember key [count]:返回集合中一个或多个随机数
- srem key member1 [member2]:移除集合中一个或多个成员
- smembers key:返回集合中的所有成员
- sismember key member:判断 member 元素是否是集合 key 的成员
- scard key:获取集合的成员数
部分命令演示:
//添加a b c d到follow集合中
127.0.0.1:6379> sadd follow a b c d
(integer) 4
//添加c d e f到fans集合中
127.0.0.1:6379> sadd fans c d e f
(integer) 4
//计算follow集合与fans集合的差集
127.0.0.1:6379> sdiff follow fans
1) "a"
2) "b"
//计算follow集合与fans集合的交集
127.0.0.1:6379> sinter follow fans
1) "d"
2) "c"
//计算follow集合与fans集合的并集
127.0.0.1:6379> sunion follow fans
1) "f"
2) "d"
3) "b"
4) "a"
5) "e"
6) "c"
//从follow集合中随机删除一个元素
127.0.0.1:6379> spop follow
"a"
//从follow集合中随机删除一个元素
127.0.0.1:6379> spop follow
"b"
//follow集合的所有元素
127.0.0.1:6379> smembers follow
1) "d"
2) "c"
//fans集合的所有元素
127.0.0.1:6379> smembers fans
1) "e"
2) "f"
3) "d"
4) "c"
5、Sorted Set类型常用操作
Sorted Set和Set一样也是string类型元素的集合,且不允许重复的成员。不同的是Sorted Set每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。常用命令:
- zadd key score1 member1 [score2 member2]:向有序集合添加一个或多个成员,或者更新已存在成员的分数
- zcard key:获取有序集合的成员数
- zcount key min max:计算在有序集合中指定区间分数的成员数
- zrange key start stop [withscores]:通过索引区间返回有序集合成指定区间内的成员
- zremrange key start stop [withscores]:返回有序集中指定区间内的成员,通过索引,分数从高到底
- zrangebyscore key min max [withscores] [limit]:通过分数返回有序集合指定区间内的成员
- zremrangebyscore key min max:移除有序集合中给定的分数区间的所有成员
- zrank key member:返回有序集合中指定成员的索引
- zrevrank key member:返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序
- zrem key member [member ...]:移除有序集合中的一个或多个成员
- zremrangebyrank key start stop:移除有序集合中给定的排名区间的所有成员
- zrevrangebyscore key max min [withscores]:返回有序集中指定分数区间内的成员,分数从高到低排序
- zscore key member:返回有序集中,成员的分数值
部分命令演示:
//创建有序列表score
127.0.0.1:6379> zadd score 90 jim 95 lily
(integer) 2
//获取成员数
127.0.0.1:6379> zcard score
(integer) 2
//获取 0 到 100 分之间的元素个数
127.0.0.1:6379> zcount score 0 100
(integer) 2
//获取lily索引
127.0.0.1:6379> zrank score lily
(integer) 1
//获取jim分数
127.0.0.1:6379> zscore score jim
"90"
//获取索引0 1之间的带分数元素
127.0.0.1:6379> zrange score 0 1 withscores
1) "jim"
2) "90"
3) "lily"
4) "95"
6、Pub/Sub类型常用操作
Pub/Sub(发布/订阅)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息,可用于实时消息系统。常用命令:
- subscribe channel [channel ...]:订阅给定的一个或多个频道的信息。
- unsubscribe [channel [channel ...]]:指退订给定的频道。
- publish channel message:将信息发送到指定的频道。
- pubsub subcommand [argument [argument ...]]:查看订阅与发布系统状态。
命令演示:
//先在终端1上订阅频道im
127.0.0.1:6379> subscribe im
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "im"
3) (integer) 1
//在终端2上im频道上发布消息
# redis-cli
127.0.0.1:6379> publish im hello
(integer) 1
127.0.0.1:6379> publish im hi
(integer) 1
//终端1上显示收到的消息
1) "message"
2) "im"
3) "hello"
1) "message"
2) "im"
3) "hi"
7、Transactions事务
Transactions可以一次执行多个命令, 并且带有以下两个重要的保证:
- 事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
- 事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。
一个事务从开始到执行会经历以下三个阶段:
- 开始事务。
- 命令入队。
- 执行事务。
常用命令:
- multi:标记一个事务块的开始。
- exec:执行所有事务块内的命令。
- discard:取消事务,放弃执行事务块内的所有命令。
- watch key [key ...]:监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。
- unwatch:取消 WATCH 命令对所有 key 的监视。
命令演示:
//开始一个事务
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set name imooc
QUEUED
127.0.0.1:6379> set age 20
QUEUED
127.0.0.1:6379> incr age
QUEUED
127.0.0.1:6379> incr age
QUEUED
127.0.0.1:6379> hmset user1 name atwal city wuhan
QUEUED
//执行上面事务块内的所有命令
127.0.0.1:6379> exec
1) OK
2) OK
3) (integer) 21
4) (integer) 22
5) OK
以上只是redis的基本用法,redis还有很多高级用法,如数据的备份恢复,安全,在PHP中使用等等,这些内容留在下次再分享吧:)