Redis介绍
Redis是当前比较热门的NOSQL系统之一,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
Redis特点
速度快
代码语言:javascript复制Redis所有的数据都存放在内存中;
Redis使用C语言实现;
Redis使用单线程架构;
Redis读取的速度是110000次/s,写的速度是81000次/s。
基于键值对的数据结构服务器
代码语言:javascript复制支持多种数据结构:string(字符串);list(列表);hash(哈希),set(集合);zset(有序集合)
丰富的功能
代码语言:javascript复制提供了键过期功能,可以实现缓存;
提供了发布订阅功能,可以实现消息系统;
提供了pipeline功能,客户端可以将一批命令一次性传到Redis,减少了网络开销。
客户端语言多
代码语言:javascript复制java,PHP,python,C,C ,Nodejs等
持久化,主从复制(集群)
代码语言:javascript复制RDB和AOF
Redis应用场景
缓存-键过期时间
代码语言:javascript复制缓存session会话
缓存用户信息,找不到再去mysql查,查到然后回写到redis
排行榜-列表&有序集合
代码语言:javascript复制热度排名排行榜
发布时间排行榜
计数器应用-天然支持计数器
代码语言:javascript复制帖子浏览数
视频播放次数
商品浏览数
社交网络-集合
代码语言:javascript复制踩/赞,粉丝,共同好友/喜好,推送,打标签
安装部署Redis
环境准备
代码语言:javascript复制### 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
代码语言:javascript复制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
配置文件说明
代码语言:javascript复制### 以守护进程模式启动
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
服务启动
启动
代码语言:javascript复制[root@redis01 ~]# redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf
关闭
代码语言:javascript复制[root@redis01 ~]# redis-cli shutdown
Redis基本操作命令
全局命令
Redis有5种数据结构,他们是键值对中的值,对于键来说有一些通用的命令. 1.查看所有命键
代码语言:javascript复制Keys *
十分危险的命令,线上禁止使用
2.查看键的总数
代码语言:javascript复制Dbsize
# dbsize 命令在计算键总数时不会遍历所有键,而是直接获取Redis内置的键总数变量.
3.检查键是否存在
代码语言:javascript复制Exists key
# 如果键存在则返回1,不存在则返回0
4.删除键
代码语言:javascript复制Del key [key …]
通用命令,无论值是什么数据结构类型,del命令都可以将其删除.
5.键过期
代码语言:javascript复制Expire key seconds
# Redis支持对键添加过期时间,当超过过期时间后,会自动删除键.
# 通过ttl命令观察键的剩余时间
大于等于0的证书: 键剩余过期时间
-1: 键没设置过期时间
-2: 键不存在
6.键的数据类型
代码语言:javascript复制type key
字符串
Redis并不是简单地key-value存储,实际上他是一个数据结构服务器,支持不同类型的值. Redis Strings 这是最简单的Redis类型,如果你只用这种类型,Redis就像一个持久化的memcache服务器(注:memcache的数据仅保存在内存中,服务器重启后,数据将丢失.) 操作命令: 通常用SET command 和 GET command来设置和获取字符串值 实例:
代码语言:javascript复制redis01:6379> set key1 value1
OK
redis01:6379> get key1
"value1"
redis01:6379> keys *1) "key1"
INCR命令将字符串值解析成整型.将其加1,最后结果保存为新的字符串,类似命令: INCRBY,DECR,DECRBY 实例:
代码语言:javascript复制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对应的值。
实例:
代码语言:javascript复制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对应的值不存在)。
实例:
代码语言:javascript复制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对应的存储类型 实例:
代码语言:javascript复制redis01:6379> set key5 v5
OK
redis01:6379> type key5
string
可以对key设置一个超时时间,当这个时间到达后被删除
实例:
代码语言:javascript复制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命令去除超时时间。 实例:
代码语言:javascript复制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中取出一定范围的元素。 实例:
代码语言:javascript复制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从列表中元素右边开始依次删除。
实例:
代码语言:javascript复制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取回一系列的值。 实例:
代码语言:javascript复制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中。 实例:
代码语言:javascript复制redis01:6379> sadd set1 1 2 3
(integer) 3
redis01:6379> smembers set1
1) "1"
2) "2"
3) "3"
和list类型不同,set集合不允许出现重复的元素
代码语言:javascript复制redis01:6379> sadd set1 1 4
(integer) 1
redis01:6379> smembers set1
1) "1"
2) "2"
3) "3"
4) "4"
Srem用来删除指定的值
代码语言:javascript复制redis01:6379> srem set1 2 4
(integer) 2
redis01:6379> smembers set1
1) "1"
2) "3"
Sdiff计算集合的差异成员
代码语言:javascript复制redis01:6379> sinter set1 set2
1) "1"
2) "4"
Sunion计算集合并集
代码语言:javascript复制redis01:6379> sunion set1 set2
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"