继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

redis入门:介绍、特点、安装、各类型常用操作

atwal
关注TA
已关注
手记 16
粉丝 24
获赞 2402
一、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中使用等等,这些内容留在下次再分享吧:)

打开App,阅读手记
49人推荐
发表评论
随时随地看视频慕课网APP

热门评论

类似ps -aux grep redis这样的grep前面应该有|符号

不错,谢谢分享。。。。。

血的经验和教训,一定要禁用远程端口连接,要设置密码。不要问我被勒索了几个比特币

查看全部评论