Redis入门教程

Redis介绍

Redis是当前比较热门的NOSQL系统之一,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

Redis特点

速度快

1
2
3
4
Redis所有的数据都存放在内存中;
Redis使用C语言实现;
Redis使用单线程架构;
Redis读取的速度是110000次/s,写的速度是81000次/s。

基于键值对的数据结构服务器

1
支持多种数据结构:string(字符串);list(列表);hash(哈希),set(集合);zset(有序集合)

丰富的功能

1
2
3
提供了键过期功能,可以实现缓存;
提供了发布订阅功能,可以实现消息系统;
提供了pipeline功能,客户端可以将一批命令一次性传到Redis,减少了网络开销。

客户端语言多

1
java,PHP,python,C,C++,Nodejs等

持久化,主从复制(集群)

1
RDB和AOF

Redis应用场景

缓存-键过期时间

1
2
缓存session会话
缓存用户信息,找不到再去mysql查,查到然后回写到redis

排行榜-列表&有序集合

1
2
热度排名排行榜
发布时间排行榜

计数器应用-天然支持计数器

1
2
3
帖子浏览数
视频播放次数
商品浏览数

社交网络-集合

1
踩/赞,粉丝,共同好友/喜好,推送,打标签

安装部署Redis

环境准备

1
2
3
4
5
6
7
8
### redis下载目录
/server/tools
### redis安装目录
/opt/redis_cluster/redis_{PORT}/{conf,logs,pid}
### redis数据目录
/data/redis_cluster/redis_{PORT}/redis_{PORT}.rdb
### redis运维脚本
/server/scripts/redis_shell.sh

安装Redis

1
2
3
4
5
6
7
8
9
10
mkdir /server/tools
mkdir -p /data/redis_cluster/redis_6379
mkdir -p /opt/redis_cluster/redis_6379/{conf,pid,logs}
cd /server/tools

wget http://download.redis.io/releases/redis-3.2.9.tar.gz
tar zxf redis-3.2.9.tar.gz -C /opt/redis_cluster/
ln -s /opt/redis_cluster/redis-3.2.9/ /opt/redis_cluster/redis
cd /opt/redis_cluster/redis
make && make install

配置文件说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
### 以守护进程模式启动
daemonize yes
### 绑定的主机地址
bind 100.1.1.11 127.0.0.1
### 监听端口
port 6379
### pid文件和log文件的保存地址
pidfile /opt/redis_cluster/redis_6379/pid/redis_6379.pid
logfile /opt/redis_cluster/redis_6379/logs/redis_6379.log
### 设置数据库的数量,默认数据库为0
databases 16
### 指定本地持久化文件的文件名,默认是dump.rdb
dbfilename redis_6379.rdb
### 本地数据库的目录
dir /data/redis_cluster/redis_6379

服务启动

启动

1
[root@redis01 ~]# redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf

关闭

1
[root@redis01 ~]# redis-cli  shutdown

Redis基本操作命令

全局命令

Redis有5种数据结构,他们是键值对中的值,对于键来说有一些通用的命令.
1.查看所有命键

1
Keys *  

十分危险的命令,线上禁止使用
2.查看键的总数

1
2
Dbsize
# dbsize 命令在计算键总数时不会遍历所有键,而是直接获取Redis内置的键总数变量.

3.检查键是否存在

1
2
Exists key
# 如果键存在则返回1,不存在则返回0

4.删除键

1
Del key [key …]

通用命令,无论值是什么数据结构类型,del命令都可以将其删除.
5.键过期

1
2
3
4
5
6
Expire key seconds
# Redis支持对键添加过期时间,当超过过期时间后,会自动删除键.
# 通过ttl命令观察键的剩余时间
大于等于0的证书: 键剩余过期时间
-1: 键没设置过期时间
-2: 键不存在

6.键的数据类型

1
type key

字符串

Redis并不是简单地key-value存储,实际上他是一个数据结构服务器,支持不同类型的值.
Redis Strings
这是最简单的Redis类型,如果你只用这种类型,Redis就像一个持久化的memcache服务器(注:memcache的数据仅保存在内存中,服务器重启后,数据将丢失.)
操作命令:
通常用SET command 和 GET command来设置和获取字符串值
实例:

1
2
3
4
5
redis01:6379> set key1 value1
OK
redis01:6379> get key1
"value1"
redis01:6379> keys *1) "key1"

INCR命令将字符串值解析成整型.将其加1,最后结果保存为新的字符串,类似命令: INCRBY,DECR,DECRBY
实例:

1
2
3
4
5
6
7
8
9
10
11
12
redis01:6379> set key2 100
OK
redis01:6379> get key2
"100"
redis01:6379> incr key2
(integer) 101
redis01:6379> get key2
"101"
redis01:6379> incrby key2 10
(integer) 111
redis01:6379> get key2
"111"

MSET和MGET可以一次存储或获取多个key对应的值。
实例:

1
2
3
4
5
6
redis01:6379> mset key3 v3 key4 v4 key5 v5
OK
redis01:6379> mget key3 key4 key5
1) "v3"
2) "v4"
3) "v5"

EXISTS命令返回1或0标识给定key的值是否存在.使用DEL命令可以删除key对应的值,DEL命令返回1或0标识是被删除(值存在)或者没被删除(key对应的值不存在)。
实例:

1
2
3
4
5
6
7
8
redis01:6379> exists key5
(integer) 1
redis01:6379> del key5
(integer) 1
redis01:6379> exists key5
(integer) 0
redis01:6379> del key5
(integer) 0

Type命令可以返回key对应的存储类型
实例:

1
2
3
4
redis01:6379> set key5 v5
OK
redis01:6379> type key5
string

可以对key设置一个超时时间,当这个时间到达后被删除
实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
redis01:6379> get key5
"v5"redis01:6379> ttl key5
(integer) -1
redis01:6379> expire key5 10
(integer) 1
redis01:6379> ttl key5
(integer) 6
redis01:6379> ttl key5
(integer) 5
redis01:6379> ttl key5
(integer) 2
redis01:6379> ttl key5
(integer) -2
redis01:6379> ttl key5
(integer) -2
redis01:6379> get key5
(nil)

PERSIST命令去除超时时间。
实例:

1
2
3
4
5
6
7
8
9
10
redis01:6379> set key5 v5 ex 10
OK
redis01:6379> ttl key5
(integer) 8
redis01:6379> ttl key5
(integer) 6
redis01:6379> persist key5
(integer) 1
redis01:6379> ttl key5
(integer) -1

列表

LPUSH命令可向list的左边(头部)添加一个新元素;
RPUSH命令可向list的右边(尾部)添加一个新元素;
LRANGE可以从list中取出一定范围的元素。
实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
redis01:6379> rpush list1 A
(integer) 1
redis01:6379> rpush list1 B
(integer) 2
redis01:6379> lpush list1 top1
(integer) 3
redis01:6379> lrange list1 0 -1
1) "top1"
2) "A"
3) "B"
redis01:6379> lrange list1 1 -1
1) "A"
2) "B"
redis01:6379> lrange list1 2 -1
1) "B"

rpop从列表中元素左边开始依次删除;
lpop从列表中元素右边开始依次删除。
实例:

1
2
3
4
5
6
7
8
9
redis01:6379> rpop list1
"B"
redis01:6379> lrange list1 0 -1
1) "top1"
2) "A"
redis01:6379> lpop list1
"top1"
redis01:6379> lrange list1 0 -1
1) "A"

哈希

Hash看起来就像一个’hash’的样子,由键值对组成
HMSET指令设置hash中的多个域;
HGET取回单个域;
HMGET取回一系列的值。
实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
redis01:6379> hmset user:1000 username linuxboy age 18 job it
OK
redis01:6379> hget user:1000 username
"linuxboy"
redis01:6379> hmget user:1000 username age job
1) "linuxboy"
2) "18"
3) "it"
redis01:6379> hgetall user:1000
1) "username"
2) "linuxboy"
3) "age"
4) "18"
5) "job"
6) "it"
redis01:6379> hmset user:1000 qq 1767361332
OK
redis01:6379> hgetall user:1000
1) "username"
2) "linuxboy"
3) "age"
4) "18"
5) "job"
6) "it"
7) "qq"
8) "1767361332"

集合

集合是字符串的无序排列;
SADD指令把新的元素添加到set中。
实例:

1
2
3
4
5
6
redis01:6379> sadd set1 1 2 3
(integer) 3
redis01:6379> smembers set1
1) "1"
2) "2"
3) "3"

和list类型不同,set集合不允许出现重复的元素

1
2
3
4
5
6
7
redis01:6379> sadd set1 1 4
(integer) 1
redis01:6379> smembers set1
1) "1"
2) "2"
3) "3"
4) "4"

Srem用来删除指定的值

1
2
3
4
5
redis01:6379> srem set1 2 4
(integer) 2
redis01:6379> smembers set1
1) "1"
2) "3"

Sdiff计算集合的差异成员

1
2
3
redis01:6379> sinter set1 set2
1) "1"
2) "4"

Sunion计算集合并集

1
2
3
4
5
6
redis01:6379> sunion set1 set2
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"